CSS3 3D变换之综合运用 - 3D box
先上效果图吧
点击'roll'按钮,会出现旋转的动画
代码如下
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="JS/jquery-1.12.2.min.js"></script>
<style type="text/css">
div#camera{
width: 500px;
height: 500px;
outline: 1px solid black;
margin:100px auto;
position: relative;
perspective: 1000px;
}
div#camera>div{
width: 400px;
height: 400px;
position: absolute;
top:calc(50% - 200px);
left:calc(50% - 200px);
outline: 1px solid black;
transition: all 1s linear;
background-color: #fff;
}
div#camera>div:nth-child(1){
transform: rotateY(0deg) translateZ(200px);
z-index: 99;
}
div#camera>div:nth-child(2){
transform: rotateY(90deg) translateZ(200px);
}
div#camera>div:nth-child(3){
transform: rotateY(180deg) translateZ(200px);
}
div#camera>div:nth-child(4){
transform: rotateY(270deg) translateZ(200px);
}
div#camera>div>img{
width: 100%;
}
button{
margin: 10px auto;
display: block;
}
</style>
</head>
<body>
<div id="camera">
<div><img src="Img/102342_40949584.png"/></div>
<div><img src="Img/102342_40949584.png"/></div>
<div><img src="Img/102342_40949584.png"/></div>
<div><img src="Img/102342_40949584.png"/></div>
</div>
<button value="roll">roll</button>
<script type="text/javascript">
$(document).ready(function() {
(function() {
var count=0, reversedCount=4;
var changeRotateY = function($ele, deg) {
var index = $ele.index()+1+count;
var deg = deg*index;
$ele[0].setAttribute('style','transform:rotateY('+deg+'deg) translateZ(200px);')
}
$('button[value="roll"]').on('click', function() {
$('div#camera>div').each(function() {
changeRotateY($(this), 90);
});
// changeRotateY($('div#camera>div:nth-child(1)'), 90);
// changeRotateY($('div#camera>div:nth-child(2)'), 90);
// changeRotateY($('div#camera>div:nth-child(3)'), 90);
// changeRotateY($('div#camera>div:nth-child(4)'), 90);
count++;
reversedCount--;
$('div#camera>div').eq(reversedCount%4).css({'z-index':'99'}).siblings().css({'z-index':'0'});
if(reversedCount==0){
reversedCount=4;
}
});
})();
});
</script>
</body>
</html>
稍微解析一下:
CSS部分用来生成静态的三维盒子,#camera下的四个子div分别旋转0°、90°、180°、270°后再以自身旋转后的坐标系为基准
translateZ(200px)
, 相当于四个子div分别向前(也就是正对屏幕的方向)、向右、向后(也就是背向屏幕的方向)、向左移动了200px,由于div本身的尺寸就是400px*400px, 因此做此变换后四个div就围成了一个立体的盒子。此时从上往下看,效果图如下:
这里的
transform
的顺序很重要,如果是先rotateY
再translateZ
, 那么translateZ
是以rotate以后的坐标轴进行平移,这样才能达到前后左右平移的效果; 如果先translateZ
再rotateY
, 那么所有元素都会先平移,然后在一个位置上进行旋转了!changeRotateY
函数用来改变div的旋转角度,根据该元素的eq
和传入的count
值(按钮被点击的次数)来设置元素的rotateY
的值。由于遇到了动态获取transform
值的问题这里的函数灵活性不高,有点遗憾。 第一次点击的时候,count
为0,index()
为0的元素的rotateY
会从0°增加到90°,index()
为1的元素的rotateY
会从90°增加到180°,and so on; 第二次点击,count
为1, 上述值会各增加90°,完成无限旋转的效果;遇到的一个很大的问题就是转到后面的元素依旧会显示出来。 试过
background-color
和backface-visibility:hidden
都不怎么好用,尤其是backface-visibility
, 转到90度的时候还是显示的,在90.01°时才会隐藏backface, 如果想用backface-visibility
来隐藏后面元素的话得fine-tune, 还会引起稍微的错位问题,遂放弃;最后使用的是
z-index
来隐藏后面的元素, 动态设置转到最前面的元素的z-index
为较大值。注意z-index
属性不对position
为static
的元素起作用。 当然我们这里的div们都是absolute
,所以就能应用得很好啦~要显示的元素的
eq
值分别为3、2、1、0,当然直接用递增的count
变量+switch
/if else
语句也能做,但陡减可读性; 取而代之的是增加了一个递减的reversedCount
变量,它来负责匹配每次要设置z-index
的元素。
欢迎转载,请注明出处。
参考资料:玩轉 CSS 3D - 原理篇
原文地址:https://www.cnblogs.com/homehtml/p/12941829.html
- 《C#并发编程经典实例》笔记
- 用mysqlslap进行mysql压力测试
- 域名Matrix.io以20万元结拍,被搭建区域链相关网站
- 结合ABP源码实现邮件发送功能
- Discuz!关于出现“对不起,您安装的不是正版应用”的解决办法
- 利用C#迭代器的一个杨辉三角示例
- 计算机组成原理之机器
- Elasticsearch 健康状态处理
- 开始菜单中没有运行时怎么办
- Elasticsearch 的一些关键概念
- Elasticsearch 相关 api 操作
- 【前端开发系列】—— 文字阴影与样式
- Elasticsearch 在 windows 和 ubuntu 下详细安装过程
- 【前端开发系列】—— 利用选择器添加内容
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- Swagger技术(接口文档实时动态生成工具)
- 大数据学习之Linux基础
- Spring全家桶之SpringData——Spring Data JPA
- 异常 object references an unsaved transient instance - 的解决
- Spring的底层源码分析
- Mybatis的源码分析
- Tomcat的源码分析
- Servlet的源码分析
- 设计模式之行为型模式
- 设计模式之结构型模式
- 设计模式之建造者模式与原型模式
- 设计模式之工厂模式
- Solr在分布式环境中的应用
- Docker基础与实战,看这一篇就够了
- org.springframework.beans.factory.NoSuchBeanDefinitionException: