50个html+css+js项目小练习(二:动画的倒计时效果)

news2024/10/6 8:55:08

2.animated-navigation

在这里插入图片描述

实现效果:

  • 倒计时321后显示go
  • 数字依次从x轴负方向,顺时针倒下去
    • x=y
    • 第一个数(0,y)—>(-x,0)
  • 第一个数字倒下去的同时,第二个数从x轴正方向升起
    • 第二个数(x,0)—>(0,y)
  • 就像八百一千米体测开始一样😜

实现步骤:

  • 进入页面,显示倒计时321,倒计时时间到,显示Go
  • 点击Ready后,重新倒计时
  • 倒计时升起倒下动画
    • 进入页面后,先让倒计时显示,Go隐藏
    • 第一个数3升起后,判断
      • 动画= 升起动画goIn
      • 当前数组元素的索引0 ! = 当前数组元素3
      • 第一个数3倒下goOut
    • 第一个数3倒下后,判断
      • 动画= 升起动画goOut
      • num.nextElementSibling = < span class=“out”>2< /span>
      • 第二个数2升起goIn
    • 第二个数2升起后,判断
      • 动画= 升起动画goIn
      • 当前数组元素的索引1 ! = 当前数组元素2
      • 第二个数2倒下goOut
    • 第二个数2倒下后,判断
      • 动画= 升起动画goOut
      • num.nextElementSibling = 1
      • 第三个数1升起goIn
    • 第三个数1升起后,判断
      • 动画 = 升起动画goIn
      • 当前数组元素的索引1 = 当前数组元素1 不满足条件
      • 属于else:让倒计时隐藏,让GO出现

知识点:

使用classList添加class、删除class、查询class:
  • add( 新):添加一个或多个类名,已存在,取消添加;
    • num[0].classList.add(‘in’):给第一个num添加类名为in的类。
  • contains(旧):检查类属性中有无指定的类名,返回true 、false;
  • remove(旧):移除已经存在的类名;
  • toggle(类名);classList中存在指定的值,则删除它,否则,添加它;
    • 只有一个参数时:切换 class的值; 🎉
    • 类存在:删除它,返回false;不存在:添加它,返回true。
    • 第二个参数:计算结果: true,添加指定的类;计算结果 : false,则删除此类名。
    • boxesContainer.classList.toggle(‘big’)):
      • big被设置则删除它big,否则添加它big。
  • classList.replace( 旧,新 ):类名替换。
行内块、行内、块级元素
1.块级元素(可独块)block
  • 独占一行
  • 宽度:父元素宽度(默认)
  • 高度:由内容撑开(默认)
  • 可设置宽高
2.行内元素(不可多行)inline
  • 一行显多个,不换行
  • 宽度由内容撑开
  • 不可设宽高
  • (水平方向)padding和margin可以设置
3.行内块元素(可多行内块)inline-block
  • 一行多个(中间存在间隙)
  • 可设宽高
nextSibling 和nextElementSibling:
1.nextSibling
  • 返回指定节点之后的下一个兄弟节点。
    • 相同节点树层中的下一个节点。
  • 包括文本节点、注释节点(回车、换行、空格、文本)
  • 空格、回车 = 文本,也属于文本。
2.nextElementSibling
  • 只返回元素节点之后的下一个兄弟元素节点
    • 相同节点树层中的下一个元素节点
  • 不包括文本节点、注释节点
  • 只读属性
