前端练习小项目——包变脸的,老弟 !

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922

        前言:在学习完HTML、CSS、JavaScript之后,我们就可以开始做一些小项目了,本篇文章所讲的小项目为——包变脸的,老弟。
   

  ✨✨✨这里是秋刀鱼不做梦的BLOG
  ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
  先让我们看一下结果:


        那么我们怎样去实现这样的小案例呢?在下文中我们对每一段重要的代码都进行了解释,读者可以根据解释对代码进行明白。

1.骨架 —— HTML代码

HTML代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1">
  7.     <title>秋刀鱼不做梦</title>
  8.     <!-- 引入外部样式表 -->
  9.     <link rel="stylesheet" href="./表情.css">
  10. </head>
  11. <body>
  12.     <!-- 表情图标的列表 -->
  13.     <ul id="emoji">
  14.         <!-- 第一层,深度为0.2 -->
  15.         <li class="layer" data-depth="0.2">
  16.             <!-- 面部 -->
  17.             <div class="face"></div>
  18.         </li>
  19.         <!-- 第二层,深度为0.3 -->
  20.         <li class="layer" data-depth="0.3">
  21.             <!-- 光泽 -->
  22.             <div class="shine"></div>
  23.         </li>
  24.         <!-- 第三层,深度为0.8 -->
  25.         <li class="layer" data-depth="0.8">
  26.             <!-- 左眼 -->
  27.             <div class="eye left"></div>
  28.         </li>
  29.         <!-- 第三层,深度为0.8 -->
  30.         <li class="layer" data-depth="0.8">
  31.             <!-- 右眼 -->
  32.             <div class="eye right"></div>
  33.         </li>
  34.         <!-- 第三层,深度为0.8 -->
  35.         <li class="layer" data-depth="0.8">
  36.             <!-- 嘴巴 -->
  37.             <div class="mouth"></div>
  38.         </li>
  39.     </ul>
  40. </body>
  41. </html>
复制代码
        固然,当我们搭建好HTML骨架之后,我们现在还是看不到任何的结果的,接下来然我们对其进行修饰。

2.修饰 —— CSS代码

