中秋特辑——3D动态礼盒贺卡(可监听鼠标移动)

2023-09-22 14:15:29

前言

在这里插入图片描述
「作者主页」雪碧有白泡泡
「个人网站」雪碧的个人网站
「推荐专栏」

java一站式服务
React从入门到精通
前端炫酷代码分享
从0到英雄,vue成神之路
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
数据流通的精妙之道
后端进阶之路

请添加图片描述

先上效果

简单预览

在这里插入图片描述

这里可以直接 看查源码内容, 刷新,最后一个是 放大**跳转网页** 点击运行后即可有如下效果,拖动鼠标即可

在这里插入图片描述
可随鼠标移动

核心代码

script代码

<script>
  var top=document.getElementById('top')
  var content=document.getElementById('content')
  var card=document.getElementById('card')
  var imgBox=document.getElementById('imgBox')
  top.addEventListener("click", ()=>{
    addClass(content,'moveOut')
    setTimeout(()=>{
      addClass(card,'showCard')
    },500)
  })
  card.onmouseover=()=>{
    toggleClass(imgBox,'imgBoxAct')
  }
  card.onmouseout=()=>{
    toggleClass(imgBox,'imgBoxAct')
  }
  function hasClass(obj,cls) {  
      return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));  
  };  
  function addClass(obj,cls) {  
      if (!hasClass(obj,cls)) obj.className += " " + cls;  
  }  
  Object.prototype.removeClass = function removeClass(obj,cls) {  
      if (hasClass(obj,cls)) {  
          var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');  
          obj.className = obj.className.replace(reg, ' ');  
      }  
  };  
  function toggleClass(obj,cls){  
      if(this.hasClass(obj,cls)){  
          this.removeClass(obj,cls);  
      }else{  
          this.addClass(obj,cls);  
      }  
  };
</script>

代码解释

  1. top 元素被点击时,给 content 元素添加 moveOut 类,并在 500 毫秒后给 card 元素添加 showCard 类。

  2. 当鼠标移动到 card 元素上时,给 imgBox 元素添加 imgBoxAct 类;当鼠标移出 card 元素时,移除 imgBoxAct 类。

  3. 定义了四个函数:

    • hasClass(obj, cls):判断 obj 元素是否包含 cls 类。

    • addClass(obj, cls):给 obj 元素添加 cls 类。

    • Object.prototype.removeClass:给 obj 元素移除 cls 类。

    • toggleClass(obj, cls):如果 obj 元素包含 cls 类,则移除该类;否则添加该类。
      在这里插入图片描述

部分css代码

这段代码是一个CSS样式表,用于设计一个网页的背景和一个卡片的样式。以下是每个部分的解释:

.bg{
  width: 100vw;
  height: 100vh;
  background:#f39c72;
  padding-top: 140px;
  font-family: "楷体","楷体_GB2312";
}

这段代码定义了一个类名为“bg”的元素,它的宽度和高度分别为视口的宽度和高度,背景颜色为橙色,顶部有一个内边距为140像素的空白区域,字体为“楷体”。

.bg:before{
  background-size:cover;
  background:url(../images/moonCakeBg.png) repeat center;
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  right:0;
  left:0;
  animation:bgMove 10s infinite linear;
}

这段代码定义了一个伪元素,它是“bg”元素的前置元素。它的背景图片是一个月饼的图片,重复平铺,居中对齐。它的位置是绝对定位,占据整个视口,有一个名为“bgMove”的动画,持续时间为10秒,无限循环,线性变化。

.card{
  position:absolute;
  z-index: 4;
  width:350px;
  height:600px;
  left:50%;
  top:50%;
  display: none;
  cursor: pointer;
  transform:translate(-50%,-50%);
  background: url(../images/cardBg2.png)no-repeat;
  background-size:100% 100%;
  transform-style:preserve-3d;
  perspective:1700px;
  background-color:#6375fd;
  box-shadow:inset 300px 0 50px rgba(0,0,0,.5),0 20px 100px rgba(0,0,0,.5);
  transition:1s;
}

