当前位置: 首页 > article >正文

时钟之CSS+JS版

写在前面

此版本绘制的时钟基于CSS+JS模式。

优点操作简单,缺点当然是不够灵活。下一篇会基于HTML5的canvas标签,使用JS绘制。会更灵活,元素更加丰富。

HTML代码

<div class="box">
    <article class="clock">
        <!--  每个指针都需要一个 *-container容器 -->
        <div class="hours-container">
            <div class="hours"></div>
        </div>
        <div class="minutes-container">
            <div class="minutes"></div>
        </div>
        <div class="seconds-container">
            <div class="seconds"></div>
        </div>
    </article>
</div>

CSS代码

.box {
    width: 10rem;
    height: 10rem;
    background: rgb(205,205,205, .1);
    border-radius: 1rem;
    margin: 5% auto;
    display: flex;
    justify-content: center;
    align-items: center;
}
/* .box使用 Flex 布局方式,并且使其中的 .clock水中、垂直方向都居中。*/
.clock {
    width: 10rem;
    height: 10rem;
    background: rgb(244, 244, 244, .1) url(../img/clock.png) no-repeat center;
    background-size: cover;
    background-size: 100%;
    border-radius: 50%;
    position: relative;
}
/*添加中心轴:使用 CSS3 中的 伪元素 为时钟添加实心小圆点,指针都围着这个点转。*/
.clock:after {
    content: "";  /* 这句 content: ''; 是必须的,不然这个伪元素不会显示,即使指定了宽度和高度。 */
    width: 1rem;
    height: 1rem;
    background: #000;
    border-radius: 50%;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);   /* !!!向左上移动自身的50% */
    z-index: 10;  /* 是为了使这个小圆点在视图的最上层,遮挡住指针交叉的地方 */
}
/*由于相对定位是从元素的左上角开始计算的,所以 top: 50%; left: 50%; 不能使这个小圆点在 Clock 的中心,使用 transform: translate(-50%,-50%); 向左上方移动自身宽度或高度的 50%*/

/*指针容器: 容器被放置在 Clock 的上方*/
.hours-container,.minutes-container,.seconds-container {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}
/*添加指针:设置指针样式*/
.hours {
    width: 3%;
    height: 20%;
    background: rgb(0, 0, 0, .8);
    transform-origin: 50% 100%; /* transform-origin: 50% 90%; 规定指针旋转的位置为:X 方向的中心线 和 Y 方向的 90% 处这条线的交叉点。*/
    position: absolute;
    top: 35%;
    left: 48.5%;
}
.minutes {
    width: 2%;
    height: 30%;
    background: rgb(13, 2, 223, .8);
    transform-origin: 50% 100%; 
    position: absolute;
    top: 24%;
    left: 49%;

}
.seconds {
    width: 1%;
    height: 40%;
    background: rgb(255, 0, 0, .8);
    transform-origin: 50% 100%;
    position: absolute;
    top: 20%;
    left: 49.5%;
}

@keyframes rotate {
  100% {
    transform: rotateZ(360deg);
  }
}

JS代码

function frame() {
    const now = new Date();
    const hours = now.getHours();
    const minutes = now.getMinutes();
    const seconds = now.getSeconds();
    const sDeg = (seconds % 60) * 6;// 描述实际对应度数
    const mDeg = (minutes % 60) * 6 + (seconds % 60) * 6 / 360 * 6;// 分针实际对应度数 + 秒针跑过折算度数
    const hDeg = (hours > 12 ? hours % 24 : hours % 12) * 30 + (minutes % 60) * 6 / 360 * 30;// 时针实际对应度数 + 分针跑过折算度数

    document.querySelector('.seconds-container').style.transform = "rotate(" + sDeg + "deg)";
    document.querySelector('.minutes-container').style.transform = "rotate(" + mDeg + "deg)";
    document.querySelector('.hours-container').style.transform = "rotate(" + hDeg + "deg)";
}
window.onload = function() {
    frame();
    setInterval(frame, 1000);
}

实现效果


http://www.kler.cn/a/396142.html

相关文章:

  • JS 数组排序
  • shell编程之变量与引用
  • Elastic Agent:可灵活地在任何地方发送和处理任何数据
  • Java I/O(输入/输出)——针对实习面试
  • 【智能电视??】关于电视、以及IPTV 和OTT TV区别(了解)
  • sealos部署K8s,安装docker时master节点突然NotReady
  • 09C++结构体
  • C++各类函数评点+详解
  • MySQL数据库最大连接数查询及修改
  • R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...
  • Python实现PSO粒子群优化算法优化CNN-Transformer回归模型(优化权重和阈值)项目实战
  • 开源的说话人分离项目 | 可以对指定的音频分离不同的说话人 | 通话录音中分离不同的说话人
  • 开发中SQL积累
  • 量子奇异值阈值算法
  • vue3: ref, reactive, readonly, shallowReactive
  • Django Form
  • 【计算机网络】TCP网络特点2
  • 理解Go中的append函数及其返回值
  • MFC中Picture Control控件显示照片的几种方式
  • python基础 基本数据类型 执行顺序 条件判断 常用字符串操作 常用工具类
  • 英伟达 Isaac ROS产品体验
  • Java—— 正则表达式
  • 【系统架构设计师】真题论文: 论基于 DSSA 的软件架构设计与应用(包括解题思路和素材)
  • Nacos黑马笔记
  • 前端知识点---this的用法 , this动态绑定(Javascript)
  • 大数据如何助力干部选拔的公正性