首页 > 编程语言 >原生 HTML + CSS + JavaScript 写时钟

原生 HTML + CSS + JavaScript 写时钟

时间:2022-11-12 12:33:33浏览次数:42  
标签:JavaScript top 50% height width HTML position CSS left

时钟效果

image

目录结构

image

HTML 代码

<!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>
    <!-- 引入 css 文件 -->
    <link rel="stylesheet" href="./css/clock.css">
</head>
<body>
    <!-- 钟表 -->
    <div class="clock">
        <div id="scale" class="scaleCon"></div>
        <div class="pointerCon">
            <div id="hour_pointer" class="pointer ph"></div>
            <div id="minute_pointer" class="pointer pm"></div>
            <div id="second_pointer" class="pointer ps"></div>
            <div class="core"></div>
        </div>
    </div>
    <!-- 引入 js 文件 -->
    <script src="./js/clock.js"></script>
</body>
</html>

CSS 代码

.clock {
    position: relative;
    top: 0;
    left: 0;
    margin: 36px;
    padding: 0;
    border: 15px solid #272727;
    border-radius: 50%;
    width: 200px;
    height: 200px;
    background-color: #3e454c;
}
/* .scaleCon | 刻度容器, .pointerCon | 指针容器*/
.scaleCon,.pointerCon {
    position: absolute;
    top: 0;
    left: -1px;
    width: 100%;
    height: 100%;
}
/* .secale 刻度公共样式*/
.scale {
    position: absolute;
    top: 0;
    left: 50%;
    width: 2px;
    height: 100%;
    transform: translate(0,-50%);
}

.scale::before {
    top: 0;
}
.scale::after {
    bottom: 0;
}

.scale::before, .scale::after {
    display: block;
    position: absolute;
    content: '';
}

/* .crude 时钟刻度 */
.crude::before, .crude::after {
    left: -1px;
    width: 4px;
    height: 10px;
    background-color: #a7bbe0;
}

/* .fine 分钟刻度 */
.fine::before, .fine::after {
    left: 0;
    width: 2px;
    height: 5px;
    background-color: #b5eea0;
}

/* 指针公共样式 */
.pointer {
    position: absolute;
    top: 0;
    left: 50%;
    width: 2px;
    height: 100%;
    transform: translate(-50%, 0);
}

/* 时针样式 */
.ph::after {
    content: '';
    display: block;
    position: absolute;
    left: -0.8px;
    top: 36px;
    border: 1px solid #fe5704;
    width: 2px;
    height: 36%;
}

/* 分针样式 */
.pm::after {
    content: '';
    display: block;
    position: absolute;
    top: 16px;
    left: -0.25px;
    border: 1px solid #0453fe;
    width: 1px;
    height: 46%;
}

/* 秒针样式 */
.ps::after {
    content: '';
    display: block;
    position: absolute;
    left: 1px;
    top: 15px;
    width: 0.25px;
    height: 58%;
    background-color: #04fe32;
}

/* 指针中心 */
.core {
    position: absolute;
    top: 50%;
    left: 50%;
    border-radius: 50%;
    width: 10px;
    height: 10px;
    background-color: #a7bbe0;
    transform: translate(-50%, -50%);
}

JS 代码

/* 定义一个时钟类 */
class Clock {
    /* 类入口:可用于接收外部参数,函数内部代码将在实例化对象的时候自动执行 */
    constructor() {
        this.scaleElem = [];
        this.fnInit();
    }

    /* 初始化 */
    fnInit() {
        this.fnNowTimer();
        this.fnCreateScale();
        this.fnCreatePointer();
        this.fnRotate();
    }

    /* 获取当前时间 */
    fnNowTimer() {
        let d = new Date();
        let h = d.getHours();
        let m = d.getMinutes();
        let s = d.getSeconds();
        this.secondDeg = (360/60)*s;
        this.minuteDeg = (360/60)*m;
        this.hourDeg = (360/12)*h + m*6/12;
    }

