transform的3D效果实现

一:立方体及其旋转效果

原理:构建一个立方体,四方体共有六个面,采用定位及其位移旋转实现。

<div class="rect-wrap">  
    <div class="container">    
      <div class="top slide"><img src="images/17.jpg" title="上面" alt="上面"/></div>
        <div class="bottom slide"><img src="images/18.jpg" title="下面" alt="下面"/></div>
        <div class="left slide"><img src="images/19.jpg" title="左面" alt="左面"/></div>
        <div class="right slide"><img src="images/20.jpg" title="右面" alt="右面"/></div>
        <div class="front slide"><img src="images/21.jpg" title="前面" alt="前面"/></div>
        <div class="back slide"><img src="images/24.jpg" title="后面" alt="后面"/></div>
    </div>

</div>

css样式:

.rect-wrap {
    position: relative;
    perspective: 1600px;
}
/*容器*/
.container {
    width: 800px;
    height: 800px;
    transform-style: preserve-3d;
    /*设置3d空间的原点在平面中心再向Z轴移动200px的位置*/
    transform-origin: 50% 50% 200px; 
    margin: auto;
}
/*立方体的每个面*/
.slide {
    width: 400px;
    height: 400px;
     /*定位,使其六个面折叠在一起*/
    position: absolute;
    left: 200px;
    top: 100px;
}
.slide img{
width: 100%;
height: 100%;

}

        实现方法,六个面重叠,以前面的一个面为准,向前移动200px,向后沿着Z轴移动200px构建前后面;左右各沿着Y轴旋转90度,前后沿着Z移动200px构建左右面;上下各沿着X轴旋转90度,上下沿Z轴移动200px构建上下面。构造四方体成功。

/*前面*/
.front{
background: green;
transform: translateZ(200px);
}
/*后面*/
.back{
background: blue;
transform: translateZ(-200px);
}
/*左面*/
.left{
background: red;
transform: rotateY(90deg) translateZ(-200px);
}
/*右面*/
.right{
background: purple;
transform: rotateY(90deg) translateZ(200px);
}
/*上面*/
.top{
background: black;
transform: rotateX(90deg) translateZ(200px);
}
/*下面*/
.bottom{
background: orange;
transform: rotateX(90deg) translateZ(-200px);

}

如果使四方体旋转可以在包含面的容器内加动画效果使其自动转动。

知识点
知识点说明
 perspective3D元素距离视图的距离,以像素计,其子元素会获得透视效果而不是元素本身,只影响3D元素效果(近大远小)
  transform-style指定元素在3D空间中的呈现,flat指所有子元素在2D平面上呈现,preserve-3d指所有子元素在3D空间上呈现
transform-origin允许转换被改变元素的位置,必须和transform属性一同使用
transform向元素应用2D或3D转换,允许对元素进行缩放、移动、旋转、倾斜

@keyframes用于创建动画,规定某项css的样式,创建由当前样式转换为新样式的动画效果,必须规定动画名称和动画时长
animation
二:旋转木马

<section class="container">
 <div id="carousel">
   <figure><img src="images/17.jpg"/></figure>
   <figure><img src="images/18.jpg"/></figure>
   <figure><img src="images/19.jpg"/></figure>
   <figure><img src="images/20.jpg"/></figure>
   <figure><img src="images/21.jpg"/></figure>
   <figure><img src="images/22.jpg"/></figure>
   <figure><img src="images/23.jpg"/></figure>
   <figure><img src="images/24.jpg"/></figure>
   <figure><img src="images/25.jpg"/></figure>
 </div>
</section> 

    基本结构和立方体的构造一致

            难点:如何确定旋转的圆心,旋转中心,(借鉴)各位大神的。将此图看做为一个平面,则各条虚线交汇点即为旋转的中心。根据个数计算每张图之间的旋转角度,即为360deg/个数;计算Z住距离旋转中心距离,即为tan(度数/2)=规定图边长的一半/r。


.container {
 width: 210px;
 height: 140px;
 position: relative;
 perspective: 3000px;
 perspective-origin: 50%;
 margin: auto;
}
#carousel {
 width: 100%;
 height: 100%;
 position: absolute;
 transform-style: preserve-3d;
 transition: 1s;
}
 
#carousel figure {
 display: block;
 position: absolute;
 width: 186px;
 height: 116px;
 border: 2px solid black;
 text-align: center;
 line-height: 116px;
 font-size: 40px;
}
#carousel figure img{
width: 100%;
height: 100%;
}
#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 ); }          

给定计时器使其自动旋转

let degG=0;
function timer(){
degG -= 40;
$("#carousel").css({transform: "translateZ(-288px )  rotateY( "+degG+"deg )"});
}

setInterval(timer,2000); 


参考地址: https://github.com/yijianchuanxinwq/transform3D.git




  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
transform3d 可以用来实现翻页效果,具体实现方法如下: 1. 定义 HTML 结构 ```html <div class="book"> <div class="page page1"></div> <div class="page page2"></div> <div class="page page3"></div> <div class="page page4"></div> </div> ``` 2. 添加 CSS 样式 ```css .book { position: relative; width: 500px; height: 300px; perspective: 1000px; } .page { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #fff; box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); transform-origin: left center; transition: transform 0.5s; } .page1 { z-index: 1; transform: rotateY(0deg); } .page2 { z-index: 2; transform: rotateY(-180deg); } .page3 { z-index: 3; transform: rotateY(-360deg); } .page4 { z-index: 4; transform: rotateY(-540deg); } ``` 3. 编写 JavaScript 代码 ```javascript const pages = document.querySelectorAll('.page'); let currentPage = 1; function nextPage() { if (currentPage < pages.length) { pages[currentPage - 1].style.transform = 'rotateY(-180deg)'; currentPage++; pages[currentPage - 1].style.transform = 'rotateY(0deg)'; } } function prevPage() { if (currentPage > 1) { pages[currentPage - 1].style.transform = 'rotateY(-360deg)'; currentPage--; pages[currentPage - 1].style.transform = 'rotateY(0deg)'; } } document.querySelector('.prev-btn').addEventListener('click', prevPage); document.querySelector('.next-btn').addEventListener('click', nextPage); ``` 4. 添加翻页按钮 ```html <button class="prev-btn">上一页</button> <button class="next-btn">下一页</button> ``` 通过点击上一页和下一页按钮,可以实现翻页效果。具体效果可以参考下面的链接: https://codepen.io/mattsince87/pen/exByn

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值