这段代码定义了一个类名为“card”的元素,它是一个卡片。它的位置是绝对定位,居中对齐。它的宽度和高度分别为350像素和600像素。它的背景图片是一个蓝色的图片,不重复平铺,居中对齐。它的变换样式是3D保留,透视点距离为1700像素。它的背景颜色是深蓝色,有一个阴影效果。它的过渡效果持续1秒。

.card:hover{
  /* perspective:2000px; */
  box-shadow:inset 20px 0 50px rgba(0,0,0,.5),0 20px 100px rgba(0,0,0,.5);
}

这段代码定义了当鼠标悬停在“card”元素上时的样式。它的阴影效果会变化。

.card .imgBox{
  width:100%;
  height:100%;
  position:relative;
  transform-origin:left;
  background: url(../images/ByteDance.png)no-repeat;
  background-size:100% 100%;  
  transition:1s;
}
.imgBoxAct{
  background: url(../images/cardBg1.png)no-repeat!important;
  background-size:100% 100%!important; 
  
}
.card:hover .imgBox{
  transform:rotatey(-135deg);
}

这段代码定义了一个类名为“imgBox”的元素,它是“card”元素的子元素,用于显示卡片的图片。它的宽度和高度分别为100%。它的位置是相对定位。它的变换原点是左侧。不重复平铺,居中对齐。它的过渡效果持续1秒。当鼠标悬停在“card”元素上时,它会旋转135度。此外,还定义了一个类名为“imgBoxAct”的元素,用于显示卡片的背景图片。

.card .details{
  position:absolute;
  top:0;
  left:0;
  box-sizing:border-box;
  z-index:-1;
  transition: all .2s ease-in-out;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  width: 100%;
  height: 100%;
  padding: 130px 40px 50px;
}
.detailsContent p{
  font-size: 16px;
  line-height: 24px;
  color: #302a28;
}
.card .details:hover{
  transform: scale(1.1);
  text-shadow:10px 40px 50px #6375fd;
}
h3{
  font-size: 24px;
  line-height: 24px;
  color: #2d6da7;
}
p{
  font-size: 14px;
  line-height: 8px;
  color: #2d6da7;

}

这段代码定义了一个类名为“details”的元素,它是“card”元素的子元素,用于显示卡片的详细信息。它的位置是绝对定位,左上角对齐。它的盒模型是border-box。它的z-index为-1,表示它在“card”元素的下方。它的过渡效果持续0.2秒。它的子元素是一个标题和一段文本。当鼠标悬停在“details”元素上时,它会放大1.1倍,并且有一个文本阴影效果。

.showCard{
  display: block!important;
  animation: showCard 1s  linear!important;
  animation-fill-mode:forwards!important;
}
@keyframes bgMove{
  0%{
    background-position:0px 0px;
  }
   100%{
    background-position:200px 298px;
  }
}
@keyframes showCard{
  0%{
    transform:translate(-80%,140%) scale(1);
  }
  70%{
    transform:translate(-10%,-40%) scale(1.4);
  }
   100%{
    transform:translate(-10%,-50%) scale(1.2);
  }
}

这段代码定义了一个类名为“showCard”的元素,用于显示卡片。它的显示方式为块级元素。它有一个名为“showCard”的动画,持续时间为1秒,线性变化。动画结束后,元素的状态将保持在最后一帧。此外,还定义了两个关键帧动画,分别是“bgMove”和“showCard”。其中,“bgMove”用于控制背景图片的移动,“showCard”用于控制卡片的显示效果。
在这里插入图片描述

精彩福利

在这里插入图片描述

点击下方地址进入,里面有送书活动还有百度周边放送
链接地址可以私信我进群哦请添加图片描述

更多推荐

ChatGLM GPT原理介绍

图解GPT除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/)能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Tra

布局设计和实现:计算器UI【TableLayout、GridLayout】

