Кажется глупым отвечать на вопрос через два года после того, как его спросили, но опубликовать его для потомков.
Это связано с матрицами преобразования и умножением матрицы на вектор. По сути, преобразование не будет работать, если математика не сработает для создания продукта, координата Z которого больше нуля.
Это легко объяснить, но немного трудно понять, если у вас нет математического фона. (Но чтение википедии и поиска в Google по выходным научит вас достаточно. Вот как я этому научился.) Каждая функция преобразования, кроме matrix () и matrix3d (), имеет эквивалентное значение матрицы. Для scale3d матрица:
[sx 0 0 0]
[0 sy 0 0]
[0 0 sz 0]
[0 0 0 1]
Где sx, sy и sz - коэффициент масштабирования по осям x, y и z. Для scaleZ это то же самое, но sx и sy равны 1.
Когда вы применяете преобразование, браузер берет координаты для каждой вершины объекта (иначе говоря, принимает координаты для каждого угла поля) и умножает его на матрицу преобразования. Продукт этого становится новыми координатами для объекта. Например, математика transform: scaleZ(3)
для объекта, начинающегося с (100,50,0), выглядит примерно так:
[1 0 0 0] [100] [100]
[0 1 0 0] * [ 50] = [ 50]
[0 0 3 0] [ 0] [ 0]
[0 0 0 1] [ 1] [ 1]
Этот продукт, [100 50 0 1] при переводе в трехмерную систему координат, становится тем, с чего мы начали: (100,50,0). В результате получается, что преобразование не было применено. Чтобы преобразование, использующее scaleZ (), имело эффект, третье число в произведении матрицы и вектора должно быть больше нуля. Обычно это происходит, когда scaleZ () или scale3d () применяются к родительскому элементу или используются в сочетании с другой функцией преобразования. В обоих случаях матрица накопленного / текущего преобразования приводит к координате Z, значение которой больше нуля. Вот пример использования transform: rotateY(30deg) scaleZ(3)
. Сначала нам нужно умножить матрицу для rotateY(30deg)
на матрицу для scaleZ(3)
.
[0.866 0 -0.499 0] [1 0 0 0] [0.866 0 -1.497 0]
[0 1 0 0] * [0 1 0 0] = [0 1 0 0]
[0.499 0 0.866 0] [0 0 3 0] [0.499 0 2.598 0]
[0 0 0 1] [0 0 0 1] [0 0 0 0]
Тогда мы можем умножить наше матричное произведение (этот бит справа от знака равенства) на нашу точку в (100,50,0).
[0.866 0 -1.497 0] [100] [86.6]
[0 1 0 0] * [ 50] = [50 ]
[0.499 0 2.598 0] [ 0] [49.9]
[0 0 0 1] [ 1] [ 1 ]
Наш продукт [86,6 50 49,9 1] работает с координатами (87, 50, 50), если округлить до целых чисел. И эта секунда 50 является нашей Z-координатой. Преобразование имеет заметный эффект.