Что делает функция преобразования scaleZ() CSS?

Я пытаюсь превратить мой крошечный мозг в 3D-преобразования CSS, и у меня возникли проблемы с пониманием функции scaleZ().

scale(), scaleX() и scaleY() имеют смысл: они растягивают элемент вдоль указанной оси, умножая его размер вдоль этой оси на число, которое вы предоставляете.

Но scaleZ() кажется другим:

  • Это относится к дочерним элементам элемента
  • Он не влияет на размеры дочерних элементов, поскольку элементы HTML не имеют никакого размера вдоль оси z (т.е. вы не можете сделать <div> "толще" ).

В блоге WebKit говорится:

[scaleZ()] влияет на масштабирование вдоль оси z в преобразованных дочерних элементах.

Я не могу понять, что это на самом деле означает на практике. Может ли кто-нибудь дать объяснение, желательно с некоторым примером кода?

Ответы

Ответ 1

Кажется глупым ответить на вопрос через два года после его запроса, но опубликовать его для потомков.

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

При применении преобразования браузер берет координаты для каждой вершины объекта (в не-nerd говорят: берет координаты для каждого угла окна) и умножает его на матрицу преобразования. Произведением этого становится новые координаты для объекта. Например, математика 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. Преобразование имеет заметный эффект.

Ответ 2

на веб-странице X, Y & Z есть three views, как например z-index, так как это то же самое scaleZ().

Проверьте, что w3c say

scale(<number>[, <number>])
specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.
scale3d(<number>, <number>, <number>)
specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.
scaleX(<number>)
specifies a scale operation using the [sx,1,1] scaling vector, where sx is given as the parameter.
scaleY(<number>)
specifies a scale operation using the [1,sy,1] scaling vector, where sy is given as the parameter.
scaleZ(<number>)
specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter. 

проверить свою анимацию ссылок http://www.webkit.org/blog-files/3d-transforms/morphing-cubes.html

EDIT:

ваша скрипка все еще не объясняет, что такое scaleZ(), потому что мы также можем получить этот эффект от scaleY().

Проверьте этот скрипт http://jsfiddle.net/sandeep/dppNn/

Теперь в моем примере скрипта вы можете 3rd digit box выглядеть как 3D means с scaleX(),scaleY() & scaleZ() и 2nd digit box похожими на 2D, потому что они масштабируют только scaleX() и scaleY().

Ответ 3

Я смутился об этом в течение долгого времени, хотя экспериментировал, я считаю, что это довольно легко понять:

Предположим, что элемент позиционируется 100px на оси Z, заставляя его перемещаться к зрителю, например:

div {
    transform: translateZ(100px);
}

И затем вы масштабируете ось Z на два:

div {
    transform: scaleZ(2) translateZ(100px);
}

Его размеры не затрагиваются, как вы говорите, но теперь он будет такого же размера, как если бы он был translateZ(200px). scaleZ(2) translateZ(400px) является эквивалентом translateZ(800px) и т.д.

Вы можете увидеть демонстрацию этого на JSFiddle.

Не думайте, что scaleZ() влияет на элемент, а вместо этого на ось Z, на которой находится элемент.

Последнее замечание: браузер должен обрабатывать несколько функций преобразования, как если бы они применялись отдельно, что означает, что их порядок важен. Для работы scaleZ() он должен быть помещен до translateZ(), иначе вы просто перемещаете элемент по оси Z и затем масштабируете ось без какого-либо визуального результата.

Ответ 4

Apples Safari CSS Руководство по визуальным эффектам объясняет scaleZ() как это:

Вы можете изменить систему координат потомков элементов, масштабируя ось z, так что расстояния вдоль оси z больше или меньше. Это масштабирование влияет только на потомки элементов, а масштабирование требует включения трехмерных преобразований, поэтому масштабирование по оси z требует по крайней мере двух 3D-слоев. [Акцент мой]

Итак, как я понимаю, когда:

  • У вас есть два 3D-слоя, а
  • внутренний имеет scaleZ(), примененный к нему

тогда, когда потомки внутреннего слоя применяют к ним 3D-преобразования, их перемещение вдоль оси z будет умножено на значение, которое вы передали на scaleZ(). Или что-то.

Ive вывел пример в JSFiddle. Если вы удалите -webkit-transform: scaleZ(3);, синий синь помещается внутри серого окна, потому что он не так сильно перемещается вдоль оси z. (Я думаю.)