CSS代码:
  1. :root {
  2.     --shine: rgb(251, 136, 200); /* 定义自定义属性:光泽颜色 */
  3.     --primary-color: rgb(248, 175, 40); /* 定义自定义属性:主色 */
  4.     --secondary-color: rgb(230, 63, 2); /* 定义自定义属性:次色 */
  5.     --accent-color: rgb(58, 25, 25); /* 定义自定义属性:强调色 */
  6.     --black-fade: rgb(120, 40, 6); /* 定义自定义属性:淡化的黑色 */
  7.     --dark-blue: rgb(84, 84, 174); /* 定义自定义属性:深蓝色 */
  8. }
  9. * {
  10.     padding: 0; /* 重置所有元素的内边距为0 */
  11.     margin: 0; /* 重置所有元素的外边距为0 */
  12.     list-style: none; /* 去掉列表项的默认样式 */
  13. }
  14. body {
  15.     display: flex; /* 采用flex布局 */
  16.     align-items: center; /* 垂直方向居中 */
  17.     justify-content: center; /* 水平方向居中 */
  18.     height: 100vh; /* 高度设为视口高度 */
  19.     overflow: hidden; /* 隐藏超出视口的内容 */
  20.     background-color: #9197f1; /* 设置背景颜色为淡紫色 */
  21. }
  22. #emoji {
  23.     position: relative; /* 相对定位 */
  24.     width: 450px; /* 宽度设为450像素 */
  25.     height: 400px; /* 高度设为400像素 */
  26.     transform: translate3d(0, 0, 0); /* 启用3D转换,保持默认值 */
  27. }
  28. .layer {
  29.     position: absolute; /* 绝对定位 */
  30.     width: 100%; /* 宽度设为父元素的100% */
  31.     height: 100%; /* 高度设为父元素的100% */
  32. }
  33. .face {
  34.     position: absolute; /* 绝对定位 */
  35.     top: 0; right: 0; bottom: 0; left: 0; /* 四边都设为0以居中 */
  36.     margin: auto; /* 自动计算外边距,以保证居中 */
  37.     width: 230px; /* 宽度设为230像素 */
  38.     height: 230px; /* 高度设为230像素 */
  39.     background-color: #FECA32; /* 设置背景颜色为黄色 */
  40.     border-radius: 100%; /* 圆形边框 */
  41.     box-shadow: inset rgba(0, 0, 0, 0.4) 0 0 30px; /* 内部投影,制造深度感 */
  42.     transition: .3s; /* 设置过渡效果时间为0.3秒 */
  43. }
  44. .shine {
  45.     position: absolute; /* 绝对定位 */
  46.     top: 0; right: 0; bottom: 0; left: 0; /* 四边都设为0以居中 */
  47.     margin: auto; /* 自动计算外边距,以保证居中 */
  48.     width: 194px; /* 宽度设为194像素 */
  49.     height: 206px; /* 高度设为206像素 */
  50.     background: linear-gradient(to bottom, #FFFFFF,
  51.             rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0)); /* 设置线性渐变背景 */
  52.     border-radius: 100%; /* 圆形边框 */
  53.     opacity: 0.8; /* 设置不透明度为0.8 */
  54. }
  55. .eye {
  56.     width: 24px; /* 眼睛的宽度 */
  57.     height: 38px; /* 眼睛的高度 */
  58.     background-color: #A1620F; /* 眼睛的背景颜色 */
  59.     border-radius: 100%; /* 圆形边框 */
  60.     box-shadow: inset rgba(0, 0, 0, 0.5) 0 6px 12px,
  61.         rgba(255, 255, 255, 0.2) 0 2px 0 2px; /* 内部和外部的阴影 */
  62.     transition: .3s; /* 过渡效果时间为0.3秒 */
  63. }
  64. .eye.left {
  65.     position: absolute; /* 绝对定位 */
  66.     top: 0; right: 70px; bottom: 40px; left: 0; /* 通过设置边距实现眼睛的位置 */
  67.     margin: auto; /* 自动计算外边距,以保证居中 */
  68. }
  69. .eye.right {
  70.     position: absolute; /* 绝对定位 */
  71.     top: 0; right: 0; bottom: 40px; left: 70px; /* 通过设置边距实现眼睛的位置 */
  72.     margin: auto; /* 自动计算外边距,以保证居中 */
  73. }
  74. .left::before {
  75.     content: ""; /* 添加伪元素 */
  76.     position: absolute; /* 绝对定位 */
  77.     z-index: 3; /* 设置堆叠顺序 */
  78.     width: 100px; /* 宽度设为100像素 */
  79.     height: 85px; /* 高度设为85像素 */
  80.     border-radius: 50%; /* 边框半径设为50% */
  81.     background: radial-gradient(circle at 0 0, transparent 80%,
  82.             var(--black-fade)80%, var(--black-fade)90%, transparent 90%); /* 径向渐变背景 */
  83.     bottom: 80px; /* 距底部80像素 */
  84.     right: 0px; /* 距右边0像素 */
  85.     transform: rotatez(25deg); /* 旋转25度 */
  86.     opacity: 0; /* 不透明度设为0 */
  87. }
  88. .right::before {
  89.     content: ""; /* 添加伪元素 */
  90.     position: absolute; /* 绝对定位 */
  91.     z-index: 3; /* 设置堆叠顺序 */
  92.     width: 100px; /* 宽度设为100像素 */
  93.     height: 85px; /* 高度设为85像素 */
  94.     border-radius: 50%; /* 边框半径设为50% */
  95.     background: radial-gradient(circle at 100% 0, transparent 80%,
  96.             var(--black-fade)80%, var(--black-fade)90%, transparent 90%); /* 径向渐变背景 */
  97.     bottom: 80px; /* 距底部80像素 */
  98.     left: 0px; /* 距左边0像素 */
  99.     transform: rotatez(-25deg); /* 旋转-25度 */
  100.     opacity: 0; /* 不透明度设为0 */
  101. }
  102. .mouth {
  103.     position: absolute; /* 绝对定位 */
  104.     top: 88px; /* 距顶部88像素 */
  105.     right: 0; bottom: 0; left: 0; /* 左右和底部设为0以居中 */
  106.     margin: auto; /* 自动计算外边距,以保证居中 */
  107.     overflow: hidden; /* 隐藏超出元素范围的内容 */
  108.     width: 94px; /* 宽度设为94像素 */
  109.     height: 48px; /* 高度设为48像素 */
  110.     transition: .3s; /* 过渡效果时间为0.3秒 */
  111. }
  112. .mouth:before {
  113.     position: absolute; /* 绝对定位 */
  114.     top: 0; right: 0; bottom: 10px; left: 0; /* 设置上下左右距离居中 */
  115.     margin: auto; /* 自动计算外边距,以保证居中 */
  116.     content: ""; /* 伪元素内容为空 */
  117.     width: 100%; /* 宽度设为父元素的100% */
  118.     height: 100%; /* 高度设为父元素的100% */
  119.     background-color: #6E440B; /* 背景颜色设为深棕色 */
  120.     border-radius: 100%; /* 圆形边框 */
  121.     box-shadow: rgba(255, 255, 255, 0.25) 0 3px 0; /* 阴影效果 */
  122.     transform: scale(1); /* 缩放比例设为1 */
  123. }
  124. .mouth:after {
  125.     position: absolute; /* 绝对定位 */
  126.     top: 0; right: 0; bottom: 26px; left: 0; /* 设置上下左右距离居中 */
  127.     margin: auto; /* 自动计算外边距,以保证居中 */
  128.     content: ""; /* 伪元素内容为空 */
  129.     width: calc(100% - 20px); /* 宽度设为父元素宽度减20像素 */
  130.     height: 100%; /* 高度设为父元素的100% */
  131.     background-color: #FECA32; /* 背景颜色设为黄色 */
  132.     border-radius: 100%; /* 圆形边框 */
  133.     box-shadow: rgba(0, 0, 0, 0.8) 0 4px 4px -4px; /* 阴影效果 */
  134.     transform-origin: 50% 100%; /* 设置变换的原点为元素的底部中心 */
  135.     transform: scale(1.6); /* 缩放比例设为1.6 */
  136. }
  137. /* hover 状态 */
  138. #emoji:hover .face {
  139.     background-color: rgb(230, 80, 7); /* 当鼠标悬停时,改变面部背景颜色为橙红色 */
  140. }
  141. #emoji:hover .eye {
  142.     height: 30px; /* 当鼠标悬停时,改变眼睛的高度为30像素 */
  143.     box-shadow: inset rgba(0, 0, 0, 0.5) 0 6px 12px,
  144.         rgba(250, 160, 55, .3) 0 2px 0 2px; /* 当鼠标悬停时,改变眼睛的阴影效果 */
  145. }
  146. #emoji:hover .left,
  147. #emoji:hover .right {
  148.     top: 45px; /* 当鼠标悬停时,调整眼睛的上边距为45像素 */
  149.     bottom: 40px; /* 当鼠标悬停时,调整眼睛的下边距为40像素 */
  150. }
  151. #emoji:hover .left::before,
  152. #emoji:hover .right::before {
  153.     opacity: 1; /* 当鼠标悬停时,显示眼睛的光效 */
  154.     bottom: 40px; /* 当鼠标悬停时,调整光效的底部距离为40像素 */
  155.     transition: .3s; /* 设置过渡效果时间为0.3秒 */
  156. }
  157. #emoji:hover .mouth {
  158.     overflow: visible; /* 当鼠标悬停时,显示超出元素范围的内容 */
  159.     top: 120px; /* 当鼠标悬停时,调整嘴巴的顶部距离为120像素 */
  160.     width: 84px; /* 当鼠标悬停时,调整嘴巴的宽度为84像素 */
  161.     height: 35px; /* 当鼠标悬停时,调整嘴巴的高度为35像素 */
  162.     transform: translate3d(0, 0, 0); /* 重置3D转换 */
  163.     background: var(--black-fade); /* 背景颜色设为淡化的黑色 */
  164.     border-radius: 60%/80%; /* 当鼠标悬停时,调整嘴巴的边框半径 */
  165.     box-shadow: inset 0 0 10px 1px black; /* 当鼠标悬停时,设置内部阴影效果 */
  166. }
  167. #emoji:hover .mouth:before {
  168.     opacity: 0; /* 当鼠标悬停时,隐藏嘴巴的前景内容 */
  169. }
  170. #emoji:hover .mouth:after {
  171.     transform: scale(1); /* 当鼠标悬停时,将嘴巴后景内容缩放至原始大小 */
  172.     width: 68px; /* 当鼠标悬停时,调整后景内容的宽度为68像素 */
  173.     height: 75px; /* 当鼠标悬停时,调整后景内容的高度为75像素 */
  174.     background: linear-gradient(90deg, transparent 45%, var(--black-fade)50%, transparent 55%),
  175.         radial-gradient(circle at 50% 10%, rgb(240, 40, 115), var(--shine)55%); /* 设置渐变背景颜色 */
  176.     background-repeat: no-repeat; /* 禁止背景图案的重复 */
  177.     background-size: 100% 50%, 100% 100%; /* 设置背景图案的大小 */
  178.     top: 15px; /* 当鼠标悬停时,调整后景内容的顶部距离为15像素 */
  179.     bottom: auto; /* 当鼠标悬停时,禁用底部对齐 */
  180.     left: 50%; /* 当鼠标悬停时,将后景内容水平居中 */
  181.     margin: auto -34px; /* 当鼠标悬停时,调整后景内容的外边距 */
  182.     border-radius: 7px 7px 50% 50%/10% 10% 50% 50%; /* 当鼠标悬停时,调整后景内容的边框半径 */
  183.     filter: blur(2px); /* 当鼠标悬停时,应用2像素的模糊滤镜 */
  184.     box-shadow: inset 0 -2px 3px 0 mediumvioletred,
  185.         inset 0 -5px 10px 7px rgb(240, 40, 115), 0 5px 10px 1px black; /* 当鼠标悬停时,设置阴影效果 */
  186. }
