HTML+CSS+JS 倒计时动画效果

简介: HTML+CSS+JS 倒计时动画效果

1.整体效果

实现了一个倒计时动画效果,包括数字区域和倒计时结束区域。数字区域显示倒计时数字,数字进入时有动画效果,数字离开时也有动画效果。倒计时结束后,数字区域隐藏,倒计时结束区域显示,显示时也有动画效果。用户可以点击重新开始按钮重新开始倒计时。

2.完整代码

HTML

<!DOCTYPE html>  
<html lang="en">  
  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>倒计时动画效果</title>  
    <link rel="stylesheet" type="text/css" href="6_12.css">  
</head>  
  
<body>  
<div class="container">  
    <div class="counter">  
        <div class="nums">  
            <span class="in">3</span>  
            <span>2</span>  
            <span>1</span>  
            <span>0</span>  
        </div>  
        <h3>准备</h3>  
    </div>  
    <div class="final">  
        <h1>活动开始</h1>  
        <button class="replay">重来</button>  
    </div>  
</div>  
</body>  
<script src="6_12.js"></script>  
</html>

CSS

/* 清除所有元素的默认margin和padding */  
* {  
    margin: 0; /* 清除外边距 */    padding: 0; /* 清除内边距 */}  
  
/* 设置body的高度为视口高度,并使用flex布局进行居中 */body {  
    height: 100vh; /* 视口高度 */    display: flex; /* 弹性布局 */    justify-content: center; /* 主轴居中对齐 */    align-items: center; /* 交叉轴居中对齐 */    background: linear-gradient(to bottom, #fdfbfb, #ebedee); /* 背景线性渐变,从上到下 */}  
  
/* 容器元素,设置为相对定位 */.container {  
    position: relative; /* 相对定位 */}  
  
/* 计数器容器,宽度100%,文本居中对齐 */.counter {  
    width: 100%; /* 宽度100% */  
    text-align: center; /* 文本居中对齐 */}  
  
/* 隐藏计数器动画 */.counter.hide {  
    transform: scale(0); /* 缩放到0 */  
    animation: hide 0.2s ease-out; /* 应用名为hide的动画,持续0.2秒,使用ease-out缓动函数 */}  
  
/* 数字容器样式 */.nums {  
    width: 250px; /* 宽度250px */  
    height: 80px; /* 高度80px */  
    color: #5696ff; /* 字体颜色 */    font-size: 80px; /* 字体大小 */    font-weight: bold; /* 字体加粗 */    display: flex; /* 弹性布局 */    justify-content: center; /* 主轴居中对齐 */    align-items: center; /* 交叉轴居中对齐 */    margin-bottom: 15px; /* 下边距15px */  
    position: relative; /* 相对定位 */    overflow: hidden; /* 溢出内容隐藏 */}  
  
/* 数字容器内的span元素样式 */.nums span {  
    position: absolute; /* 绝对定位 */    transform-origin: bottom center; /* 变换原点设置在底部中心 */    transform: rotate(120deg); /* 旋转120度 */}  
  
/* 数字进入动画 */.nums span.in {  
    animation: goIn 0.5s ease-in-out; /* 应用名为goIn的动画,持续0.5秒,使用ease-in-out缓动函数 */}  
  
/* 数字退出动画 */.nums span.out {  
    animation: goOut 0.5s ease-in-out; /* 应用名为goOut的动画,持续0.5秒,使用ease-in-out缓动函数 */}  
  
/* 最终显示的内容容器样式 */.final {  
    position: absolute; /* 绝对定位 */    top: 0; /* 顶部对齐 */    left: 0; /* 左侧对齐 */    width: 100%; /* 宽度100% */  
    text-align: center; /* 文本居中对齐 */    transform: scale(0); /* 缩放到0 */  
}  
  
/* 最终显示内容显示动画 */.final.show {  
    transform: scale(1); /* 缩放到1 */  
    animation: show 0.3s ease-in; /* 应用名为show的动画,持续0.3秒,使用ease-in缓动函数 */}  
  
/* 重播按钮样式 */.replay {  
    width: 100%; /* 宽度100% */  
    background-color: #5696ff; /* 背景颜色 */    color: #fff; /* 字体颜色 */    border: none; /* 无边框 */    padding: 10px 0; /* 上下内边距10px */  
    margin-top: 20px; /* 上边距20px */  
    cursor: pointer; /* 鼠标悬停时变为手形图标 */}  
  
/* 隐藏动画:从正常大小逐渐缩小到0 */  
@keyframes hide {  
    0% {  
        transform: scale(1); /* 动画开始时,元素为正常大小 */    }  
  
    100% {  
        transform: scale(0); /* 动画结束时,元素缩小到0 */  
    }  
}  
  
/* 显示动画:从0开始放大,稍微超过正常大小,然后回到正常大小 */@keyframes show {  
    0% {  
        transform: scale(0); /* 动画开始时,元素为0大小 */    }  
  
    80% {  
        transform: scale(1.4); /* 动画过程中,元素放大到1.4倍大小 */    }  
  
    100% {  
        transform: scale(1); /* 动画结束时,元素回到正常大小 */    }  
}  
  
/* 进入动画:数字从旋转120度逐渐恢复到0度 */@keyframes goIn {  
    0% {  
        transform: rotate(120deg); /* 动画开始时,元素旋转120度 */    }  
  
    30% {  
        transform: rotate(-20deg); /* 动画过程中,元素旋转到-20度 */    }  
  
    60% {  
        transform: rotate(10deg); /* 动画过程中,元素旋转到10度 */    }  
  
    90%,  
    100% {  
        transform: rotate(0); /* 动画结束前和结束时,元素旋转到0度 */    }  
}  
  
/* 退出动画:数字从0度逐渐旋转到-120度 */@keyframes goOut {  
    0%,  
    30% {  
        transform: rotate(0); /* 动画开始时和动画过程中,元素为0度 */    }  
  
    60% {  
        transform: rotate(20deg); /* 动画过程中,元素旋转到20度 */    }  
  
    100% {  
        transform: rotate(-120deg); /* 动画结束时,元素旋转到-120度 */    }  
}

JavaScript

// 获取所有类名为'nums'的元素下的'span'子元素,并将它们存储在'nums'数组中  
const nums = document.querySelectorAll('.nums span');  
  
// 获取类名为'counter'的元素,并存储在'counter'变量中  
const counter = document.querySelector('.counter');  
  
// 获取类名为'final'的元素,并存储在'final'变量中  
const final = document.querySelector('.final');  
  
// 获取类名为'replay'的元素,并存储在'replay'变量中  
const replay = document.querySelector('.replay');  
  
// 重置函数:将界面重置为初始状态  
function reset() {  
    // 移除'counter'元素上的'hide'类,使其可见  
    counter.classList.remove('hide');  
    // 移除'final'元素上的'show'类,使其隐藏  
    final.classList.remove('show');  
    // 遍历'nums'数组中的每个元素  
    nums.forEach(num => {  
        // 移除当前'span'元素上的所有类名  
        num.className = '';  
    });  
    // 给'nums'数组中的第一个'span'元素添加'in'类,使其开始进入动画  
    nums[0].classList.add('in');  
}  
  
// 运行函数:为'nums'数组中的每个'span'元素添加动画结束事件监听器  
function run() {  
    nums.forEach((num, index) => {  
        // 当动画结束时触发此函数  
        num.addEventListener('animationend', e => {  
            // 如果动画名称为'goIn'且当前元素不是最后一个元素  
            if (e.animationName === 'goIn' && index !== nums.length - 1) {  
                // 移除当前元素的'in'类,使其停止进入动画  
                num.classList.remove('in');  
                // 给当前元素添加'out'类,使其开始退出动画  
                num.classList.add('out');  
            }  
            // 如果动画名称为'goOut'且当前元素有下一个兄弟元素  
            else if (e.animationName === 'goOut' && num.nextElementSibling) {  
                // 给下一个兄弟元素添加'in'类,使其开始进入动画  
                num.nextElementSibling.classList.add('in');  
            }  
            // 如果以上条件都不满足(即最后一个元素动画结束)  
            else {  
                // 隐藏'counter'元素  
                counter.classList.add('hide');  
                // 显示'final'元素  
                final.classList.add('show');  
            }  
        })  
    })  
}  
  
// 当'replay'元素被点击时,触发重置和运行函数  
replay.addEventListener('click', function () {  
    reset();  
    run();  
});  
  
// 页面加载完成后立即运行run函数  
run();
相关文章
|
12月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
893 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
可爱狗狗的404动画HTML源码
可爱狗狗的404动画HTML源码
510 17
可爱狗狗的404动画HTML源码
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
801 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
1238 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
css3 svg制作404页面动画效果HTML源码
css3 svg制作404页面动画效果HTML源码
309 34
html+js+css实现的建筑方块立体数字时钟源码
html+js+css实现的建筑方块立体数字时钟源码
667 33
html实现的文字发散动画效果代码
html实现的文字发散动画效果代码
238 30
|
移动开发 HTML5
HTML5 SVG实现可爱的小鸟卡通动画3D特效
HTML5 SVG实现可爱的小鸟卡通动画
308 29
|
移动开发 前端开发 HTML5
基于HTML5+Canvas绘制的鼠标跟随三角形碎片光标动画代码
基于HTML5+Canvas绘制的鼠标跟随三角形碎片光标动画特效代码,很有意思,一团三角形碎片跟随鼠标的移动,不冗长、不笨重,反而有一种很轻盈的感觉,非常不错
278 29

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    525
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    407
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    401
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    262
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    515
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    688
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1247
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    278
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1040
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    479