【入门demo】做个实时时钟要多久

Hi,大家上午好,今天做个简易点的实时时钟,敲了一个小时多点,事后配色花了半个小时😵

展示

话不多说先上图

html部分

如图示,时钟看似一个平面,其实可以看成三个部分更容易理解,第一部分就是整个时钟,第二部分是外圈表盘【很细的黑圈】和六条横杆【白色* 4,黑色* 2】,第三部分就是包括时针、分针和秒针的内部表盘。

html 复制代码
<div class="clock">
        <div class="outer-clock-face">
            <div class="marking marking-one"></div>
            <div class="marking marking-two"></div>
            <div class="marking marking-three"></div>
            <div class="marking marking-four"></div>
            <div class="inner-clock-face">
                <div class="hand hour-hand"></div>
                <div class="hand min-hand"></div>
                <div class="hand second-hand"></div>
            </div>
        </div>
    </div>
</div>

css部分

难点一 弹性布局和定位

在做好html的框架之后,我们就会发现如何让容器在页面中居中是个不大不小的重点,在这个demo里,弹性布局和绝对定位是最好用的方法。

  1. 弹性布局居中

给其父容器加flex,再添加 justify-content(水平居中)和 align-items(垂直居中)这两个属性。

css 复制代码
    display: flex;
    justify-content: center;
    align-items: center;
  1. 绝对定位居中

给其加绝对定位,再添加自己根据位置设置top、bottom、left、right等等。

难点二 伪元素

在这个demo中,多次用到伪元素的方法,这两条黑色横杆和表心就是用伪元素的方法做的。

伪元素是一个附加至选择器末的关键词,例如 ::first-line 伪元素可以改变段落首行文字的样式。

伪元素由冒号(::)后跟着伪元素名称组成,例如 ::before::after 等。

js部分

在构建好了html框架、创建完样式之后,我们要考虑我们的时钟该怎么根据实时时间移动呢?这个时候就要请js出马了。

js部分的难点主要就在能否准确处理时钟转动角度和实时时间的关系,另外就是对setInterval()这个函数的使用,具体的放在下面。

js 复制代码
const secondHand = document.querySelector('.second-hand')
const minHand = document.querySelector('.min-hand')
const hourHand = document.querySelector('.hour-hand')
// console.log(secondHand);
function setTime() {
    const now = new Date()
    // 获取当前秒数
    const seconds = now.getSeconds()  //30
    const secondsDegrees = seconds * 6 + 90
    secondHand.style.transform = `rotate(${secondsDegrees}deg)`

    const mins = now.getMinutes()
    const minsDegrees = mins * 6 + 90
    minHand.style.transform = `rotate(${minsDegrees}deg)`

    const hours = now.getHours()
    const hoursDegrees = hours * 30 + 90 + (mins / 60) * 30
    hourHand.style.transform = `rotate(${hoursDegrees}deg)`
}

setTime()
setInterval(setTime, 1)

结语

这样一个漂亮的时钟就完成了!如有错误欢迎在评论区指正,一起讨论!(๑•̀ㅂ•́)و✧

相关推荐
嘿是我呀2 小时前
【用npm安装node时报错“npm 无法加载文件”】
前端·npm·node.js
干前端2 小时前
Vue3 组件库工程化实战:BEM 命名规范与 useNamespace 深度解析
前端·css
弓弧名家_玄真君2 小时前
在ubuntu中安装redis
前端·bootstrap·mybatis
RFCEO2 小时前
学习前端编程:DOM 树、CSSOM 树、渲染树详解
前端·学习·渲染树·dom 树·cssom 树·浏览器的渲染流程·回流/重绘
笨蛋不要掉眼泪2 小时前
Redis主从复制:原理、配置与实战演示
前端·redis·bootstrap·html
bigdata-rookie2 小时前
Starrocks 数据模型
java·前端·javascript
白帽子凯哥哥2 小时前
网络安全Web基础完全指南:从小白到入门安全测试
前端·sql·web安全·信息安全·渗透测试·漏洞
RFCEO2 小时前
前端编程 课程十四、:CSS核心基础2:选择器优先级 + 伪类选择器(解决冲突+交互效果)
前端·css·交互·css选择器优先级判断规则详解·css important使用·css链接伪类lvha顺序·实现悬浮交互效果
web打印社区2 小时前
前端实现浏览器预览打印:从原生方案到专业工具
前端·javascript·vue.js·electron
yuezhilangniao2 小时前
# 告别乱码:用FastAPI特性与Next.js打造类型安全的API通信
javascript·安全·fastapi