一、使用TableLayout实现计算器UI1.新建一个空白项目布局根据自己的需求输入其他信息填写完成后,点击Finish即可2.设计UI界面在res/layout文件夹中的XML文件中创建UI界面。在这个XML文件中,您可以使用TableLayout来设计计算器界面。2.1创建layout文件夹但是默认创建出来的项目

Window 10安装MySQL 5.7

1、访问如下链接进行下载:Mysql官方下载地址官方地址下载的东西没有那么多病毒~。这东西见仁见智吧哈哈~。有些人不怕这个。注意安装上面这个下面的是test2、填写mysql的环境变量具体操作步骤如下:在桌面按下快捷键“Win+R”输入“controlsysdm.cpl,EnvironmentVariables”并点击

HEC-RAS 1D/2D水动力与水环境模拟教程

详情点击公众号技术科研吧链接:HEC-RAS1D/2D水动力与水环境模拟教程前言水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而,一方面水动力和水环境模型的使用非常复杂,理论繁复;另一方面,免费的水动力和水环境软件往往缺少重要功能,而商业软件则非常昂贵。H

泡泡玛特海外布局动作不断,开启东南亚潮玩盛会

近日,泡泡玛特海外布局动作不断,9月8日至10日,泡泡玛特2023PTS潮流玩具展(下简称新加坡PTS)在新加坡滨海湾金沙成功举办,现场人气爆棚,三天吸引了超过2万观众入场,这也是泡泡玛特首次在海外举办大型潮玩展。9月20日,泡泡玛特泰国首店盛大开业,吸引超千名粉丝现场排队,并在当地社交媒体引发热议。实际上,泡泡玛特泰

python浮点数比较的三种方法

在Python中,由于浮点数在计算机内部的表示方式是二进制的,因此进行浮点数比较时可能会出现精度问题。为了解决这个问题,你可以使用以下几种方法来比较浮点数:使用近似比较:通过设置一个小的误差范围,在比较两个浮点数时,判断它们的差是否在这个误差范围内。例如,你可以定义一个epsilon值(即允许的误差范围)来比较两个浮点

国产自研BI系统,更懂中国企业数据分析需求

国产自研BI系统是指由中国企业自主研发的商业智能(BI)系统,这类系统更加了解中国企业的数据分析需求,能够提供更加贴合实际的解决方案。比如说奥威BI系统就是典型的国产自研,不仅了解中国企业的数据分析需求,还根据多年的经验为中国企业量身打造了多套标准化的BI数据分析解决方案,为中国企业提供更低风险、高效性、高性价比的智能

分布式锁实现方法

分布式锁什么时候需要加锁有并发,多线程有写操作有竞争关系场景:电商系统,下单流程:用户下单–>秒杀系统检查redis商品库存信息–>用户锁定并更新库存(mysql)—>秒杀系统更新redis问题:单机部署,单线程执行无问题,多线程并发操作会引起超卖解决:对用户下单后的步骤加锁,让线程排队,避免超卖(synchroniz

Caddy Web服务器深度解析与对比:Caddy vs. Nginx vs. Apache

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

电脑桌面透明便签软件是哪个?

在现代快节奏的工作环境中,许多上班族都希望能够在电脑桌面上方便地记录工作资料、重要事项、工作流程等内容。为了解决这个问题,一款优秀的电脑桌面便签软件是必不可少的。在选择桌面便签软件时,许多用户也希望便签软件能够与电脑桌面壁纸相统一,提升桌面美观度。那么,桌面便签软件哪个好用?有没有一款支持透明皮肤的电脑桌面便签软件值得

Java对比对象修改前与修改后字段发生的变化

开发过程中,我们通常会对系统操作人对系统的操作进行记录,记录操作前后某个字段的变化,如下图2.提供一个工具类,可以比较一个对象里面,源对象,与修改后的对象,有哪些字段发生了改变,第一步/***@authorqiankun.hu*@version1.0.0*@createTime2023年09月20日17:00:00*@

热文推荐