代码 使用HTML、CSS和JavaScript创建的动态时钟

2024-11-18 13:49:31 +0800 CST views 542

该文本展示了一个使用HTML、CSS和JavaScript创建的动态时钟。时钟通过SVG元素绘制,包含外圈、内圈、刻度和指针。JavaScript用于计算时间并更新时钟的显示,样式通过CSS设置,确保时钟在不同屏幕尺寸下的适应性。时钟的设计包括平滑的过渡效果和现代的外观。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        * {
            transition: all 0.5s;
        }

        body {
            background-color: #252525;
            font-family: "Lato", sans-serif;
            font-weight: 300;
        }

        .text {
            position: absolute;
            left: 10px;
            bottom: 10px;
        }

        .text,
        a {
            color: #f4f4f4;
            font-weight: 100;
        }

        svg {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }

        .textTime {
            fill: #f4f4f4;
            text-anchor: middle;
            alignment-baseline: middle;
            font-size: 1.5rem;
            font-weight: 100;
        }

        .outerRing {
            fill: none;
            stroke: #f4f4f4;
            stroke-width: 2px;
            stroke-dasharray: 4px;
            opacity: 0.5;
        }

        .primCircle {
            fill: #252525;
            stroke: #f4f4f4;
            stroke-width: 10px;
        }

        .secCircle {
            fill: #45d9fd;
            stroke: #252525;
            stroke-width: 3px;
        }

        .spike {
            stroke: #f4f4f4;
            stroke-width: 2px;
        }

        .triangle {
            fill: #ee2560;
        }
    </style>
</head>

<body>
    <div class="clock"></div>
</body>

<script>
    const r1 = 5;
    const r2 = 10;
    const r3 = 15;
    const width = window.innerWidth;
    const height = window.innerHeight;
    const minWH = Math.min(width, height);

    const maxSize = minWH < 430 ? minWH - 30 : 400;
    const rad = a => (Math.PI * (a - 90)) / 180;
    const rx = (r, a, c) => c + r * Math.cos(rad(a));
    const ry = (r, a, c) => c + r * Math.sin(rad(a));

    // 辅助函数:创建SVG元素
    const createSVGElement = type => document.createElementNS("http://www.w3.org/2000/svg", type);

    // 创建时钟
    function createClock() {
        const size = maxSize;
        const mid = size / 2;
        const paddedRadius = (size - 30) / 2;

        const svg = createSVGElement("svg");
        svg.setAttribute("viewBox", `0 0 ${size} ${size}`);
        svg.setAttribute("width", size);
        svg.setAttribute("height", size);

        const appendCircle = (cx, cy, r, className) => {
            const circle = createSVGElement("circle");
            circle.setAttribute("cx", cx);
            circle.setAttribute("cy", cy);
            circle.setAttribute("r", r);
            circle.setAttribute("class", className);
            svg.appendChild(circle);
        };

        // 外圈和内圈
        appendCircle(mid, mid, mid - 5, "outerRing");
        appendCircle(mid, mid, mid - 15, "primCircle");

        // 创建刻度
        const spikesGroup = createSVGElement("g");
        for (let i = 1; i < 13; i++) {
            const ang = i * 30;
            const spike = createSVGElement("line");
            spike.setAttribute("x1", rx(paddedRadius - 5, ang, mid));
            spike.setAttribute("x2", rx(paddedRadius - 10, ang, mid));
            spike.setAttribute("y1", ry(paddedRadius - 5, ang, mid));
            spike.setAttribute("y2", ry(paddedRadius - 10, ang, mid));
            spike.setAttribute("class", "spike");
            spikesGroup.appendChild(spike);
        }
        svg.appendChild(spikesGroup);

        // 三角形路径
        const triangle = createSVGElement("path");
        triangle.setAttribute("class", "triangle");
        svg.appendChild(triangle);

        // 二级圆圈
        const secCircleGroup = createSVGElement("g");
        [r1, r2, r3].forEach(r => {
            const circle = createSVGElement("circle");
            circle.setAttribute("class", "secCircle");
            circle.setAttribute("r", r);
            secCircleGroup.appendChild(circle);
        });
        svg.appendChild(secCircleGroup);

        // 文本时间
        const textTime = createSVGElement("text");
        textTime.setAttribute("x", mid);
        textTime.setAttribute("y", mid);
        textTime.setAttribute("class", "textTime");
        svg.appendChild(textTime);

        document.querySelector(".clock").appendChild(svg);

        // 更新时钟函数
        function updateClock() {
            const time = new Date();
            const h = time.getHours() * 30; // 时针角度
            const m = time.getMinutes() * 6; // 分针角度
            const s = time.getSeconds() * 6; // 秒针角度

            const hx = rx(paddedRadius - 30, h, mid);
            const hy = ry(paddedRadius - 30, h, mid);
            const mx = rx(paddedRadius - 30, m, mid);
            const my = ry(paddedRadius - 30, m, mid);
            const sx = rx(paddedRadius - 30, s, mid);
            const sy = ry(paddedRadius - 30, s, mid);

            // 更新三角形路径
            triangle.setAttribute("d", `M${hx},${hy} L${mx},${my} L${sx},${sy} Z`);

            // 更新二级圆圈
            const circles = secCircleGroup.children;
            [hx, mx, sx].forEach((cx, i) => {
                circles[i].setAttribute("cx", [hx, mx, sx][i]);
                circles[i].setAttribute("cy", [hy, my, sy][i]);
            });

            // 更新时间文本
            const timeString = time.toTimeString().slice(0, 8).replace(/:/g, " : ");
            textTime.textContent = timeString;
        }

        setInterval(updateClock, 1000);
        updateClock();
    }

    // 当DOM加载完成后创建时钟
    document.addEventListener("DOMContentLoaded", createClock);
</script>

</html>

复制全文 生成海报 前端开发 网页设计 动态效果

推荐文章

Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
Mysql允许外网访问详细流程
2024-11-17 05:03:26 +0800 CST
paint-board:趣味性艺术画板
2024-11-19 07:43:41 +0800 CST
Vue3中如何使用计算属性?
2024-11-18 10:18:12 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
Elasticsearch 条件查询
2024-11-19 06:50:24 +0800 CST
Vue3中的v-bind指令有什么新特性?
2024-11-18 14:58:47 +0800 CST
随机分数html
2025-01-25 10:56:34 +0800 CST
Golang 随机公平库 satmihir/fair
2024-11-19 03:28:37 +0800 CST
js生成器函数
2024-11-18 15:21:08 +0800 CST
免费常用API接口分享
2024-11-19 09:25:07 +0800 CST
55个常用的JavaScript代码段
2024-11-18 22:38:45 +0800 CST
如何在 Linux 系统上安装字体
2025-02-27 09:23:03 +0800 CST
markdown语法
2024-11-18 18:38:43 +0800 CST
Nginx 实操指南:从入门到精通
2024-11-19 04:16:19 +0800 CST
程序员茄子在线接单