复制代码
        希望读者可以静下心来阅读一下上述代码,而且可以利用编译器一步一步的查看各行代码的结果!这里我们在对上述的代码进行总结:

这段CSS代码实现了以下功能和结果:

   

  • 界说颜色变量

    • 利用CSS自界说属性(变量)界说了一组颜色,如亮度(shine)、重要颜色、次要颜色、夸大色、淡化的黑色和深蓝色。这些变量用于后续样式的统一管理和应用。

  • 全局样式设置

    • 设置了全局的padding、margin为0,并去除了列表的默认样式。这是为了确保页面元素的初始样式统一,避免默认样式影响设计。

  • 页面结构

    • 通过body标签的样式,设置页面为flex结构,内容垂直和水平居中显示。并利用height: 100vh将页面高度设置为视口高度,同时潜伏了滚动条以固定页面。

  • 表情符号结构和结构

    • 利用#emoji容器界说表情符号的整体尺寸和位置,而且启用了3D转换,以优化后续动画结果。
    • layer类用于界说表情符号各层的基础样式。

  • 面部基础样式

    • 界说了face类用于绘制表情符号的脸部,包括其位置、巨细、配景颜色、圆形边框和阴影结果。

  • 面部细节

    • shine类创建了脸部的光泽结果,通过渐变和透明度的应用,模拟光影。
    • eye类界说了眼睛的样式,利用位置、巨细、圆形边框、阴影等属性进行美化。左右眼分别利用.eye.left和.eye.right定位。
    • left::before和right::before伪元素添加了眼睛的反光结果。

  • 嘴巴样式

    • mouth类用于界说嘴巴的外观,包括位置、尺寸、配景颜色、边框半径和阴影结果。利用::before和::after伪元素添加了嘴巴的额外细节。

  • 鼠标悬停结果

    • 利用:hover伪类为表情符号添加了鼠标悬停时的动画结果。包括脸部颜色变化、眼睛形状和阴影的调解、嘴巴位置和形状的变化、以及嘴巴内部的复杂光影结果。

  • 过渡结果

    • 为大多数动画和样式变化设置了平滑的过渡结果,通常为0.3秒,使得动画更加流畅和天然。

  现在再让我们看一下结果:


——我们会发现,笑容不会跟随着鼠标的移动发生变化,这时间我们就需要加上一些交互结果了!

3.交互 —— JavaScript代码

JavaScript代码:
  1. <!-- 导入Parallax视差插件 -->
  2. <script src="https://cdnjs.cloudflare.com/ajax/libs/parallax/2.1.3/parallax.min.js"></script>
  3. <script>
  4.     var options = {
  5.         invertX: false,   // 水平方向反转
  6.         invertY: false,   // 垂直方向反转
  7.         limitX: 40,   // 水平方向限制
  8.         limitY: 40// 垂直方向限制
  9.     }
  10.     var emoji = document.getElementById('emoji');  // 获取元素id为emoji的DOM对象
  11.     var parallax = new Parallax(emoji, options);   // 创建新的视差对象并传入emoji和options参数
  12. </script>
复制代码
——编写好上述代码之后,我们就可以实现文章开始时的结果了!!!(结果如下)



以上就是本篇文章的全部内容了!!!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表