Создать кроссбраузерный миксин для трансформации: повернуть - PullRequest
19 голосов
/ 15 апреля 2011

Я хочу создать миксин для 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 или их комбинации?

Ответы [ 5 ]

21 голосов
/ 18 июня 2012

Вот, пожалуйста:

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

10 голосов
/ 15 апреля 2011

Матрица вращения определяется как

[[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]]
6 голосов
/ 15 апреля 2011

Эта функция позволяет преобразовать градусы в матричное преобразование 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;
}

Более подробную информацию вы найдете здесь .

1 голос
/ 01 ноября 2012

Вот версия кода @ Remy, подходящая для использования в консоли javascript.Просто вставьте его в консоль, затем попробуйте makeIErotate (270), и он выложит кросс-браузерные стили, готовые для вставки в ваш CSS-файл.

ВНИМАНИЕ: сглаживание в 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');";
}
0 голосов
/ 31 октября 2012

Чтобы использовать миксин, вы должны использовать

@include rotate(24)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...