其他知识点:
  • value:用于设置或者返回属性的值。
  • 在运行倒计时,要设置遍历倒计时321,将属性值都设空;否则第二次执行时,会暂停在第一次的最后结果0。🎉
  * {
      box-sizing: border-box;
    }
    body {
      font-family: 'Roboto', sans-serif;
      margin: 0;
      height: 100vh;
      overflow: hidden;
      background-color: rgb(161, 158, 228);
    }
    h4 {
      font-size: 20px;
      margin: 5px;
      /* 所有字母变大写 */
      text-transform: uppercase;
    }
    .counter,
    .final {
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      text-align: center;
    }
    .counter.hide {
      transform: translate(-50%, -50%) scale(0);
      animation: hide .2s ease-out;
    }
    @keyframes hide {
      0% {
        transform: translate(-50%, -50%) scale(1);
      }
      100% {
        transform: translate(-50%, -50%) scale(0);
      }
    }
    .final {
      transform: translate(-50%, -50%) scale(0);
    }
    .final.show {
      transform: translate(-50%, -50%) scale(1);
      animation: show .2s ease-out;
    }
    @keyframes show {
      0% {
        transform: translate(-50%, -50%) scale(0);
      }
      30% {
        transform: translate(-50%, -50%) scale(1.4);
      }
      100% {
        transform: translate(-50%, -50%) scale(1);
      }
    }
    .nums {
      color: rgb(53, 15, 203);
      font-size: 50px;
      position: relative;
      overflow: hidden;
      width: 250px;
      height: 50px;
    }
    .nums span {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%)rotate(120deg);
      /* 旋转基点为底部中心 */
      transform-origin: bottom center;
    }
    .nums span.in {
      transform: translate(-50%, -50%) rotate(0deg);
      animation: goIn .5s ease-in-out;
    }
    .nums span.out {
      animation: goOut .5s ease-in-out;
    }
    @keyframes goIn {
      0% {
        transform: translate(-50%, -50%) rotate(120deg);
      }
      30% {
        /* 会有回弹的感觉由-20--10--0 */
        transform: translate(-50%, -50%) rotate(-20deg);
      }
      60% {
        transform: translate(-50%, -50%) rotate(10deg);
      }
      100% {
        transform: translate(-50%, -50%) rotate(0deg);
      }
    }
    @keyframes goOut {
      0% {
        transform: translate(-50%, -50%) rotate(0deg);
      }
      60% {
        transform: translate(-50%, -50%) rotate(20deg);
      }
      100% {
        transform: translate(-50%, -50%) rotate(-120deg);
      }
    }
    #replay {
      background-color: rgb(95, 39, 193);
      border-radius: 3px;
      /* 去掉button的边框黑线 */
      border: none;
      color: aliceblue;
      padding: 5px;
      text-align: center;
      display: inline-block;
      cursor: pointer;
      transition: all .3s;
    }
    #replay span {
      cursor: pointer;
      display: inline-block;
      position: relative;
      transition: .3s;
    }
    #replay span::after {
      /* 在span后面添加》 */
      content: '\00bb';
      position: absolute;
      opacity: 0;
      top: 0;
      right: -20px;
      transition: .5s;
    }
    #replay:hover span {
      padding-right: 25px;
    }
    #replay:hover span::after {
      opacity: 1;
      right: 0;
    }
<div class="counter">
    <div class="nums">
      <span class="in">3</span>
      <span>2</span>
      <span>1</span>
      <span>0</span>
    </div>
    <h4>Get Ready</h4>
  </div>
  <div class="final">
    <h1>GO</h1>
    <button id="replay">
      <span>Replay</span>
    </button>
</div>
const nums = document.querySelectorAll('.nums span')
const counter = document.querySelector('.counter')
const final = document.querySelector('.final')
const replay = document.querySelector('#replay')
// 隐藏和显示切换
function resetDOM () {
      // 让倒计时显示,让Go隐藏
      counter.classList.remove('hide')
      final.classList.remove('show')
      // 遍历倒计时321,将属性值都设空,否则第二次执行的时候,会暂停在第一次的最后结果0
      nums.forEach((num) => {
        num.classList.value = ''
      })
      num[0].classList.add('in')
}
// 页面一加载出来就要显示倒计时动画
runAnimation()

    // 倒计时移动动画
