在CSS中定义一个容器!

html-css06

在CSS中定义一个容器!,第1张

这个还真有点麻烦的.. CSS3出现前 仅仅在css中定义已经无法达到你的要求

可以使用javsscript来实现

假设div的名字是layout

<div id="layout">...</div>

function autozize(){

var para = document.getElementById("layout")

var width = document.body.clientWidth

if width <= 1000

para.style.width = 980px

else

para.style.width = 98%

}

para.style.fontSize = "2em"

}

<style>

.trapezoid-bg {position: relative}

.trapezoid-bg::before {

content: ''

position: absolute

top: 0

right: 0

bottom: 0left: 0z-index: 0

transform: perspective(.5em) rotateX(-1deg)border: 1px solid #000

}

[class*=item] {height: 60px}

[class*=item]:not(:first-child)::before { border-top: none}

.item-1 {width: 300px }

.item-2 {width: 262px}

.item-3 {width: 230px}

.item-4 { width: 202px}

.flex-center {display: flexalign-items: centerjustify-content: center}

.flex-vertical { flex-direction: column}

</style>

<body>

<div class="flex-center flex-vertical">

<div class="trapezoid-bg flex-center item-1">hello world</div>

<div class="trapezoid-bg flex-center item-2">hello world</div>

<div class="trapezoid-bg flex-center item-3">hello world</div>

<div class="trapezoid-bg flex-center item-4">hello world</div>

</div>

</body>

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