零点起步 發表於 2020-3-18 14:44:00

学习 CSS 之用 CSS 3D 实现炫酷效果

<h3>一、前言</h3>
<p>  把大象关进冰箱需要几步?三步,把冰箱门打开,把大象关进去,把冰箱门关上。</p>
<p>  用 CSS 实现 3D 效果需几步?三步,<strong>设置透视效果 perspective,改变元素载体为 preserve-3d,对元素进行 3D 转换操作</strong>。</p>
<p>  perspective 属性决定了我们从什么地方查看元素,定义时的 perspective 属性,它是一个元素的子元素,透视图,而不是元素本身。</p>
<p>  再说 3D 转换操作,需要用到的就是&nbsp;translateX,translateY,translateZ,写到一块就是 translate-3d,除此之外还有 rotateX,rotateY,rotateZ。至于平移和旋转的方向,可以参考下面的三维坐标图:</p>
<p>  <img src="https://img2020.cnblogs.com/blog/1450803/202003/1450803-20200318133758764-161043019.png" alt="" width="358" height="344"></p>
<p>&nbsp;</p>
<h3>二、CSS 翻页效果</h3>
<h4>1.创建透视背景</h4>
<p>  首先是要创建一个透视背景,也就是一个具有 perspective 属性的 div,这里我给 perspective 的值为800个像素单位。除此之外,还要有一个 div,将所有页面都包括在这个 div 中,这个 div 需要设置 position 为 relative,因为后面的页面都要使用绝对定位,并且要设置 transform-style 属性为 preserve-3d。相关 CSS 代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">.back {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">    perspective: 800px;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>   perspective-origin: <span style="color: rgba(128, 0, 128, 1)">50</span>% <span style="color: rgba(128, 0, 128, 1)">50</span>%<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    overflow: hidden;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">    margin: 10px;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">.content {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    width: 400px;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">    height: 400px;
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   margin: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> auto;
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   transform-style: preserve-<span style="color: rgba(0, 0, 0, 1)">3d;
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">    position: relative;
</span><span style="color: rgba(0, 128, 128, 1)">14</span> }</pre>
</div>
<h4>2.创建页面</h4>
<p>  在 CSS 类为 content 的 div 中创建多个页面,将除了第一页以外的页面全都“放倒”,即以底边为变换中心,然后在 X 方向上旋转90度,CSS 代码如下:</p>
<blockquote>
<p>transform-origin:&nbsp;bottom;</p>
<div>
<p>transform:&nbsp;rotateX(90deg);</p>
</div>
</blockquote>
<p>  除此之外,还要设置 transition 属性,页面的 CSS 代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">.page {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">    width: 360px;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">    height: 360px;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    padding: 20px;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: black;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    color: white;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   font-<span style="color: rgba(0, 0, 0, 1)">weight: bold;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   font-<span style="color: rgba(0, 0, 0, 1)">size: 300px;
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   text-<span style="color: rgba(0, 0, 0, 1)">align: center;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">    position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">#p1 {
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: bottom;
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">    transition: transform 1s linear;
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">17</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">#p2,
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">#p3,
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">#p4,
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">#p5,
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">#p6 {
</span><span style="color: rgba(0, 128, 128, 1)">23</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: bottom;
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">    transition: transform 1s linear;
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">    transform: rotateX(90deg);
</span><span style="color: rgba(0, 128, 128, 1)">26</span> }</pre>
</div>
<h4>3.添加按钮实现翻页</h4>
<p>  添加两个按钮用于实现向前翻页和向后翻页。向前翻页时,当前页面在 X 方向上旋转-90度,也就是向前旋转90度倒下了,然后将下一页改为 rotate(0deg) 立起来。向后翻页就是一个逆向的过程了,这里就不再赘述了。控制翻页的 JS 代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> &lt;script&gt;
<span style="color: rgba(0, 128, 128, 1)"> 2</span>   <span style="color: rgba(0, 0, 255, 1)">var</span> curIndex = 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>   <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> previous() {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">      console.log(curIndex);
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (curIndex === 1<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>             <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>         <span style="color: rgba(0, 0, 255, 1)">var</span> curPage = document.getElementById("p" +<span style="color: rgba(0, 0, 0, 1)"> curIndex);
</span><span style="color: rgba(0, 128, 128, 1)">10</span>         curPage.style.transform = "rotateX(90deg)"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>         curIndex--<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">13</span>         <span style="color: rgba(0, 0, 255, 1)">var</span> prevPage = document.getElementById("p" +<span style="color: rgba(0, 0, 0, 1)"> curIndex);
</span><span style="color: rgba(0, 128, 128, 1)">14</span>         prevPage.style.transform = "rotateX(0deg)"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">16</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>   <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> next() {
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">      console.log(curIndex);
</span><span style="color: rgba(0, 128, 128, 1)">19</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (curIndex === 6<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">20</span>             <span style="color: rgba(0, 0, 255, 1)">return</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">22</span>         <span style="color: rgba(0, 0, 255, 1)">var</span> curPage = document.getElementById("p" +<span style="color: rgba(0, 0, 0, 1)"> curIndex);
</span><span style="color: rgba(0, 128, 128, 1)">23</span>         curPage.style.transform = "rotateX(-90deg)"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span>         curIndex++<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">26</span>         <span style="color: rgba(0, 0, 255, 1)">var</span> nextPage = document.getElementById("p" +<span style="color: rgba(0, 0, 0, 1)"> curIndex);
</span><span style="color: rgba(0, 128, 128, 1)">27</span>         nextPage.style.transform = "rotateX(0deg)"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">29</span> &lt;/script&gt;</pre>
</div>
<p>  需要注意的是,在向前和向后翻页时,需要对第一页和最后一页进行一个判断。</p>
<p>&nbsp;</p>
<h3>三、CSS 旋转正方体</h3>
<h4>1.创建正方体</h4>
<p>  用 CSS 创建一个旋转的正方体,首先也是要创建一个透视的背景,然后创建六个页面,分别进行平移和旋转操作,构造出一个正方体,CSS 代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">.face {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">    width: 160px;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">    height: 160px;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">    padding: 20px;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">    color: white;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">    transition: transform 1s linear;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">#f1 {
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: aqua;
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">#f2 {
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: blue;
</span><span style="color: rgba(0, 128, 128, 1)">16</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: right;
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   transform: rotateY(-<span style="color: rgba(0, 0, 0, 1)">90deg)
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">19</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">#f3 {
</span><span style="color: rgba(0, 128, 128, 1)">21</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: green;
</span><span style="color: rgba(0, 128, 128, 1)">22</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: top;
</span><span style="color: rgba(0, 128, 128, 1)">23</span>   transform: rotateX(-<span style="color: rgba(0, 0, 0, 1)">90deg)
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">25</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">#f4 {
</span><span style="color: rgba(0, 128, 128, 1)">27</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: yellow;
</span><span style="color: rgba(0, 128, 128, 1)">28</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: bottom;
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">    transform: rotateX(90deg)
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">31</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">#f5 {
</span><span style="color: rgba(0, 128, 128, 1)">33</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: red;
</span><span style="color: rgba(0, 128, 128, 1)">34</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: left;
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)">    transform: rotateY(90deg)
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">37</span>
<span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">#f6 {
</span><span style="color: rgba(0, 128, 128, 1)">39</span>   background-<span style="color: rgba(0, 0, 0, 1)">color: pink;
</span><span style="color: rgba(0, 128, 128, 1)">40</span>   transform: translateZ(-<span style="color: rgba(0, 0, 0, 1)">200px);
</span><span style="color: rgba(0, 128, 128, 1)">41</span> }</pre>
</div>
<h4>2.旋转正方体</h4>
<p>  进行完第一步之后,一个正方体就已经出来了,但是我们还只能看到两个面,这时可以对整体进行一下旋转,就能看到更多的面了。JS 代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> &lt;script&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>   setInterval(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 128, 128, 1)">3</span>         <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 1; i &lt; 361; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">4</span>             <span style="color: rgba(0, 0, 255, 1)">var</span> ele = document.getElementById("content"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">5</span>             ele.style.transform = "rotate(" + i + "deg)"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">7</span>   }, 1000<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">8</span> &lt;/script&gt;</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">完整代码已上传到 GitHub!</span></p>

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">   
      <div>作者:TM0831</div>
      <div>出处:https://www.cnblogs.com/TM0831/</div>
      <div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利.</div>


<style type="text/css">#AllanboltSignature { border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 60px; font-family: 微软雅黑; font-size: 14px; background: url("https://images.cnblogs.com/cnblogs_com/allanbolt/226222/o_users_two_warning_48.png") #e5f1f4 no-repeat 1% 50% }
#AllanboltSignature div { line-height: 25px }</style></div><br><br>
来源:https://www.cnblogs.com/TM0831/p/12486687.html
頁: [1]
查看完整版本: 学习 CSS 之用 CSS 3D 实现炫酷效果