function runAnimation () {
      nums.forEach((num, idx) => {
        const nextToLast = nums.length - 1
        num.addEventListener('animationend', (e) => {
          // 动画名=goIn且当前数组元素的索引!=当前数组元素
          if (e.animationName === 'goIn' && idx !== nextToLast) {
            // console.log(idx)
            // console.log(nextToLast)
            // 删除in类名,添加out类名(倒计时倒下)
            num.classList.remove('in')
            num.classList.add('out')
            // 如果动画名=goOut并且等于返回下一个兄弟元素节点
          } else if (e.animationName === 'goOut' && num.nextElementSibling) {
            console.log(num.nextElementSibling)
            // 给下一个数添加动画in(倒计时升起)
            num.nextElementSibling.classList.add('in')
          } else {
            // 让倒计时隐藏,让GO出现
            counter.classList.add('hide')
            final.classList.add('show')
          }
        })
      })
}
// 点击Replay按钮,重新执行倒计时动画
replay.addEventListener('click', () => {
      resetDOM()
      runAnimation()
})

在这里插入图片描述
倒计时结束后:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1. 开篇:既简单又复杂的基础框架

同样的基础但不简单 之前在写 《从 0 开始深入学习 Spring》 小册时&#xff0c;阿熊提到过一件事&#xff1a;学习 JavaEE 开发的第一个框架&#xff0c;大多数是推荐 MyBatis 的&#xff0c;因为它相对简单&#xff0c;学习起来也相对轻松。不过不要因为 MyBatis 入门简单&a…

【电商】管理后台篇之安全、菜单、通知管理

系统管理第一篇我们介绍了账号管理相关的业务&#xff0c;这一篇我们介绍下其他几个常见的业务&#xff1a;安全管理、菜单管理和通知管理。 本篇介绍的几个常见业务如下&#xff1a; 安全管理&#xff1a;监控每个账号的登录情况和操作情况通知管理&#xff1a;给使用后台系统…

[附源码]计算机毕业设计JAVA企业信息网站

[附源码]计算机毕业设计JAVA企业信息网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

自定义qtquick 插件模块,支持qmldesigner

自定义qtquick 插件模块&#xff0c;支持qmldesigner wmxModule.pro #------------------------------------------------- # # Project created by wmx # #-------------------------------------------------QT core qml quickTARGET wmxModule TEMPLATE lib CONF…

图像处理QPixmap、Picture、QBitmap

QPixmap 类是一种可用作绘制设备的屏幕外图像表示形式。 QPixmap可以使用QLabel或QAbstractButton的子类之一可以轻松显示在屏幕上 QPixmap 对象可以按值传递&#xff0c;因为 QPixmap 类使用隐式数据共享&#xff0c;也可以流式传输。 QPixmap可以和QImage之间进行转换&…

【关于lombok框架一文秒懂】

目录 1. Lombok框架 2. 安装lombok插件 1. Lombok框架 Lombok框架是用于在编译期自动生成相关代码的&#xff0c;例如&#xff1a;Setters & Getters、hashCode()、equals()、toString()、无参数构造方法、全参数构造方法等。 相关的注解有&#xff1a; Data&#xff1…

python中的编码格式

1- 字符集和编码 1&#xff09; 初代编码 – ASCII 1- 物理机与电脑的交互&#xff1a;物理机中有个组件叫二极管&#xff0c; 可以通过电流通过二极管显示的高电平和低电平来记录信号。 2- 二极管的高电平和低电平则被计算机解读为0 和 1 3- 多个0和1拼接起来成为了二进制数据…

自动化测试框架设计原理详解

一、自动化测试场景 1、测试四象限 并不是所有测试类型都适合自动化。哪些测试更适合自动化?哪些更适合手工测试? 根据Brain Marick提出的测试四象限,我们可以对测试进行归类,将其划分到4个象限中,以解答这些问题,如下图所示。 第一象限:面向技术和指导开发,该象限中…

