admin管理员组

文章数量:1566652

最近做视差滚动的时候差点没被这两个东西逼疯…

正文:
以下是一些我们与要用的的相关知识,想要更详细的解释可上网查询。
-----------------------------------------------------------------------------------------
1

为元素及内容应用透视变换
2

3
transform不可继承。
4
scale辐射放大


其中说到了Z=0的平面,那么我们先介绍下3D坐标轴。

X轴正方向:以屏幕的左上点为原点指向你的右手方向。
Y轴正方向:以屏幕的左上点为原点指向下。
Z轴正方向:垂直屏幕出来只想外面(不严谨理解:指向你的眼睛?)

图:

好了,我们来举一个例子。

我们对父元素容器设置perspective:100px;

对子元素设置transform:translateZ(-50px);应该为下面图中的情况。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
    body{
       /*  perspective: 100px; */
    }
    .a{
        width: 500px;
        height: 500px;
        background-color: #7fff00;
        perspective: 100px;
    }
    .b{
        width: 200px;
        height: 200px;
        background-color: cornflowerblue;
        transform: translateZ(-50px) /* scale(1.5); */
    }
    </style>
</head>
<body>
    <div class="a">
        <div class="b"></div>
    </div>
</body>
</html>

我们先来看下计算的结果:

再来看下实际效果:

嗯,确实对的上。

额外差一个小内容:电脑显示设置里的缩放和布局影响到我们浏览器里内容的宽高。。

要注意设为100%

好了,继续。

我们发现原图为这样:

为什么添加了perspective和transform:translateZ()后,蓝颜色小块发生了位移?

答案我最开始贴出的第二张图片中:

观察点位于要投影的对象的右下,所以投影也会偏右下。

那如果我是给body设置perspective呢?
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
    body{
        perspective: 100px;
    }
    .a{
        width: 500px;
        height: 500px;
        background-color: #7fff00;
       /*  perspective: 100px; */
    }
    .b{
        width: 200px;
        height: 200px;
        background-color: cornflowerblue;
        transform: translateZ(-50px) /* scale(1.5); */
    }
    </style>
</head>
<body>
    <div class="a">
        <div class="b"></div>
    </div>
</body>
</html>

效果:

body未设置高度和宽度,高度为子元素最高高度,宽度为100%视口。
所以蓝色小块与上面的情况处于同一高度但是更偏右(body’的100%视口比选择器.a的500px大)

熟能生巧!再来一个例子。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
    body{
       /*  perspective: 100px; */
    }
    .a{
        width: 500px;
        height: 500px;
        background-color: #7fff00;
        perspective: 100px;
    }
    .b{
        width: 100%;
        height: 200px;
        background-color: cornflowerblue;
        transform: translateZ(-50px) scale(1.5);
    }
    </style>
</head>
<body>
    <div class="a">
        <div class="b"></div>
    </div>
</body>
</html>

效果:

因为width设置了100%所以居中无偏移,但是观察点位于要投影的对象的下方所以投影向下移一点。

好,现在附上简单的视差滚动效果。
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
    .a{
        overflow-y: auto;
        height: 600px;
        background: rgba(0, 0, 0, .3);
        perspective: 100px;
    }
    .b{
        height: 800px;
        /* display: flex;
        align-items: center;
        justify-content: center; */
    }
    .c{
        transform: translateZ(-100px) scale(2);
        
        height: 100px;
        background-color: aqua;
    }
    .d{
        transform: translateZ(-100px) scale(2);
        
        height: 100px;
        background-color: red;
    }
    .e{
        overflow: hidden;
    }
    </style>
</head>
<body>
    <div class="a">
        <div class="b">
           <div class="e">
            <div class="c"></div>
            <div class="d"></div>
           </div>
           <div class="e">
            <div class="c"></div>
            <div class="d"></div>
           </div>
        </div>
        
    </div>
</body>
</html>

该效果是由
1.文档与内容不同的滚动速度
2.设定一个父容器超出其高度就隐藏(代码中为选择器为.e的div)
3.由于.c和.d跟不上.e所以逐渐被隐藏
4.b和.a构成滚动容器

然后我们把作为内容的div换成图片就行啦
例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
    .a{
        background: rgba(0, 0, 0, .3);
        perspective: 100px;
    }
    .b{
        height: 100vh;
        overflow-y: auto;
        /* display: flex;
        align-items: center;
        justify-content: center; */
    }
    .c{
        height: 50vh;
        overflow: hidden;
    }
    .e{
        transform: translateZ(-50px) scale(1.5);
    }
    </style>
</head>
<body>
    <div class="a">
        <div class="b">
           <div class="c">
            <img src="../images/1.jpg" alt="" class="e">
           </div>
           <div class="c">
            <img src="../images/2.jpg" alt="" class="e">
           </div>
           <div class="c">
            <img src="../images/3.jpg" alt="" class="e">
           </div>
           <div class="c">
            <img src="../images/4.jpg" alt="" class="e">
           </div>
           <div class="c">
            <img src="../images/5.jpg" alt="" class="e">
           </div>
        </div>
        
    </div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0; 
      }
      
      .container{
        perspective: 100px;/* ---------------------------1 */
        overflow-y: scroll;/* ---------------------------2 */
        height: 100vh;

      }
      .box{
        overflow: hidden;/* -----------------------------3 */
        height: 100vh;
      }
      .img {
        width: 100wh;
        height: 100vh;
        transform: translateZ(-100px) scale(2)/* --------4 */
      }
      img{
          width: 100%;
          height: 100%;
          object-fit: cover;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="box">
        <div class="img"><img src="../images/1.jpg" alt="" /></div>
      </div>
      <div class="box">
        <div class="img"><img src="../images/2.jpg" alt="" /></div>
      </div>
      <div class="box">
        <div class="img"><img src="../images/3.jpg" alt="" /></div>
      </div>
      <div class="box">
        <div class="img"><img src="../images/4.jpg" alt="" /></div>
      </div>
      <div class="box">
        <div class="img"><img src="../images/5.jpg" alt="" /></div>
      </div>
    </div>
  </body>
</html>

补充:
1

2
要给观察视口添加滚轴,自带的滚轴是html的

本文标签: 原理perspectivetranslateZ