【CSS+JS】分层时钟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>【CSS+JS】分层时钟</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-shadow: border-box;
        }

        body{
            background-color: hsl(223, 90%, 40%);
            color: hsl(0, 0%, 100%);
            font: 1em/1.5 Rubik, sans-serif;
            display: flex;
            height: 100vh;
            transition: background-color 0.3s, color 0.3s;
        }

        /*时钟容器样式*/
        .clock{
            --hrAngle:0;
            --minAngle:0;
            --secAngle:0;
            border-radius: 50%;
            margin: auto;
            outline: transparent;
            position: relative;
            width: 12em;
            height: 12em;
            transform: rotateX(30deg) rotateY(-30deg) rotateZ(30deg);
            transform-style: preserve-3d;
            transition: transform 0.3s cubic-bezier(0.42,0,0.58,1);
        }

        /*时钟头像样式*/
        .profile{
            background-color: hsl(223, 10%, 50%);
            border: 0;
            border-radius: 50%;
            box-shadow: 0 0 0 0.25em hsla(223,90%,10%,0.6);
            display: block;
            margin: 7.75em auto 0 auto;
            width: 2em;
            height: 2em;
        }

        /* 鼠标悬停时钟样式 */
        .clock:focus-visible,
        .clock:hover{
            transform: rotateX(0) rotateY(0) rotateZ(0);
        }

        /* 时钟数字容器样式 */
        .digits{
            display: flex;
            justify-content: center;
            align-items: end;
            line-height: 1;
            margin-top: 2.25em;
            user-select: none;
        }

        /* 时钟数字组样式 */
        .digit-group{
            margin:0 0.1em;
            width: 2ch;
        }

        .digit-group[data-unit="h"]{
            text-align: right;
        }

        .digit-group--small{
            font-size: 0.75em;
        }

        /* 时钟指针、层和环样式 */
        .hand,
        .layer,
        .ring{
            position: absolute;
        }

        /* 时钟指针样式 */
        .hand{
            bottom:calc(50% - 0.5em);
            left: calc(50% - 0.5em);
            width:1em;
            mix-blend-mode: difference;
            perspective: 4.25em;
            transform-origin: 0.5em calc(100% - 0.5em);
            transition: .5s;
        }

        .hand--hr{
            height: 2.75em;
            transform: rotate(var(--hrAngle)) translateY(-2em);
        }

        .hand--min{
            height: 3.75em;
            transform: rotate(var(--minAngle)) translateY(-2em);
        }

        .hand--sec{
            width: .5em;
            height: 3.75em;
            transform: rotate(var(--secAngle)) translateY(-2em);
        }

        .hand:before{
            background-color: hsl(0,0%,100%);
            content: "";
            display: block;
            width: 100%;
            height: 100%;
            transform: rotateX(-30deg);
            transform-origin: 50% 100%;
        }

        .hand--hr:before{
            border-radius: 0.5em 0.5em 0.5em 0.5em / 0.5em 0.5em 0.75em 0.75em;
        }

        .hand--min:before{
            border-radius: 0 0 0.5em 0.5em / 0 0 0.75em 0.75em;
        }

        .hand--sec:before{
            border-radius: 0 0 0.25em 0.25em / 0 0 0.5em 0.5em;
        }

        .layer,
        .ring{
            border-radius: 50%;
            inset: 0;
        }

        /* 时钟表盘层样式 */
        .layer--face{
            transform: translateZ(3.75em);
        }

        .layer--img{
            background: url("./img/05.jpg") 0 0 / 100% 100%;
            transform: translateZ(-3.75em);
        }

        .layer--profile{
            transform: translateZ(11em);
        }

        /* 时钟遮罩层样式 */
        .layer--shade{
            background-color: hsla(223, 90%, 10%, 0.6);
        }

        .ring{
            box-shadow: 0 0 0 0.625em hsl(0, 0%, 100%) inset;
        }
    </style>
</head>
<body>
    <div class="clock">
        <div class="layer layer--img"></div>
        <div class="layer layer--shade"></div>
        <div class="layer layer--face">
            <div class="digits">
                <span class="digit-group" data-unit="h">12</span>
                <span>:</span>
                <span class="digit-group" data-unit="m">00</span>
                <small class="digit-group digit-group--small" data--unit="s">00</small>
                <small class="digit-group digit-group--small" data-unit="ap">A</small>
            </div>
            <div class="hand hand--hr"></div>
            <div class="hand hand--min"></div>
            <div class="hand hand--sec"></div>
            <div class="ring"></div>
        </div>
        <div class="layer layer--profile">
            <img src="./img/04.jpg" alt="" class="profile">
        </div>
    </div>
