js和css3实现动态魔方的效果

简介: js和css3实现动态魔方的效果

实现效果


静态效果



动态效果



实现代码


思路


1.构建静态魔方


首先设置css属性transform-style为preserve-3d,让元素位于3d空间中。然后使用css3中的平移和旋转对每个面分别操作来构建出立体魔方,最后使用js来给每个面设置背景图(注意:魔方用到的6张图片都存放在img目录下,并且需要统一命名为a0,a1…a5,方便遍历)。


2.动态魔方


使用css3的animation设置动画。


完整代码

<!DOCTYPE html>
<html>
<head>
  <title>魔方</title>
  <meta charset="utf-8">
  <style type="text/css">
    *{
      margin: 0;
      padding: 0;
    }
    body{
      width: 100%;
      height: 100%;
      background: radial-gradient(#fff, red); 
    }
    .container{
      width:300px;
      height:300px;
      margin:200px auto;
      perspective:20000px;
    }
    .box{
      width:300px;
      height:300px;
      border:1px solid transparent;
      box-sizing: border-box;
      position:relative;
      transform-style:preserve-3d;
      /*transform:rotateX(30deg) rotateY(30deg);*/
      animation: rotate 10s linear infinite;
    }
    @keyframes rotate{
      100%{
        transform:rotatex(360deg) rotatey(360deg) rotatez(360deg);
      }
    }
    .box-page{
      width: 300px;
      height: 300px;
      position:absolute;
      box-sizing: border-box;
      transform-style:preserve-3d;
    }
    .top{
      transform: translateZ(150px);
    }
    .bottom{
      transform: translateZ(-150px) rotateX(180deg);
    }
    .right{
      transform: translateX(150px) rotateY(90deg);
    }
    .left{
      transform: translateX(-150px) rotateY(-90deg);
    }
    .after{
      transform: translateY(-150px) rotateX(90deg);
    }
    .before{
      transform: translateY(150px) rotateX(-90deg);
    }
    .box-page div:first-child,.box-page div:nth-child(3),.box-page div:nth-child(5),.box-page div:nth-child(7),.box-page div:nth-child(9){
      transform: rotateY(0deg);
        animation: rotatey 6s linear infinite;
    }
    @keyframes rotatey{
      20%{
        transform: rotateY(0deg);
        background-size: 300px 300px;
      }
      40%{
        /*background-image: url("img/img.jpg");*/
        transform: rotateY(540deg);
        background-size: 100px 100px;
      }
      60%{
        /*background-image: url("img/img.jpg");*/
        transform: rotateY(540deg);
        background-size: 100px 100px;
      }
      80%{
        transform: rotateY(0deg);
        background-size:300px 300px;
      }
    }
    .box-page div:nth-child(2),.box-page div:nth-child(4),.box-page div:nth-child(6),.box-page div:nth-child(8){
      transform:rotateX(0deg);
        animation: rotatex 6s linear infinite;
    }
    @keyframes rotatex{
      20%{
        transform: rotateX(0deg);
        background-size: 300px 300px;
      }
      40%{
        /*background-image: url("img/img.jpg");*/
        transform: rotateX(540deg);
        background-size: 100px 100px;
      }
      60%{
        /*background-image: url("img/img.jpg");*/
        transform: rotateX(540deg);
        background-size: 100px 100px;
      }
      80%{
        transform: rotateX(0deg);
        background-size: 300px 300px;
      }
    }
  </style>
</head>
<body>
<div class="container">
  <div class="box">
    <div class="top box-page"></div>
    <div class="bottom box-page"></div>
    <div class="left box-page"></div>
    <div class="right box-page"></div>
    <div class="before box-page"></div>
    <div class="after box-page"></div>
  </div>
</div>
<script type="text/javascript">
  var arr = document.querySelectorAll(".box>div");
  for(var n = 0;n<arr.length;n++){
    for(var i=0;i<3;i++){
      for(var j=0;j<3;j++){
        var divs = document.createElement("div");
        divs.style.cssText = "width:100px;height:100px;border: 1px solid #fff;position:absolute;box-sizing:border-box;background-image:url(img/a"+n+".jpg);background-size: 300px 300px;";
        arr[n].appendChild(divs);
        // 改变每一个div的位置
        divs.style.left = 100*j+"px";
        divs.style.top = 100*i+"px";
        // 改变背景图相应的位置
        divs.style.backgroundPositionX = -j*100+"px";
        divs.style.backgroundPositionY = -i*100+"px";   
      }
    }
  }
</script>
</body>
</html>
相关文章
|
3月前
|
移动开发 前端开发 JavaScript
征信报告修改器,征信报告生成器,制作软件无痕修改软件【js+html+css】
本项目为信用评分模拟器教学工具,采用HTML5实现,仅供学习参考。核心功能通过JavaScript构建,包含虚拟数据生成、权重分配及信用因素分析(如还款记录、信用使用率等)。
|
3月前
|
前端开发 JavaScript
个人征信电子版无痕修改, 个人信用报告pdf修改,js+html+css即可实现【仅供学习用途】
本代码展示了一个信用知识学习系统的前端实现,包含评分计算、因素分析和建议生成功能。所有数据均为模拟生成
|
3月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
3月前
|
前端开发
个人征信PDF无痕修改软件,个人征信模板可编辑,个人征信报告p图神器【js+html+css仅供学习用途】
这是一款信用知识学习系统,旨在帮助用户了解征信基本概念、信用评分计算原理及信用行为影响。系统通过模拟数据生成信用报告,涵盖还款记录
|
3月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
3月前
|
前端开发
医院检查单子p图软件,在线制作仿真病历,js+css+html装逼神器
本示例展示如何用HTML/CSS创建医疗信息页面,内容仅供学习参考。页面模拟“阳光医院体检中心”场景,提供预约功能验证(如姓名、手机号、日期)。所有数据仅用于演示
|
JavaScript 前端开发 数据安全/隐私保护
利用JavaScript来实现用动态检验密码强度
平时我们会在某些网站的注册页面或者更改密码的页面发现当我们输入密码时,会有一个类似于进度条的长条进行提示用户输入的密码强度。如下图: 我看到有些人用几张不同的图片来替换,这样似乎可以,但是不太好。所以我通过其他方式实现。
1231 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
233 2
|
10月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
156 1
JavaScript中的原型 保姆级文章一文搞懂