基于CSS3-perspective的视差滚动

html-css07

基于CSS3-perspective的视差滚动,第1张

前情提要:本篇文章已经默认你已经彻底了解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

CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明。

选择器包括单独的选择和分组选择。

如:h1 { color:red} 单独选择器 定义h1标签的文字颜色

h1, h2, h3, h4 {color:red} 分组选择器 定义一组标签的文字颜色

依据选择方式的不同,选择器可以分为以下几个类别:

1.id 选择器。可以为标有特定 id 的 HTML 元素指定特定的样式,以 "#" 来定义。

如:#div1 {color:red}定义id名为div1 的元素的文字颜色

HTML代码:<div id="red">这个div里面所有文字都是红色得。</div>

2.类选择器。可以为标有class属性的 HTML 元素指定特定的样式,以"." 来定义。

如:.center {text-align: center}

HTML代码:<h1 class="center">这是大标题</h1>

<p class="center">这是文字内容</p>

这两个标签元素都有 center 类。这意味着两者都将遵守 ".center" 选择器中的规则。

3.属性选择器。 对带有指定属性的 HTML 元素设置样式。以"[ ]"来定义。

如:[title] {color:red}为带有 title 属性的所有元素设置样式

HTML代码:<h2 title="Hello world">Hello world</h2>

4.派生选择器。 通过依据元素在其位置的上下文关系来定义样式

如:li strong { font-style: italic font-weight: normal}

HTML代码:<li><strong>CSS选择器和我相符,所以对我起作用</strong></li>

5.元素选择器。最常见的 CSS 选择器,直接以标签名字选择。

如:html {color:black}

h1 {color:blue}

h2 {color:silver}

6.包含选择器。选择作为某元素后代的元素。以空格来表示

如:h1 em {color:red}选取h1 元素包含的 em 元素

HTML代码:<h1>This is a <em>important</em>heading</h1>

7.子元素选择器。只选择某个元素的子元素

如:h1 >strong {color:red}这个规则会把第一个 h1 下面的两个 strong 元素变为红色,但是第二个 h1 中的 strong 不受影响:

HTML代码:<h1>这是<strong>非常</strong><strong>非常</strong>重要的</h1>

<h1>这是<em>真的 <strong>非常</strong></em>重要的</h1>

8.相邻兄弟选择器。 选择紧接在另一个元素后的元素,以"+"表示

如:h1 + p {margin-top:50px}

选择紧接在 h1 元素后出现的段落,h1 和 p 元素拥有共同的父元素

9.还有一种特殊的选择器,伪类和伪元素选择器。这个在网页中也经常见到。

如: a:link {color: #FF0000} /* 未访问的链接 */

a:visited {color: #00FF00} /* 已访问的链接 */

a:hover {color: #FF00FF} /* 鼠标移动到链接上 */

a:active {color: #0000FF} /* 选定的链接 */

这个一看就明白了吧,就是定义a标签(超链接)的不同状态用不同的CSS样式显示。

基本就这些了,希望给你帮助。

参考:http://www.w3school.com.cn/css/index.asp

<style>

ol{list-style-type:demicalwidth:200px}

ol li{ list-style-position:outside}

</style>

<div id="test">

<ol>

<li>数字后缩进,如果文字有折行的话,则第二行的文字与第一行对齐</li>

<li>数字后缩进,如果文字有折行的话,则第二行的文字与第一行对齐</li>

<li>数字后缩进,如果文字有折行的话,则第二行的文字与第一行对齐</li>

<li>数字后缩进,如果文字有折行的话,则第二行的文字与第一行对齐</li>

</ol>

</div>