svg实现时间进度条(圆环版)

一、前言

  • 使用svg中的circle画内圆外圆,内圆背景透明占位,外圆显示圆环
  • 设置开始标识点与时间显示
  • 通过定时器每秒更新时间及内容,并计算出圆环显示的长度,反向显示达到效果

二、效果展示

三、代码注释详解

xml 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }

    .box {
        margin: 20px auto 0;
        background-color: #2f363e;
        width: 600px;
    }

    #time {
        display: flex;
        align-items: center;
        justify-content: space-between;
        color: #fff;
        padding: 60px;
    }

    #time .circle {
        position: relative;
        width: 150px;
        height: 150px;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    #time .circle svg {
        position: relative;
        width: 150px;
        height: 150px;
        transform: rotate(270deg);
    }

    #time .circle svg circle {
        width: 100%;
        height: 100%;
        fill: transparent;
        stroke: #191919;
        stroke-width: 4;
        transform: translate(5px, 5px);
    }

    #time .circle svg circle:nth-child(2) {
        stroke: var(--clr);
        stroke-dasharray: 440;
    }

    #time div {
        position: absolute;
        text-align: center;
        font-weight: 500;
        font-size: 1.5em;
    }

    #time div .tip {
        position: absolute;
        font-size: 0.35em;
        font-weight: lighter;
        left: 50%;
        transform: translateX(-50%);
    }

    #time .ap {
        position: relative;
        font-size: 1em;
        transform: translateY(-20px);
    }

    .dots {
        position: absolute;
        width: 100%;
        height: 100%;
        z-index: 10;
        display: flex;
        justify-content: center;
        align-items: flex-start;
    }

    .dots::before {
        content: "";
        position: absolute;
        width: 10px;
        height: 10px;
        background: var(--clr);
        border-radius: 50%;
        box-shadow: 0 0 20px var(--clr), 0 0 60px var(--clr);
    }
</style>

<body>
    <div class="box">
        <div id="time">
            <div class="circle" style="--clr: #279746">
                <div class="dots hr-dot"></div>
                <svg>
                    <circle cx="70" cy="70" r="70"></circle>
                    <circle cx="70" cy="70" r="70" id="hh"></circle>
                </svg>
                <div id="hours">00</div>
            </div>
            <div class="circle" style="--clr: #f86a34">
                <div class="dots min-dot"></div>
                <svg>
                    <circle cx="70" cy="70" r="70"></circle>
                    <circle cx="70" cy="70" r="70" id="mm"></circle>
                </svg>
                <div id="minutes">00</div>
            </div>
            <div class="circle" style="--clr: #4285f4">
                <div class="dots sec-dot"></div>
                <svg>
                    <circle cx="70" cy="70" r="70"></circle>
                    <circle cx="70" cy="70" r="70" id="ss"></circle>
                </svg>
                <div id="seconds">00</div>
            </div>
        </div>
    </div>
</body>
<script>
    // 时分秒数字
    let hours = document.querySelector("#hours");
    let minutes = document.querySelector("#minutes");
    let seconds = document.querySelector("#seconds");
    // 时分秒外圈
    let hh = document.querySelector("#hh");
    let mm = document.querySelector("#mm");
    let ss = document.querySelector("#ss");
    // 每秒更新
    setInterval(() => {
        // 获取时分秒,数字补0,逢24变00
        let h = new Date().getHours() >= 10 && new Date().getHours() != 24 ? new Date().getHours() : new Date().getHours() == 24 ? '00' : '0' + new Date().getHours();
        let m = `${new Date().getMinutes()}`.padStart(2, 0);
        let s = `${new Date().getSeconds()}`.padStart(2, 0);
        // 更新内容
        hours.innerHTML = h + '\n<div class="tip">HOURS</div>';
        minutes.innerHTML = m + '\n<div class="tip">MINUTES</div>';
        seconds.innerHTML = s + '\n<div class="tip">SECONDS</div>';
        // 外圈计算
        // 总周长- (总周长 / 时分秒100%的对应数字 * 当前时分秒)   =   总周长 - 当前时间占比的的长度
        hh.style.strokeDashoffset = 440 - (440 / 24 * h);
        mm.style.strokeDashoffset = 440 - (440 / 60 * m);
        ss.style.strokeDashoffset = 440 - (440 / 60 * s);
    }, 1000);
</script>

</html>
相关推荐
前端李易安2 小时前
Web常见的攻击方式及防御方法
前端
PythonFun2 小时前
Python技巧:如何避免数据输入类型错误
前端·python
hakesashou2 小时前
python交互式命令时如何清除
java·前端·python
天涯学馆2 小时前
Next.js与NextAuth:身份验证实践
前端·javascript·next.js
HEX9CF2 小时前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
ConardLi2 小时前
Chrome:新的滚动捕捉事件助你实现更丝滑的动画效果!
前端·javascript·浏览器
ConardLi3 小时前
安全赋值运算符,新的 JavaScript 提案让你告别 trycatch !
前端·javascript
凌云行者3 小时前
使用rust写一个Web服务器——单线程版本
服务器·前端·rust
华农第一蒟蒻3 小时前
Java中JWT(JSON Web Token)的运用
java·前端·spring boot·json·token
积水成江3 小时前
关于Generator,async 和 await的介绍
前端·javascript·vue.js