CSS/Javascript 实现 Word Clock

本贴最后更新于 1982 天前,其中的信息可能已经时异事殊

无标题.png

无意中看到了一款锁屏效果--world clock,感觉有点意思,就想着用前端来实现他。

实现这个效果主要需要实现两个部分

  • 时间元素旋转显示
  • 时间自动旋转

实现元素旋转显示

// li 通用样式
li {
        color: #777;
        list-style: none;
        width: 150px;
        text-transform: lowercase;
        transform-origin: 0 center;
        position: absolute;
        left: 0;
        top: 0;
    }
// li 行内样式
li:nth-child(1){ transform: rotate(0deg); }

每个 li 根据实际位置,旋转度数不同,总的加起来 360 度就可以了

时间初始化与自动旋转

  • 每一个 li 去做循环,等于当前日期值的 li 旋转度数为 0,小于的当前日期值为负,大于为正。
<!-- 当前月份为6月,所以6月对应的旋转角度为0,小于6月的为负,大于6月为正-->
<!-- 整个旋转度数为360度,-30°与330°效果一致-->
<ul class="month" id="month">
        <li style="transform: rotate(-150deg); color: rgb(119, 119, 119);">一月</li>
        <li style="transform: rotate(-120deg); color: rgb(119, 119, 119);">二月</li>
        <li style="transform: rotate(-90deg); color: rgb(119, 119, 119);">三月</li>
        <li style="transform: rotate(-60deg); color: rgb(119, 119, 119);">四月</li>
        <li style="transform: rotate(-30deg); color: rgb(119, 119, 119);">五月</li>
        <li style="transform: rotate(0deg); color: rgb(255, 255, 255);">六月</li>
        <li style="transform: rotate(30deg); color: rgb(119, 119, 119);">七月</li>
        <li style="transform: rotate(60deg); color: rgb(119, 119, 119);">八月</li>
        <li style="transform: rotate(90deg); color: rgb(119, 119, 119);">九月</li>
        <li style="transform: rotate(120deg); color: rgb(119, 119, 119);">十月</li>
        <li style="transform: rotate(150deg); color: rgb(119, 119, 119);">十一月</li>
        <li style="transform: rotate(180deg); color: rgb(119, 119, 119);">十二月</li>
    </ul>

源码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Word Clock</title>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<style>
    body {
        height: 100%;
        width: 100%;
        background-color: #000;
    }

    div {
        height: 1000px;
        width: 100%;
    }

    ul {
        position: absolute;
        left: 50%;
        top: 500px;
    }

    li {
        color: #777;
        list-style: none;
        width: 150px;
        text-transform: lowercase;
        transform-origin: 0 center;
        position: absolute;
        left: 0;
        top: 0;
    }

    .month > li {
        padding: 0 0 0 80px;
    }

    .day > li {
        padding: 0 0 0 130px;
    }

    .week > li {
        padding: 0 0 0 200px;
    }

    .hour > li {
        padding: 0 0 0 260px;
    }

    .minute > li {
        padding: 0 0 0 325px;
    }

    .second > li {
        padding: 0 0 0 410px;
    }
</style>
<body>
<div>
    <ul class="month" id="month">
        <li style="transform: rotate(-150deg); color: rgb(119, 119, 119);">一月</li>
        <li style="transform: rotate(-120deg); color: rgb(119, 119, 119);">二月</li>
        <li style="transform: rotate(-90deg); color: rgb(119, 119, 119);">三月</li>
        <li style="transform: rotate(-60deg); color: rgb(119, 119, 119);">四月</li>
        <li style="transform: rotate(-30deg); color: rgb(119, 119, 119);">五月</li>
        <li style="transform: rotate(0deg); color: rgb(255, 255, 255);">六月</li>
        <li style="transform: rotate(30deg); color: rgb(119, 119, 119);">七月</li>
        <li style="transform: rotate(60deg); color: rgb(119, 119, 119);">八月</li>
        <li style="transform: rotate(90deg); color: rgb(119, 119, 119);">九月</li>
        <li style="transform: rotate(120deg); color: rgb(119, 119, 119);">十月</li>
        <li style="transform: rotate(150deg); color: rgb(119, 119, 119);">十一月</li>
        <li style="transform: rotate(180deg); color: rgb(119, 119, 119);">十二月</li>
    </ul>
    <ul class="day" id="day">
    </ul>
    <ul class="week" id="week">
    </ul>
    <ul class="hour" id="hour">
    </ul>
    <ul class="minute" id="minute">
    </ul>
    <ul class="second" id="second">
    </ul>
