Почему преобразование : перекос(30 градусов); не совпадает с преобразованием : матрица(1,0,30,1,0,0);?

#html #css #css-transforms

Вопрос:

Сравните следующие два фрагмента кода-

 .box {
  width: 100px;
  height: 100px;
  background-color: red;
  display: inline-block;
}

.box1 {
  margin: 100px;
  transform: skew(30deg);
} 
 <div class="box box1"></div> 
 .box {
  width: 100px;
  height: 100px;
  background-color: red;
  display: inline-block;
}

.box2 {
  transform: matrix(1, 0, 30, 1, 0, 0);
} 
 <div class="box box2"></div> 

В первом фрагменте кода, который я использовал transform: skew(30deg);
, и во втором, который я использовал transform: matrix(1,0,30,1,0,0);
Как вы можете видеть в matrix() функции, я сохранил все аргументы в их значении по умолчанию, за исключением skewX() , и я изменяю его на 30 . Что должно сработать так skew(30deg) , как я предполагаю. Поскольку в документации говорится matrix() , что используйте аргументы, подобные приведенным ниже:

 matrix( scaleX(), skewY(), skewX(), scaleY(), translateX(), translateY() );
 

ЕСЛИ вы запустите приведенные выше фрагменты кода, то обнаружите разные выходные данные. Почему они не одинаковы? Как говорит мое предположение, оно должно быть равным, потому что я использовал skewX(30deg) для обоих случаев.

Как matrix() на самом деле работает эта функция?

Какие единицы измерения используются для scaleX() , skewY() , skewX() , scaleY() , translateX() , translateY() в матричных функциях? Как transform: skew(30deg); и transform: matrix( skewX(30) ); не дают того же результата.

Комментарии:

1. Может быть, это поможет вам понять немного лучше, а может быть, и нет dev.opera.com/articles/understanding-the-css-transforms-matrix матрица преобразований работает не так, как функция преобразования skew (), она намного более математична.

2. @JHeth Я прочитал этот документ. Но я не счел это полезным.

Ответ №1:

Использование матрицы не так просто, как вы думаете. Мы добавляем не угол, а тангенс угла:

 .box {
  width: 100px;
  height: 100px;
  background-color: red;
  display: inline-block;
  transform: skew(30deg);
}

.box2 {
  transform: matrix(1, 0, .577, 1, 0, 0);
} 
 <div class="box"></div>
<div class="box box2"></div> 

Более подробную информацию вы можете найти в спецификации: https://www.w3.org/TR/css-transforms-1/#interpolation-of-2d-matrices

Вы также можете проверить вычисленное значение элемента, используя skew(30deg) для просмотра значения матрицы:

перекос матрицы CSS