</body>
<script>
    //页面加载完成后执行初始化操作
    window.addEventListener("DOMContentLoaded",()=>{
        const c = new Clock7(".clock")
    });

    //时钟类定义
    class Clock7{
        constructor(el){
            this.el = document.querySelector(el);
            this.init();
        }
        //初始化函数
        init(){
            this.timeUpdate();
        }
        //获取当前时间对象
        get timeAsObject(){
            const date = new Date();
            let h = date.getHours();
            const m = date.getMinutes();
            const s = date.getSeconds();
            return { h,m,s};
        }

        //获取当前时间字符串
        get timeAsString(){
            const [h,m,s,ap]=this.timeDigitsGrouped;
            return `${h}:${m}:${s} ${ap}M`;
        }
        //获取当前时间数字组
        get timeDigitsGrouped(){
            let {h,m,s}=this.timeAsObject;
            const ap=h>11?"p":"A";
            if(h===0) h +=12;
            else if (h>12) h -=12;
            if(m<10) m=`0${m}`;
            if (s<10) s=`0${s}`;
            return [h,m,s,ap];
        }
        //更新时间显示
        timeUpdate(){
            this.el?.setAttribute("aria-label", this.timeAsString);
            const time = this.timeAsObject;
            const secFraction = time.s / 60;
            const minFraction = (time.m + secFraction) / 60;
            const hrFraction = (time.h + minFraction) /12;
            this.el?.style.setProperty("--secAngle",`${360*secFraction}deg`);
            this.el?.style.setProperty("--minAngle",`${360*minFraction}deg`);
            this.el?.style.setProperty("--hrAngle",`${360*hrFraction}deg`);
            Array.from(document.querySelectorAll(`[data-unit]`)).forEach((unit,i)=>{
                unit.innerText = this.timeDigitsGrouped[i];
            })
            clearTimeout(this.timeUpdateLoop);
            this.timeUpdateLoop = setTimeout(this.timeUpdate.bind(this),1e3);
        }
    }
</script>
</html>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 JavaScript 来实现一个时钟,HTML 和 CSS 用来布局和样式化。以下是一个简单的实现: HTML: ``` <div id="clock"></div> ``` CSS: ``` #clock { font-size: 2em; font-weight: bold; text-align: center; } ``` JavaScript: ``` function updateClock() { var now = new Date(); var hours = now.getHours(); var minutes = now.getMinutes(); var seconds = now.getSeconds(); var timeString = hours + ':' + minutes + ':' + seconds; document.getElementById('clock').innerHTML = timeString; } setInterval(updateClock, 1000); ``` 这个时钟会每秒钟更新一次,显示当前的时间。 ### 回答2: CSSJS和HTML时钟是一种通过使用层叠样式表、JavaScript和HTML来实现的时钟。这种时钟能够显示当前的时间,并且会实时更新。下面我将分别介绍CSSJS和HTML在实现时钟功能中的作用。 首先是CSS,它负责时钟的外观和样式。我们可以使用CSS选择器来选择时钟的不同部分,例如表盘、时针、分针和秒针。通过设置不同的样式属性,我们可以控制时钟的颜色、大小、字体等。同时,我们还可以使用CSS过渡和动画效果来实现指针的流畅运动,使时钟更加美观。 其次是JS,它负责时钟的逻辑和功能。我们可以使用JavaScript的Date对象来获取当前的时间信息,包括小时、分钟和秒钟。通过计算时间的角度,我们可以将时钟的指针旋转到正确的位置。另外,我们还可以使用定时器函数(setInterval)来实现时钟的实时更新,让时钟能够每秒钟更新一次。 最后是HTML,它负责时钟的结构和布局。我们可以使用HTML标签来创建时钟的不同部分,例如表盘、指针和数字。通过设置不同的class和id,我们可以在CSSJS中选择和操作时钟的各个元素。同时,我们还可以使用CSS Grid或Flexbox来对时钟进行布局和对齐,使其在不同设备上都能够正常显示。 综上所述,CSSJS和HTML时钟是通过使用层叠样式表、JavaScript和HTML来实现的一种能够显示当前时间的时钟CSS负责样式和外观,JS负责逻辑和功能,HTML负责结构和布局。通过它们的结合,我们可以创造出一个精确而美观的时钟效果。 ### 回答3: CSSJS、HTML时钟是一种通过CSS样式、JavaScript脚本和HTML标记语言来实现的显示当前时间的时钟。 在HTML中,我们可以使用<div>标签来创建一个容器,然后使用<span>标签来分别显示时、分、秒,并用":"作为分隔符。 在CSS中,我们可以为时钟容器设置宽度、高度以及背景颜色,使其显示为一个矩形框。为时、分、秒分别设置字体、字号、颜色等样式。通过调整这些样式,我们可以实现不同的外观效果。 在JavaScript中,我们可以使用Date对象来获取当前的时间,并通过JavaScript函数来动态更新时钟的显示。我们可以编写一个函数,在函数中获取当前的时、分、秒,并将其分别赋值给对应的<span>标签,然后通过setTimeout()函数每秒钟调用一次该函数,实现时钟的动态更新。 最后,在HTML中调用该JavaScript函数,即可在网页中显示一个实时动态更新的时钟。 总结起来,CSSJS、HTML时钟通过HTML标签创建结构,使用CSS样式设置外观,通过JavaScript脚本获取、更新时间,从而实现了一个简单的时钟效果。这种时钟不仅能够显示当前的时间,还能够随着时间的变化进行实时更新。这种时钟在网页中广泛应用于显示当前时间或计时器等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值