css3 作一個相似於翻書特效的3D動畫

咱們來看下作一個css3 3D動畫須要哪些東西。前面咱們已經使用transition和transform作了一些簡單的操做。javascript

設置3D場景

作3D動畫,咱們首先要設置3D場景。3D場景咱們一般用perspective和perspective-origin兩個屬性設定。
圖片描述css

說明各個屬性的做用:
perspective:800;表明3D物體距離瀏覽器是800px。
perspective-origin:50% 50%;眼睛視角的中心點,分別在xy軸的50%的地方。
設置了這兩個屬性以後,瀏覽器中的物體已經變成三維物體。這個時候咱們就能夠作3D動畫了。html

transform 3D操做

transform既能夠作3D操做也能夠作2D操做,爲了區分是3D仍是2D,咱們須要加個樣式屬性。加了這個樣式以後,就表明在動畫中咱們要作3D操做。java

-webkit-transform-style:-webkit-preserve-3d;

咱們用圖片表示在三維世界裏xyz軸的方向(x軸是向右的,y軸是向下的,z軸的方向至關於從屏幕指向咱們的)。
圖片描述
下面咱們作一個向下翻頁的數字,和一個向作翻頁的數字。css3

作一個向下翻頁的動畫

圖片描述

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <style>
      #my3dspace{
        /* 設置3D場景,距離人眼800像素,原點在50% 50%的位置 */
        -webkit-perspective:800;
        -webkit-perspective-origin:50% 50%;
        overflow: hidden;
      }
      #pagegroup{
        width: 400px;
        height: 400px;
        margin: 0 auto;
        -webkit-transform-style:preserve-3d;
        /* 告訴瀏覽器裏面的元素進行3D轉換 */
        position: relative;
      }
      .page{
        position: absolute;
        left: 0;
        top: 0;
        width: 360px;
        height: 360px;
        padding: 20px;
        background: #000;
        color: #fff;
        font-weight: bold;
        font-size: 360px;
        line-height: 360px;
        text-align: center;
      }
      #page1{
        -webkit-transform-origin:bottom;
        -webkit-transition:-webkit-transform 1s linear;
      }
      #page2,#page3,#page4,#page5,#page6{
        -webkit-transform-origin:bottom;
        -webkit-transition:-webkit-transform 1s linear;
        -webkit-transform:rotateX(90deg);
      }
      #op{
        text-align: center;
        margin: 40px auto;
      }
    </style>
    <script>
      var curIndex=1;//當前變量的值
      function next(){
        if(curIndex===6){
          return;
        }
        var curPage=document.getElementById("page"+curIndex);
        curPage.style.webkitTransform="rotateX(-90deg)";
        curIndex++;
        var nextPage=document.getElementById("page"+curIndex);
        nextPage.style.webkitTransform="rotateX(0deg)";
      }
      function prev(){
        if(curIndex===1){
          return;
        }
        var curPage=document.getElementById("page"+curIndex);
        curPage.style.webkitTransform="rotateX(90deg)";
        curIndex--;
        var prevPage=document.getElementById("page"+curIndex);
        prevPage.style.webkitTransform="rotateX(0deg)";
      }
    </script>
  </head>
  <body>
    <div id="my3dspace">
      <div id="pagegroup">
        <div class="page" id="page1">1</div>
        <div class="page" id="page2">2</div>
        <div class="page" id="page3">3</div>
        <div class="page" id="page4">4</div>
        <div class="page" id="page5">5</div>
        <div class="page" id="page6">6</div>
      </div>
    </div>
    <div id="op">
      <a href="javascript:next()">next</a>
      <a href="javascript:prev()">previous</a>
    </div>
  </body>
</html>

作一個向左翻頁的動畫——相似於翻書的特效

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <style>
      #my3dspace{
        /* 設置3D場景,距離人眼800像素,原點在50% 50%的位置 */
        -webkit-perspective:800;
        -webkit-perspective-origin:50% 50%;
        width: 360px;
        overflow: hidden;
        margin: auto;
      }
      #pagegroup{
        width: 360px;
        height: 360px;
        margin: 0 auto;
        -webkit-transform-style:preserve-3d;
        /* 告訴瀏覽器裏面的元素進行3D轉換 */
        position: relative;
      }
      .page{
        position: absolute;
        left: 0;
        top: 0;
        width: 360px;
        height: 360px;
        background: #000;
        color: #fff;
        font-weight: bold;
        font-size: 360px;
        line-height: 360px;
        text-align: center;
      }
      #page1{
        -webkit-transform-origin:left;
        -webkit-transition:-webkit-transform 1s linear;
      }
      #page2,#page3,#page4,#page5,#page6{
        -webkit-transform-origin:left;
        -webkit-transition:-webkit-transform 1s linear;
        -webkit-transform:rotateY(90deg);
      }
      #op{
        text-align: center;
        margin: 40px auto;
      }
    </style>
    <script>
      var curIndex=1;//當前變量的值
      function next(){
        if(curIndex===6){
          return;
        }
        var curPage=document.getElementById("page"+curIndex);
        curPage.style.webkitTransform="rotateY(-90deg)";
        curIndex++;
        var nextPage=document.getElementById("page"+curIndex);
        nextPage.style.webkitTransform="rotateY(0deg)";
      }
      function prev(){
        if(curIndex===1){
          return;
        }
        var curPage=document.getElementById("page"+curIndex);
        curPage.style.webkitTransform="rotateY(90deg)";
        curIndex--;
        var prevPage=document.getElementById("page"+curIndex);
        prevPage.style.webkitTransform="rotateY(0deg)";
      }
    </script>
  </head>
  <body>
    <div id="my3dspace">
      <div id="pagegroup">
        <div class="page" id="page1">1</div>
        <div class="page" id="page2">2</div>
        <div class="page" id="page3">3</div>
        <div class="page" id="page4">4</div>
        <div class="page" id="page5">5</div>
        <div class="page" id="page6">6</div>
      </div>
    </div>
    <div id="op">
      <a href="javascript:next()">next</a>
      <a href="javascript:prev()">previous</a>
    </div>
  </body>
</html>