transform 属性 实现3D立体相册

589 阅读3分钟

属性简介

perspective 属性

perspective 属性 指定了观察者与 z = 0 平面的距离,使具有三维位置变换的元素产生透视效果。

transform-style 属性

属性 transform-style 设置元素的子元素是位于 3D 空间中还是平面中变换。

translateZ() 函数

修改元素 z轴 在三维空间的位置。

rotateX() 、rotateY() 函数

rotateX()元素围绕 x轴 旋转。rotateY()元素围绕 y轴 旋转。

animation 属性

  1. 为元素添加一个动画。
  2. 通过 @keyframes 设置动画。

搭建舞台

<!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">
      .main {
        width: 1000px;
        min-height: 600px;
        margin: 50px auto;
        background-color: #f0f0f0;
        box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.35);
        position: relative;
        top: 0;
        display: flex;
        justify-content: center;
        align-items: center;
        /* 3D视距 透视 */
        -webkit-perspective: 800px;
        perspective: 800px;
      }

      .container {
        width: 200px;
        height: 200px;
        position: relative;
        transform: rotateX(30deg);

        /* 添加动画  */
        animation: rotateAn 5s linear infinite;
        -webkit-animation: rotateAn 5s linear infinite;

        /* 修改子元素 为3D变换 */
        -webkit-transform-style: preserve-3d;
        transform-style: preserve-3d;
      }
    </style>
  </head>
  <body>
    <!-- 舞台 -->
    <div class="main">
      <!-- 容器 -->
      <div id="container" class="container">
        <!-- 内 -->
        <div class="withinBox">
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
        </div>
        <!-- 外 -->
        <div class="outsideBox">
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
          <div class="inner"></div>
        </div>
      </div>
    </div>
  </body>
</html>

效果图

创建内框

...
      /* 内框 */
      .withinBox {
        width: 100px;
        height: 100px;
        position: absolute;
        top: 50px;
        left: 50px;

        /* 修改子元素 为3D变换 */
        -webkit-transform-style: preserve-3d;
        transform-style: preserve-3d;
      }
      .withinBox .inner {
        width: 100px;
        height: 100px;
        position: absolute;
        left: 0;
        top: 0;
      }
      .withinBox .inner:nth-child(1) {
        background-color: #ccffff;
        /* 正面 */
        transform: translateZ(50px);
        -webkit-transform: translateZ(50px);
      }
      .withinBox .inner:nth-child(2) {
        background-color: #ccccff;
        /* 背面 */
        transform: rotateX(180deg) translateZ(50px);
        -webkit-transform: rotateX(180deg) translateZ(50px);
      }
      .withinBox .inner:nth-child(3) {
        background-color: #99ffff;
        /* 下面 */
        transform: rotateX(-90deg) translateZ(50px);
        -webkit-transform: rotateX(-90deg) translateZ(50px);
      }
      .withinBox .inner:nth-child(4) {
        background-color: #99ffcc;
        /* 上面 */
        transform: rotateX(90deg) translateZ(50px);
        -webkit-transform: rotateX(90deg) translateZ(50px);
      }
      .withinBox .inner:nth-child(5) {
        background-color: #ffccff;
        /* 左面 */
        transform: rotateY(-90deg) translateZ(50px);
        -webkit-transform: rotateY(-90deg) translateZ(50px);
      }
      .withinBox .inner:nth-child(6) {
        background-color: #ffcccc;
        /* 右面 */
        transform: rotateY(90deg) translateZ(50px);
        -webkit-transform: rotateY(90deg) translateZ(50px);
      }

      @keyframes rotateAn {
        0% {
          transform: rotateX(30deg) rotateY(0deg);
          -webkit-transform: rotateX(30deg) rotateY(0deg);
        }
        100% {
          transform: rotateX(30deg) rotateY(360deg);
          -webkit-transform: rotateX(30deg) rotateY(360deg);
        }
      }
...

  • 这里要注意的是,每一面的旋转度数和z轴移动距离,刚好能组成一个正方形
  • 这里添加了动画效果能更直观的查看效果。

效果图

创建外框

      /* 外框 */
      .outsideBox{
        width: 200px;
        height: 200px;
        position: absolute;

        /* 修改子元素 为3D变换 */
        -webkit-transform-style: preserve-3d;
        transform-style: preserve-3d;
      }
      .outsideBox .inner{
        width: 200px;
        height: 200px;
        position: absolute;
        background: #fff;
        border:1px solid #ccc;
        position: absolute;
        left: 0;
        top: 0;
        opacity: 0.2;
      }

      .outsideBox .inner:nth-child(1) {
        background-color: #ccffff;
        /* 正面 */
        transform: translateZ(100px);
        -webkit-transform: translateZ(100px);
      }
      .outsideBox .inner:nth-child(2) {
        background-color: #ccccff;
        /* 背面 */
        transform: rotateX(180deg) translateZ(100px);
        -webkit-transform: rotateX(180deg) translateZ(100px);
      }
      .outsideBox .inner:nth-child(3) {
        background-color: #99ffff;
        /* 下面 */
        transform: rotateX(-90deg) translateZ(100px);
        -webkit-transform: rotateX(-90deg) translateZ(100px);
      }
      .outsideBox .inner:nth-child(4) {
        background-color: #99ffcc;
        /* 上面 */
        transform: rotateX(90deg) translateZ(100px);
        -webkit-transform: rotateX(90deg) translateZ(100px);
      }
      .outsideBox .inner:nth-child(5) {
        background-color: #ffccff;
        /* 左面 */
        transform: rotateY(-90deg) translateZ(100px);
        -webkit-transform: rotateY(-90deg) translateZ(100px);
      }
      .outsideBox .inner:nth-child(6) {
        background-color: #ffcccc;
        /* 右面 */
        transform: rotateY(90deg) translateZ(100px);
        -webkit-transform: rotateY(90deg) translateZ(100px);
      }

      /* 展开效果 */
      .outsideBox:hover .inner:nth-child(1) {
        /* 正面 */
        transform: translateZ(200px);
        -webkit-transform: translateZ(200px);
        opacity: 0.8;
        
      }
      .outsideBox:hover .inner:nth-child(2) {
        /* 背面 */
        transform: rotateX(180deg) translateZ(200px);
        -webkit-transform: rotateX(180deg) translateZ(200px);
        opacity: 0.8;
      }
      .outsideBox:hover .inner:nth-child(3) {
        /* 下面 */
        transform: rotateX(-90deg) translateZ(200px);
        -webkit-transform: rotateX(-90deg) translateZ(200px);
        opacity: 0.8;
      }
      .outsideBox:hover .inner:nth-child(4) {
        /* 上面 */
        transform: rotateX(90deg) translateZ(200px);
        -webkit-transform: rotateX(90deg) translateZ(200px);
        opacity: 0.8;
      }
      .outsideBox:hover .inner:nth-child(5) {
        /* 左面 */
        transform: rotateY(-90deg) translateZ(200px);
        -webkit-transform: rotateY(-90deg) translateZ(200px);
        opacity: 0.8;
      }
      .outsideBox:hover .inner:nth-child(6) {
        /* 右面 */
        transform: rotateY(90deg) translateZ(200px);
        -webkit-transform: rotateY(90deg) translateZ(200px);
        opacity: 0.8;
      }
  • 每一面的 旋转度数和z轴移动距离,刚好能组成一个正方形。
  • :hover中面的旋转度数和之前相同,增加z轴移动距离,鼠标移入后实现展开效果。
  • div中添加图片就是相册效果了。 效果图