魔方
旋转魔方
老师授课的时候是将代码都写在html中,为了今后更好地熟练掌握html与css以及js文件之间的联系,我将代码分开编写了。
html文档中:
<link rel="stylesheet" type="text/css" href="css/***.css">
<script type="text/javascript" src="js/***.js">JS</script>
HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>JS学习-魔方</title> <link rel="stylesheet" type="text/css" href="css/***.css"> </head> <body> <!-- 容器 --> <div id="container"> <!-- 父元素,舞台box --> <div id="box"> <!-- 父容器6个box-page --> <div class="box-page top"></div> <div class="box-page bottom"></div> <div class="box-page right"></div> <div class="box-page left"></div> <div class="box-page front"></div> <div class="box-page back"></div> </div> </div> <script type="text/javascript" src="js/***.js">JS</script> </body> </html>
div是一个块级元素;
一个容器、一个舞台——魔方,div选用id属性;
6个父容器——魔方的六个面,div选用class类,设计小技巧:每个都设为box-page+位置。
CSS
*{ margin: 0; padding: 0; } #body{} #container{ width: 400px; height: 400px; border: 1px solid #fff; /*上下150 居中*/ margin: 150px auto; } #box{ width: 400px; height: 400px; /*控制子元素保持3d转换*/ transform-style: preserve-3d; /*测试代码*/ /*transform: rotateX(45deg) rotateY(45deg);*/ animation: ro 4s linear infinite; /*有透视*/ /*perspective: 100px;*/ } /*设置动画*/ @keyframes ro{ 0%{ transform: rotateX(0deg) rotateY(0deg); } 100%{ transform: rotateX(360deg) rotateY(360deg); } } /*通用样式*/ .box-page{ width: 400px; height: 400px; position: absolute; /*控制子元素保持3d转换*/ transform-style: preserve-3d; } .top{ /*background-color: red;*/ transform: translateZ(200px); } .bottom{ /*background-color: yellow;*/ transform: translateZ(-200px) rotateX(180deg); } .right{ /*background-color: green;*/ transform: translateX(200px) rotateY(90deg); } .left{ /*background-color: blue;*/ transform: translateX(-200px) rotateY(-90deg); } .front{ /*background-color: purple;*/ transform: translateY(200px) rotateX(-90deg); } .back{ /*background-color: brown;*/ transform: translateY(-200px) rotateX(90deg); } .box-page div:nth-child(1){ animation: a1 4s ease-in; } .box-page div:nth-child(2){ animation: a1 4s ease-in 0.5s; } .box-page div:nth-child(3){ animation: a1 4s ease-in 1s; } .box-page div:nth-child(4){ animation: a1 4s ease-in 1.5s; } @keyframes a1{ 0%{ transform: translateZ(0px) scale(1) rotateZ(0deg); } 20%{ transform: translateZ(300px) scale(0) rotateZ(720deg); } 90%{ transform: translateZ(300px) scale(0) rotateZ(720deg); } 100%{ transform: translateZ(0px) scale(1) rotateZ(0deg); } }
设置容器#container、舞台#box、父容器.box-page的相关属性,确定魔方的大小以及它在页面的排布;
魔方每个面的排布,.top .bottom .right 等。
设置动画@keyframes+3d+transform
ro:魔方的旋转
a1:魔方每个面的飞起(这里是2*2,四个面)
呈现效果:(1)一个面每个小方块依次飞出去,飞回来;(2)舞台保持旋转;(3)如何重复(1)
JavaScript
//每个面包含九个元素,每个图片表示的背景图片的位置是不一样的 var arr = document.querySelectorAll(".box-page");//获取文档中的元素 //遍历6个面 for (var n = 0 ; n < arr.length ; n++) { for(var r = 0 ; r < 2 ; r++){ for(var c = 0 ; c < 2 ; c++){ //创建元素 var divs = document.createElement("div"); divs.style.cssText = "width:200px; height:200px; border:2px solid #fff; box-sizing:border-box; position:absolute; background-image:url(images/a"+n+".jpg); background-size: 400px 400px ; "; //距离左侧的距离,列数 divs.style.left = c*200 + "px"; //距离顶端的距离 divs.style.top = r*200 + "px"; //背景图像偏移:显示对应的图片,向左移动 divs.style.backgroundPositionX = -c*200+"px"; //向上移动 divs.style.backgroundPositionY= -r*200+"px"; //追加到面上,添加到dom树 arr[n].appendChild(divs); } } }
魔方添加图片,for循环2*2遍历。
创建元素、每个方块的位置;
图片偏移,显示完整的图片。
!记得将上述内容添加到dom树!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程