ActivityPub 笔记

ActivityPub 协议是一个去中心化的社交网络协议&#xff0c;其基于 ActivityStreams 2.0 数据格式。 在 ActivityPub 协议里&#xff0c;一个用户在服务器上的角色为“参与者&#xff08;actor&#xff09;”。用户在不同的服务器上的角色为不同的“参与者”。每一名“参与者”…

LSTM和GRU

LSTM和GRU RNN的优缺点 优点&#xff1a; 可以捕获序列之间的关系&#xff1b;共享参数。 缺点&#xff1a; 存在梯度消失和梯度爆炸问题&#xff1b;RNN的训练是一个比较困难的任务&#xff1b;无法处理长序列问题。 LSTM LSTM可以处理长序列问题&#xff0c;同样在之前…

openssl做文件处理(base64,MD5,sha256等)

这次使用openssl&#xff0c;发现openssl不仅可以用来做加密和解密&#xff0c;实际上也可以用来做文件的处理&#xff0c;比如base64转码、解码&#xff0c;文件md5的计算等。实现这些&#xff0c;即可以从命令行去做&#xff0c;也可以通过代码去实现。 1. 命令行操作 1. ba…

【ML特征工程】第 5 章 :分类变量:机器鸡时代的鸡蛋计数

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

想做副业没有方向,这三条告诉你什么是副业思维

怎样副业赚钱&#xff1f;教你几招&#xff0c;掌控自己的固有思维 你了解钱是怎么来的吗&#xff1f;你如果弄不懂这一点&#xff0c;你也是很难赚到钱的。 钱不是苦的&#xff0c;辛苦努力挣的基本都是一点钱。 假如将你的工作时长换为钱&#xff0c;你可以清晰地赚多少钱…

Java并发-线程上下文切换与死锁

理解线程的上下文切换 概述&#xff1a;在多线程编程中&#xff0c;线程个数一般都大于 CPU 个数&#xff0c;而每个 CPU 同一时&#xff0d;刻只能被一个线程使用&#xff0c;为了让用户感觉多个线程是在同时执行的&#xff0c; CPU 资源的分配采用了时间片轮转的策略&#x…

javacc之路0--- 安装与使用

官网&#xff1a; https://javacc.github.io/javacc/ https://github.com/javacc/javacc#getting-started 安装 下载解压 执行&#xff1a; mvn package 将 javacc-7.0.10.jar 重命名为 javacc.jar 并将目录下的scripts文件夹加入到环境变量中。 执行javacc命令验证是否成功…

【Qt 按钮】QPushButton所有函数和样式

【Qt 按钮】QPushButton所有函数和样式一、QSS语句 &#xff08;界面样式大全&#xff09;二、 构造函数三、Geometry &#xff08;获取属性&#xff09;四、 QFont五、setFont六、text七、setText八、move九、resize十、adjustSize[按钮自动适应文本大小]十一、setFocus十二、…

【附源码】计算机毕业设计JAVA预约健身私教网站

【附源码】计算机毕业设计JAVA预约健身私教网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

开发人员为什么要写测试用例?

作为一名开发人员&#xff0c;你可能会发现周围的开发并不太喜欢写测试用例&#xff0c;甚至有些同学根本不写测试用例&#xff0c;认为写测试用例完全是浪费时间&#xff0c;或者是测试用例只是测试的事情。 在开发过程中&#xff0c;往往都是呼啦啦的写完代码&#xff0c;然后…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

别人熬夜看世界杯 我熬夜改代码 你满意了

2022年卡塔尔世界杯正如火如荼地进行着&#xff0c; 一边是热火朝天的比赛&#xff0c;一边是让人惊掉下巴的爆冷结局&#xff0c; 但正因为这些不确定因素&#xff0c;反倒让世界杯增添了几分魅力和乐趣&#xff01; 小编在看球赛的过程中&#xff0c;不禁起了联想&#xff…