3D轮播

作者: PYFang | 来源:发表于2018-03-22 10:48 被阅读0次

    目的

    • 掌握 transform 3D 效果
    • 熟悉 perspective属性
    基本概念

    CSS3 3D 转换:使元素改变位置、旋转、视角

    试一试

    先来看一看3D 坐标系
    3D 坐标系如下图:


    • transform: rotateX(40deg) 沿X 坐标轴旋转40度
    • transform: rotateY(40deg) 沿Y 坐标轴旋转40度
    • transform: rotateZ(40deg) 沿Z 坐标轴旋转40度
    • transform: translateX(-40px) 在 X 坐标轴负向移动 40px
    • transform: translateY(40px) 在 Y 坐标轴正向移动 40px
    • transform: translateZ(40px) 在 Z 坐标轴正向移动 40px
    • transform: translateZ(-40px) 在 Z 坐标轴负向移动 40px
        <div class="ct">
        <div class="box origin">origin</div>
        <div class="box rotateX">rotateX(40deg)</div>
        <div class="box rotateY">rotateY(40deg)</div>
        <div class="box rotateZ">rotateZ(40deg)</div>
      </div>
      <div class="ct">
        <div class="box tranlateX">translateX:-40px</div>
        <div class="box tranlateY">translateY:40px</div>
        <div class="box tranlateZ">translateZ:40px</div>
        <div class="box tranlateZ2">translateZ:-40px</div>
      </div>
        // CSS
     .rotateX {
          transform: rotateX(40deg);
        }
        .rotateY {
          transform: rotateY(40deg);
        }
        .rotateZ {
          transform: rotateZ(40deg);
        }
        .tranlateX {
          transform: translateX(-40px);
        }
        .tranlateY {
          transform: translateY(40px);
        }
        .tranlateZ {
          transform: translateZ(40px);
        }
        .tranlateZ2 {
          transform: translateZ(-40px);
        }
    

    效果图如下:


    问题来了?为什么旋转和 Z 轴的偏移没有3D的感觉? 因为没有透视
    perspective

    perspective属性有两种书写形式,一种用在3d元素父亲上;第二种就是用在当前3d元素上,与transform的其他属性写在一起。:
    .ct {
        perspective: 200px;
    }
    或
    #ct .box {
        transform: perspective(200px) rotateY(45deg);
    }
    
    perspective-origin

    perspective-origin定义了元素的位置,默认是3d 容器的中心。
    当为元素定义perspective-origin 属性时,其子元素会获得透视效果,而不是元素本身。
    该属性必须与 perspective 属性一同使用,而且只影响 3D 转换元素,如perspective-origin: 10% 10%;

    设置backface-visibility:hidden;看不见元素的背面

    3D 轮播

    第一步:创建轮播图

    <section class="container">
      <div id="carousel">
        <figure>1</figure>
        <figure>2</figure>
        <figure>3</figure>
        <figure>4</figure>
        <figure>5</figure>
        <figure>6</figure>
        <figure>7</figure>
        <figure>8</figure>
        <figure>9</figure>
      </div>
    </section>
    

    第二步,设置图片视角

    .container {
      width: 210px;
      height: 140px;
      position: relative;
      perspective: 1000px;
    }
    #carousel {
      width: 100%;
      height: 100%;
      position: absolute;
      transform-style: preserve-3d;
    }
    #carousel figure {
      margin: 0;
      display: block;
      position: absolute;
      width: 186px;
      height: 116px;
      left: 10px;
      top: 10px;
      border: 2px solid black;
    }
    

    第三步,移动图片

    #carousel figure:nth-child(1) { transform: rotateY(   0deg ); }
    #carousel figure:nth-child(2) { transform: rotateY(  40deg ); }
    #carousel figure:nth-child(3) { transform: rotateY(  80deg ); }
    #carousel figure:nth-child(4) { transform: rotateY( 120deg ); }
    #carousel figure:nth-child(5) { transform: rotateY( 160deg ); }
    #carousel figure:nth-child(6) { transform: rotateY( 200deg ); }
    #carousel figure:nth-child(7) { transform: rotateY( 240deg ); }
    #carousel figure:nth-child(8) { transform: rotateY( 280deg ); }
    #carousel figure:nth-child(9) { transform: rotateY( 320deg ); }
    
    #carousel figure:nth-child(1) { transform: rotateY(   0deg ) translateZ( 288px ); }
    #carousel figure:nth-child(2) { transform: rotateY(  40deg ) translateZ( 288px ); }
    #carousel figure:nth-child(3) { transform: rotateY(  80deg ) translateZ( 288px ); }
    #carousel figure:nth-child(4) { transform: rotateY( 120deg ) translateZ( 288px ); }
    #carousel figure:nth-child(5) { transform: rotateY( 160deg ) translateZ( 288px ); }
    #carousel figure:nth-child(6) { transform: rotateY( 200deg ) translateZ( 288px ); }
    #carousel figure:nth-child(7) { transform: rotateY( 240deg ) translateZ( 288px ); }
    #carousel figure:nth-child(8) { transform: rotateY( 280deg ) translateZ( 288px ); }
    #carousel figure:nth-child(9) { transform: rotateY( 320deg ) translateZ( 288px ); }
    

    相关文章

      网友评论

          本文标题:3D轮播

          本文链接:https://www.haomeiwen.com/subject/obnoqftx.html