css3 中perspective-origin,为啥x的值设置为一个很大的数时元素的长变的非常大?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了css3 中perspective-origin,为啥x的值设置为一个很大的数时元素的长变的非常大?相关的知识,希望对你有一定的参考价值。

透视效果是依赖于人眼来产生的,而人眼的可视范围大概在120度左右,3D物体处在这个范围内产生的透视效果才是真实的,超出这个范围(比如说物体是放在你耳朵边的),人眼看不到了,自然就不会有什么透视效果了,假如这个时候又强行利用电脑手段把这个并不存在的逗透视效果地用图片表现出来,就肯定会出现严重的变形。因此那个属性的x或y值不能设置得太大。
你可以自己测试一下:你把手机横着贴在耳边,这时候你的眼睛只能看到手机的一小部分,大部分是看不到的,这时候你看到的手机的透视效果(尽管只有一小部分,而且很模糊,因为它不在你的视觉中心)是真实的,但假如现在要把看不见的那一大部分也用图片表现出来,你脑子里能想象出应该是什么样子吗看
参考技术A perspective字面意思是:透视。
在w3school中它的解释为:设置元素被查看位置的视图:通俗讲,就是我们看看一个物体的所处的视角,近大远小。就比如我们正对着电脑:当我无限贴近电脑屏幕的时候,电脑的屏幕就无限大;当我们站起来远离电脑的时候,电脑的屏幕就无限变小。
如果我们不要perspective这个属性的话,那么你看到的就不再是一个矩形的旋转,而是一个矩形逐渐变窄,然后逐渐变宽,因为他没有透视(perspective)。
perspective属性的值是一个数字,他有2种实现方法:
1.transform: perspective(800);
2.perspective: 800;

基于CSS3-perspective的视差滚动

参考技术A

前情提要:本篇文章已经默认你已经彻底了解perspective和translateZ的含义与用法,如果尚未了解,我推荐你看 css3系列之详解perspective

是不是比起普通网站多了一层酷炫?想知道如何实现吗?接下来我们进入part2。

步骤:
1.建立一个容器元素,设置 overflow-y: scroll 使其可以滚动(同时可能需要 overflow-x: hidden)。
2.对于上面的元素, 我们会应用一个 perspective 值,然后设置 perspective-origin 到 top left, 或者 0 0。
3.对上面元素的子元素应用一个在 Z 轴的变换,然后把它们还原回来以实现视差效果,而没有影响它们在屏幕上的大小。
这种方案下的css和html:

是不是很简单?

现在的你已经写出基本的视差滚动动画了!但是perspective和translateZ是怎么影响滚动速度的?还有scale,为什么这里设置的是3?想知道吗?那么接下来进入part3

这里把scale设为S,pespcetive->P,translateZ->D // 注意D一般是负值
那么有公式 S=(P-D)/P ,
这个公式怎么来的?这其实就是一个简单的相似三角形

划红线的地方的比例就是1:3,那么你只需要在原来的基础上放大3就可以让图形变回原来的比例,这里的1就是P,2就是D,那么很容易发现图形的缩小比例是P/(P-D),想放大回来?倒置这个缩小比例即可,我们便得到了S=(P-D)/P
现在我们已经靠scale属性让图形变回了原来的大小,似乎一切都恢复了原状,但有一个东西,它变了,便是滚动速度,滚动速度和上面的缩小比例是完全一致的,以如下数据为例

不看scale,这里的缩小比例是1/3,那么由于css机制,它的滚动速度也会变成原来的1/3。即使添加了scale属性,它的滚动速度依然不变还是原来的1/3。
现在让我们来总结性质:
父元素设置perspective,子元素设置 translateZ(-2px),那么无论是否有scale属性,
则有

PS:如果不设置 translateZ,或者 translateZ(0),那么对应D=0,所以有缩小比例=滚动速度比=(P/P-0)=1:1,即相对于原来的滚动速率不变。

为了方便读者尝试,我码了一个小小的demo,你可以任意更改属性来验证上面的结论!

参考文献
Performant Parallaxing : https://developers.google.com/web/updates/2016/12/performant-parallaxing
[杨耿]css3系列之详解perspective:
https://www.cnblogs.com/yanggeng/p/11285856.html

以上是关于css3 中perspective-origin,为啥x的值设置为一个很大的数时元素的长变的非常大?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作css3的3d动画——以骰子旋转为例,详解css3动画属性

前端游戏巨制! CSS居然可以做3D游戏了

CSS 3 3D 转换

css3基础CSS3 边框

CSS 总结我对3D效果的一些误解

css3 中怎样实现div的2d,3d旋转