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>
相关推荐
qq_3927944812 分钟前
前端缓存策略:强缓存与协商缓存深度剖析
前端·缓存
小美的打工日记1 小时前
ES6+新特性,var、let 和 const 的区别
前端·javascript·es6
helianying551 小时前
云原生架构下的AI智能编排:ScriptEcho赋能前端开发
前端·人工智能·云原生·架构
@PHARAOH1 小时前
HOW - 基于master的a分支和基于a的b分支合流问题
前端·git·github·分支管理
涔溪1 小时前
有哪些常见的 Vue 错误?
前端·javascript·vue.js
程序猿online1 小时前
前端jquery 实现文本框输入出现自动补全提示功能
前端·javascript·jquery
2401_897579652 小时前
ChatGPT接入苹果全家桶:开启智能新时代
前端·chatgpt
DoraBigHead2 小时前
JavaScript 执行上下文:一场代码背后的权谋与博弈
前端
Narutolxy3 小时前
从传统桌面应用到现代Web前端开发:技术对比与高效迁移指南20250122
前端
摆烂式编程3 小时前
node.js 07.npm下包慢的问题与nrm的使用
前端·npm·node.js