Создайте кросс-браузерный mixin для преобразования: повернуть
Я хочу создать mixin для sass, который применит поворот к указанному элементу. Микшин должен принимать один параметр, чтобы применить число степеней вращения.
Из css3please.com я нашел кросс-браузерный способ реализовать это с помощью CSS:
.box_rotate {
-moz-transform: rotate(7.5deg); /* FF3.5+ */
-o-transform: rotate(7.5deg); /* Opera 10.5 */
-webkit-transform: rotate(7.5deg); /* Saf3.1+, Chrome */
-ms-transform: rotate(7.5deg); /* IE9 */
transform: rotate(7.5deg);
filter: progid:DXImageTransform.Microsoft.Matrix(/* IE6–IE9 */
M11=0.9914448613738104, M12=-0.13052619222005157,M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand');
zoom: 1;
}
Все это очень просто сделать для микширования, за исключением примечательной нотации IE. Есть ли у кого-нибудь предложения относительно способа преобразования степеней в преобразование матрицы IE с использованием sass, javascript или комбо обоих?
Ответы
Ответ 1
Эта функция позволяет преобразовать градусы в преобразование матрицы IE.
//deg input defines the requested angle of rotation.
function degreeToIEMatrix(deg){
var deg2radians = Math.PI * 2 / 360;
var rad = deg * deg2radians ;
var costheta = Math.cos(rad);
var sintheta = Math.sin(rad);
var M11 = costheta;
var M12 = -sintheta;
var M21 = sintheta;
var M22 = costheta;
}
Вы найдете более подробную информацию здесь.
Ответ 2
Там вы идете:
SASS:
@mixin rotate( $degrees )
-webkit-transform: rotate(#{$degrees}deg)
-moz-transform: rotate(#{$degrees}deg)
-ms-transform: rotate(#{$degrees}deg)
-o-transform: rotate(#{$degrees}deg)
transform: rotate(#{$degrees}deg)
filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=#{cos($degrees)}, M12=-#{sin($degrees)}, M21=#{sin($degrees)}, M22=#{cos($degrees)})
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=#{cos($degrees)}, M12=-#{sin($degrees)}, M21=#{sin($degrees)}, M22=#{cos($degrees)})"
zoom: 1
SCSS:
@mixin rotate( $degrees ) {
-webkit-transform: rotate(#{$degrees}deg);
-moz-transform: rotate(#{$degrees}deg);
-ms-transform: rotate(#{$degrees}deg);
-o-transform: rotate(#{$degrees}deg);
transform: rotate(#{$degrees}deg);
filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=#{cos($degrees)}, M12=-#{sin($degrees)}, M21=#{sin($degrees)}, M22=#{cos($degrees)});
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=#{cos($degrees)}, M12=-#{sin($degrees)}, M21=#{sin($degrees)}, M22=#{cos($degrees)})";
zoom: 1;
}
использование:
@include rotate( 24 )
или вы можете просто использовать компас и сделать вашу жизнь намного проще: P
Ответ 3
Графическая матрица определяется как
[[cos(A), -sin(A)],
[sin(A), cos(A)]]
где A
- угол. M11
в матрице IE является первым элементом первой строки; M12
: второй элемент первой строки и т.д.
JavaScripts Math.sin
и Math.cos
работают на радианах, поэтому вам придется превращать градусы в радианы.
radians = degrees * Math.PI / 180
Полагая это вместе, мы получаем эту функцию:
function rotationMatrix(degrees) {
var A = degrees * Math.PI / 180;
return [[Math.cos(A), -Math.sin(A)], [Math.sin(A), Math.cos(A)]]
}
Пример:
rotationMatrix(10)
// => [[0.984807753012208, -0.17364817766693033],
// [0.17364817766693033, 0.984807753012208]]
Ответ 4
Вот версия кода @Remy, подходящая для использования в консоли javascript. Просто вставьте его в свою консоль, затем попробуйте makeIErotate (270), и он выплюнет кросс-браузерные стили, готовые к вставке в ваш файл CSS.
BEWARE: сглаживание в IE уродливо, если у вас нет сплошного цвета фона, даже тогда он может быть довольно размытым. Подробнее здесь.
function makeIErotate(deg) {
var deg2radians = Math.PI * 2 / 360;
var rad = deg * deg2radians ;
var costheta = Math.cos(rad);
var sintheta = Math.sin(rad);
return "-moz-transform: rotate(" + deg + "deg);\n\
-o-transform: rotate(" + deg + "deg);\n\
-webkit-transform: rotate(" + deg + "deg);\n\
-ms-transform: rotate(" + deg + "deg);\n\
transform: rotate(" + deg + "deg);\n\
filter: progid:DXImageTransform.Microsoft.Matrix(\n\
M11=" + costheta + ",\n\
M12=" + -sintheta + ",\n\
M21=" + sintheta + ",\n\
M22=" + costheta + ", sizingMethod='auto expand');";
}
Ответ 5
Чтобы использовать mixin, вы должны использовать
@include rotate(24)