«

时钟

时间:2023-3-19 10:34     作者:小诸葛     分类: 前端     正在检查是否收录...


时钟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>拟态时钟</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            background-color: #d7e1f0;
        }

        /* 外壳 */
        .con {
            width: 300px;
            height: 300px;
            margin: 200px auto;
            cursor: default;
            user-select: none;
        }

        /* 圆 */
        .clock {
            width: 300px;
            height: 300px;
            padding: 3px;
            border-radius: 50%;

            /* 拟态 */
            box-shadow: 10px 10px 15px 8px rgba(0, 0, 0, 0.18),
                -10px -10px 15px 8px rgba(255, 255, 255, 0.626),
                inset 8px 8px 20px 0px rgba(0, 0, 0, 0.05);

            position: relative;
        }

        /* 数字组 */
        .clock-nums {
            margin: 0;
            padding: 0;
            position: absolute;
            width: 30px;
            height: 30px;
            /* 居中 */
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }

        /* 数字节点盒子 */
        .item {
            color: blue;
            list-style-type: none;
            font-size: 20px;
            font-weight: 600;
            width: 30px;
            height: 30px;

            position: absolute;

            /* 设置元素旋转的基点到圆心 */
            transform-origin: 50% 150px;
            /* 先移动再旋转,切记先移动,再旋转 */
            transform: translate(0, -135px) rotate(calc(var(--i)*30deg));

        }

        /* 数字 ,让数字旋转回来。保存竖直的角度 */
        .item text {
            display: inline-block;
            text-align: center;
            line-height: 30px;

            width: 100%;
            height: 100%;

            transform: rotate(calc(var(--i)*-30deg));
        }

        /* 旋转动画 */
        @keyframes ro {
            from {
                transform: rotate(-180deg);
            }

            to {
                transform: rotate(180deg);
            }
        }

        /* 时针头部 */
        .hour_pointer {
            /* 居中 */
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);

            /* 头部圆的大小 */
            height: 7px;
            width: 7px;
            background-color: rgb(156, 83, 83);
            box-shadow: 0px 0px 0 4px rgb(156, 83, 83);
            border-radius: 50%;

            /* 设置基点在圆心 */
            transform-origin: 50% 50%;
            /* 设置24小时转1圈 */
            animation: ro 43200s linear infinite;
            /* 为防止事件对准前的闪动,先隐藏,其他指针也有同样的设置 */
            display: none;
        }

        /* 伪元素设置时针 */
        .hour_pointer::before {
            content: "";
            /* 与头部连接 */
            position: absolute;
            left: 0;

            /* 设置宽高 */
            height: 65px;
            width: 7px;

            /* 设置颜色和边角 */
            background-color: rgb(156, 83, 83);
            border-radius: 100px;
        }

        /* 分针 */
        .minute_pointer {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);

            height: 5px;
            width: 5px;
            border-radius: 50%;

            background-color: rgb(57, 176, 180);
            /* 为了让它与时针形成同心圆,需要增加边框,弥补宽高的变小 */
            border: 1px solid rgb(57, 176, 180);

            box-shadow: 0px 0px 0 2px rgb(57, 176, 180);

            transform-origin: 50% 50%;
            animation: ro 3600s linear infinite;
            display: none;
        }

        .minute_pointer::before {
            content: "";
            position: absolute;
            left: 0;
            height: 85px;
            width: 5px;
            background-color: rgb(57, 176, 180);
            border-radius: 100px;
        }

        .seconde_pointer {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);

            height: 3px;
            width: 3px;
            background-color: rgb(253, 0, 232);
            /* 同样为了形成同心圆,设置边框 */
            border: 2px solid rgb(253, 0, 232);
            border-radius: 10px;
            transform-origin: 50% 50%;

            animation: ro 60s linear infinite;
            display: none;
        }

        .seconde_pointer::before {
            content: "";
            position: absolute;
            left: 0;
            height: 100px;
            width: 3px;
            background-color: rgb(253, 0, 232);
            border-radius: 100px;
        }

    </style>
</head>
<body>
    <!-- 外层盒子 -->
    <div class="con">
        <!-- 时钟的圆 -->
        <div class="clock">
            <!-- 时钟数字 -->
            <ul class="clock-nums">
                <li class="item" style="--i:1"><text>1</text></li>
                <li class="item" style="--i:2"><text>2</text></li>
                <li class="item" style="--i:3"><text>3</text></li>
                <li class="item" style="--i:4"><text>4</text></li>
                <li class="item" style="--i:5"><text>5</text></li>
                <li class="item" style="--i:6"><text>6</text></li>
                <li class="item" style="--i:7"><text>7</text></li>
                <li class="item" style="--i:8"><text>8</text></li>
                <li class="item" style="--i:9"><text>9</text></li>
                <li class="item" style="--i:10"><text>10</text></li>
                <li class="item" style="--i:11"><text>11</text></li>
                <li class="item" style="--i:12"><text>12</text></li>
            </ul>
            <!-- 时针 -->
            <div class="hour_pointer" id="HourP"></div>
            <!-- 分针 -->
            <div class="minute_pointer" id="MinuP"></div>
            <!-- 秒针 -->
            <div class="seconde_pointer" id="SecoP"></div>
        </div>
    </div>
</body>
<script>
    window.onload = function () {
        // 获取当前时,分,秒,并且准换成秒为单位
        let starS = new Date().getSeconds()
        let starM = new Date().getMinutes() * 60
        let starH = new Date().getHours() * 3600
        // 获取时针,分针,秒针节点
        let HourP = document.querySelector('#HourP')
        let MinuP = document.querySelector('#MinuP')
        let SecoP = document.querySelector('#SecoP')

        // 设置动画,通过设置 负值的延迟,调准指针。
        HourP.style.animation = `ro 43200s ${-starH}s linear infinite`
        MinuP.style.animation = `ro 3600s ${-starM}s linear infinite`
        SecoP.style.animation = `ro 60s ${-starS}s linear infinite`

        // 个指针就位后显示
        HourP.style.display = "block";
        MinuP.style.display = "block";
        SecoP.style.display = "block";
    }
</script>
</html>

时钟

推荐阅读:


扫描二维码,在手机上阅读