    /* 建立时钟刻度 */
    fnCreateScale() {
        let parentElem = document.getElementById('scale');
        let deg = 360/60;
        for (let i=0; i<30; i++) {
            this.scaleElem[i] = document.createElement('div');
            if (i%5==0) {
                this.scaleElem[i].className = 'scale crude';
            } else {
                this.scaleElem[i].className = 'scale fine';
            }
            this.scaleElem[i].style.transform = 'rotate('+ i*deg +'deg)';
            parentElem.appendChild(this.scaleElem[i]);
        }
    }

    /* 建立时钟指针并初始化位置 */
    fnCreatePointer() {
        this.hourPointerElem = document.getElementById('hour_pointer');
        this.minutePointerElem = document.getElementById('minute_pointer');
        this.secondPointerElem = document.getElementById('second_pointer');
        this.hourPointerElem.style.transform = 'rotate(' + this.hourDeg + 'deg)';
        this.minutePointerElem.style.transform = 'rotate(' + this.minuteDeg + 'deg)';
        this.secondPointerElem.style.transform = 'rotate(' + this.secondDeg + 'deg)';
    }

    /* 转动指针:1秒一次 */
    fnRotate() {
        this.setIntervalTimer = setInterval(()=>{
            this.fnNowTimer();
            this.hourPointerElem.style.transform = 'rotate(' + this.hourDeg + 'deg)';
            this.minutePointerElem.style.transform = 'rotate(' + this.minuteDeg + 'deg)';
            this.secondPointerElem.style.transform = 'rotate(' + this.secondDeg + 'deg)';
        },1000);
    }
}

/* 实例化时钟对象 */
let clock = new Clock();

标签:JavaScript,top,50%,height,width,HTML,position,CSS,left
From: https://www.cnblogs.com/trdack/p/16883385.html

相关文章

  • 涨姿势了,这 4 个场景可用 CSS 完全取代 JS ~
    本篇通译自:​​#It’s2022.SometimesYouDon’tNeedJavascriptatAll​​1.颜色选择器我们通常需要通过复杂的JavaScript来实现一个类似下图的颜色选择器组件。好......
  • ODOO前端引用css如何修改页面属性
    odoo前端存在一些样式不合理的地方,如何通过ccs修改页面属性:1 通过页面属性class;2 新建模块后,创建static/src/css/styles.css文件  3 style.css内容十分简单,设......
  • 使用python保存网页时print能显示正常,html打开中文乱码问题
             ......
  • HTML标签-文件标签和文本标签1和文本标签2
    HTML标签-文件标签文件标签:构成html最基本的标签html:html文档的根标签head:头标签。用于指定html文档的一些属性。引入外部的资源title:标题标签body:体标签<!DOCTYPEh......
  • HTML概念介绍和快速入门
    HTML概念介绍概念:是最基础的网页开发语言HaperTextMarkupLanguage超文本标记语言超文本:超文本是用超链接的方式,将各种不同空间的文字信息组织在一起的网状文......
  • CSS Sticky Footer实现
    什么是StickyFooter?StickyFooter(粘黏页脚)指的是在页面布局时,当页面的内容不足或等于一屏时,让页脚始终保持在页面的底部,如同粘在底部一样;当页面的内容超过一屏......
  • CSS的预处理器---[Less]
    CSS的预处理器---[Less]Less中文网址:http://lesscss.cn/常见的CSS预处理器:Sass、Less、Stylus1.Less使用我们首先新建一个后缀名为less的文件,在这个less文件里面书写......
  • 一文学会JavaScript计时事件
    文章目录​​JavaScript计时事件​​​​setInterval()方法​​​​clearInterval()方法​​​​setTimeout()方法​​​​clearTimeout()方法​​JavaScript计时事件......
  • 【JavaScript】操作BOM
    文章目录​​什么是BOM​​​​常用浏览器对象​​​​Window对象​​​​Window尺寸​​​​其他方法​​​​Screen对象​​​​Navigator对象​​​​History对象​​......
  • 【JavaScript】Math对象知识全解
    文章目录​​前言​​​​常用属性​​​​常用方法​​​​实例参考​​前言除了简单的加减乘除,在某些长和开发者需要进行更为复杂的数学运算。JavaScript的Math对象提供了......