</div>
</body>
<script>
    function mGetDate(year, month) {

        var d = new Date(year, month, 0);
        return d.getDate();
    }

    function numberToChinese(num) {
        var chineseNum = '零一二三四五六七八九十';
        var chinese = '';
        if (num <= 10) {
            return chineseNum.split('')[num]
        } else if (num < 20) {
            return '十' + chineseNum.split('')[num - 10]
        } else {
            if (num % 10 == 0) {
                return chineseNum.split('')[num / 10] + '十'
            } else {
                return chineseNum.split('')[parseInt(num / 10)] + '十' + chineseNum.split('')[parseInt(num % 10)]
            }
        }

    }

    var myDate = new Date();
    var month = document.getElementById('month');
    var day = document.getElementById('day');
    var week = document.getElementById('week');
    var hour = document.getElementById('hour');
    var minute = document.getElementById('minute');
    var second = document.getElementById('second');
    var html = ``;
    // 生成月html
    for (var i = 0; i < 12; i++) {
        html += `<li>` + numberToChinese(i + 1) + `月</li>`
    }
    month.innerHTML = html;

    //  生成日html
    var months = myDate.getMonth() + 1;   //月份从0开始获取,所以需要加1
    var year = myDate.getYear();
    var d = new Date(year, months, 0);
    var days = d.getDate();
    html = ``
    for (i = 0; i < days; i++) {
        html += `<li>` + numberToChinese(i + 1) + `日</li>`
    }
    day.innerHTML = html;

    // 星期html
    html = ``
    for (i = 0; i < 7; i++) {
        if (i == 6) {
            html += `<li>星期日</li>`
        } else {
            html += `<li>星期` + numberToChinese(i + 1) + `</li>`
        }
    }
    week.innerHTML = html;

    // 时html
    html = ``
    for (i = 0; i < 24; i++) {
        html += `<li>` + numberToChinese(i) + `时</li>`
    }
    hour.innerHTML = html;
    //分html
    html = ``
    for (i = 0; i < 60; i++) {
        html += `<li>` + numberToChinese(i) + `分</li>`
    }
    minute.innerHTML = html;
    //秒html
    html = ``
    for (i = 0; i < 60; i++) {
        html += `<li>` + numberToChinese(i) + `秒</li>`
    }
    second.innerHTML = html;


    function setTime() {
        // 获取当前时间
        var myDate = new Date();
        var numArray = [myDate.getMonth() + 1, myDate.getDate(), myDate.getDay(), myDate.getHours() + 1, myDate.getMinutes() + 1, myDate.getSeconds() + 1];// 月,日,星期,时,分,秒

        var l = 6;
        // 遍历ul实现时间赋值与更改
        $("ul").each(function () {
            let length = $(this).children().length
            for (let j = 0; j < length; j++) {
                let deg = "rotate(" + (j + 1 - numArray[6 - l]) * 360 / length + "deg)"
                $(this).find("li").eq(j).css("transform", deg);
                if (j + 1 - numArray[6 - l] == 0 || (l == 4 && j == length - 1 && numArray[6 - l] == 0)) {

                    $(this).find("li").eq(j).css("color", "#fff");
                } else {
                    $(this).find("li").eq(j).css("color", "#777");
                }
            }
            l--;
        })
    }

    setTime()
    window.setInterval("setTime()", 1000);
</script>
</html>

最后的效果

image.png

写在最后,时间直接使用 jq 更改很僵硬,可以通过 CSS 动画实现。

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    197 引用 • 547 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1326 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    写的代码,真美huaji