SOURCE

console 命令行工具 X clear

                    
>
console
setInterval(() => {
    let hh = document.getElementById("hh"); 
    let mm = document.getElementById("mm"); 
    let ss = document.getElementById("ss"); 
    let sec_dot = document.querySelector(".sec_dot"); 
    let min_dot = document.querySelector(".min_dot"); 
    let hr_dot = document.querySelector(".hr_dot"); 
    let hr = document.getElementById("hr"); 
    let mn = document.getElementById("mn"); 
    let sc = document.getElementById("sc"); 
    let h = new Date().getHours(); 
    let m = new Date().getMinutes(); 
    let s = new Date().getSeconds(); 
    hh.style.strokeDashoffset = 510 - (510 * h) / 12; 
    mm.style.strokeDashoffset = 630 - (630 * m) / 60; 
    ss.style.strokeDashoffset = 760 - (760 * s) / 60; 
    sec_dot.style.transform = `rotateZ(${s * 6}deg)`; 
    min_dot.style.transform = `rotateZ(${m * 6}deg)`; 
    hr_dot.style.transform = `rotateZ(${h * 30}deg)`; 
    hr.style.transform = `rotateZ(${h * 30}deg)`; 
    mn.style.transform = `rotateZ(${m * 6}deg)`; 
    sc.style.transform = `rotateZ(${s * 6}deg)`
});
<div class="clock">
	<div id="time">
		<div class="circle" style="--clr:#ff2972">
			<div class="dots sec_dot"></div> <svg>
				<circle cx="120" cy="120" r="120" id="ss"></circle>
			</svg>
		</div>
		<div class="circle" style="--clr:#fee800">
			<div class="dots min_dot"></div> <svg>
				<circle cx="100" cy="100" r="100" id="mm"></circle>
			</svg>
		</div>
		<div class="circle" style="--clr:#04fc43">
			<div class="dots hr_dot"></div> <svg>
				<circle cx="80" cy="80" r="80" id="hh"></circle>
			</svg>
		</div>
		<div class="niddles" style="--clr2:#ff2972;" id="sc"><i></i></div>      
        <div class="niddles niddles2" style="--clr2:#fee800;" id="mn"><i></i></div>      
        <div class="niddles niddles3" style="--clr2:#04fc43;" id="hr"><i></i></div>
        <span style="--i:1;"><b>1</b></span>      <span style="--i:2;"><b>2</b></span>      
        <span style="--i:3;"><b>3</b></span>      <span style="--i:4;"><b>4</b></span>      
        <span style="--i:5;"><b>5</b></span>      <span style="--i:6;"><b>6</b></span>      
        <span style="--i:7;"><b>7</b></span>      <span style="--i:8;"><b>8</b></span>      
        <span style="--i:9;"><b>9</b></span>      <span style="--i:10;"><b>10</b></span>      
        <span style="--i:11;"><b>11</b></span>      <span style="--i:12;"><b>12</b></span>    
    </div>  
</div>
* {
    margin: 0;
    padding: 0;
    box-sizing: border
}

body {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    overflow: hidden;
    background: #2f363e
}

.clock {
    position: relative;
    width: 280px;
    height: 280px;
    display: flex;
    justify-content: center;
    align-items: center;
    scale: 2;
    box-shadow: inset 5px 5px 25px rgba(0, 0, 0, 0.25);
    border-radius: 50%
}

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

#time .circle {
    position: absolute;
    display: flex;
    justify-content: center;
    align-items: center
}

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

#time .circle:nth-child(1) svg {
    width: 250px;
    height: 250px
}

#time .circle:nth-child(2) svg {
    width: 210px;
    height: 210px
}

#time .circle:nth-child(3) svg {
    width: 170px;
    height: 170px
}

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

#time .circle:nth-child(1) svg circle {
    stroke-dasharray: 760;
    stroke-dashoffset: 760
}

#time .circle:nth-child(2) svg circle {
    stroke-dasharray: 630;
    stroke-dashoffset: 630
}

#time .circle:nth-child(3) svg circle {
    stroke-dasharray: 510;
    stroke-dashoffset: 510
}

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

.dots::before {
    content: "";
    position: absolute;
    top: -3px;
    width: 15px;
    height: 15px;
    background: var(--clr);
    border-radius: 50%;
    box-shadow: 0 0 20px var(--clr), 0 0 40px var(--clr), 0 0 60px var(--clr), 0 0 80px var(--clr)
}

.niddles {
    position: absolute;
    width: 200px;
    height: 200px;
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: flex-start;
    z-index: 10
}

.niddles i {
    position: absolute;
    width: 2px;
    background: var(--clr2);
    height: 50%;
    opacity: 0.75;
    border-radius: 6px;
    transform-origin: bottom;
    transform: scaleY(0.5)
}

.niddles.niddles2 {
    width: 170px;
    height: 170px;
    z-index: 9
}

.niddles.niddles2 i {
    width: 3px
}

.niddles.niddles3 {
    width: 140px;
    height: 140px;
    z-index: 8
}

.niddles.niddles3 i {
    width: 4px
}

#time span {
    position: absolute;
    inset: 55px;
    text-align: center;
    color: #999;
    font-family: Cambria, Cochin, Georgia, Times, "Times New Roman", serif;
    transform: rotate(calc(30deg * var(--i)))
}

#time span b {
    font-size: 0.75em;
    font-weight: 500;
    display: inline-block;
    transform: rotate(calc(-30deg * var(--i)))
}