创意时钟:一个HTML/CSS/JavaScript实践案例

195 阅读4分钟

前言

在追求个性化和创意的Web设计领域,制作一个既美观又实用的时钟不仅能够提升网站或应用程序的互动性,还能展现出开发者的设计与技术实力。下面,我们将深入分析一段代码,该代码通过HTML、CSS和JavaScript的精巧结合,构建了一个别具一格的数字时钟,其设计灵感源自于传统的机械表盘,但在细节和动画效果上加入了现代感。

HTML结构设计

HTML部分构建了时钟的基本框架。一个包裹着内外两层的圆形区域构成了时钟的主体,外层为.outer-clock-face,内层为.inner-clock-face。外层设置了四个标记点(.marking),模拟了传统时钟的刻度标记,而内层则放置了代表时、分、秒的指针(.hand)。此外,通过引入背景图片和样式,为时钟增添了一抹艺术气息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <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>
    <script src="./index.js"></script>
</body>
</html>

CSS样式美化

CSS赋予了时钟以生命,通过精心设计的样式,使其外观和质感大大提升。整体采用圆润的边框、渐变色和阴影,营造出立体感。特别值得注意的是,.outer-clock-face使用了绝对定位的伪元素(::before::after)来创建额外的长刻度,增强视觉效果。而.hand类设置了不同的宽度和颜色,区分了时针、分针和秒针,其中秒针采用了更细长且颜色不同的设计,以突出其快速移动的特点。背景图片的运用更是增添了时钟的独特风格。

*{
    margin: 0;
    padding: 0;
}
body{
    height:100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}
.clock{
    width: 300px;
    height: 300px;
    border: 7px solid #ffebdb;
    border-radius: 50%;
    background-image: url(./bg.jpeg);
    background-size: contain;
    padding: 20px;
}
.outer-clock-face{
    width: 100%;
    height: 100%;
    border-radius: 100%;
    position: relative;
}
.marking{
    width: 3px;
    height: 100%;
    background-color: #596235;
    position: absolute;
    left: 50%;
    margin-left: -1.5px;
    border-radius: 10%;
    transform-origin: 50% 50%;
}
.marking-one{
    transform: rotateZ(30deg);
}
.marking-two{
    transform: rotateZ(60deg);
}
.marking-three{
    transform: rotateZ(120deg);
}
.marking-four{
    transform: rotateZ(150deg);
}

.outer-clock-face::before,
.outer-clock-face::after{
    content:'';
    width: 10px;
    height: 100%;
    background-color: #596235;
    display:block;
    position: absolute;
    left: 50%;
    margin-left: -5px;
    border-radius: 8px;
}
.outer-clock-face::after{
    transform: rotateZ(90deg);
}
.inner-clock-face{
    width: 80%;
    height: 80%;
    border-radius: 100%;
    background-image: url(./bg.jpeg);
    background-size: 156.25%;
    background-position: -65px ;
    position: absolute;
    z-index: 1;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
.hand{
    width: 30%;
    height: 6px;
    background-color: #b03715;
    position: absolute;
    top: 50%;
    right: 50%;
    border-radius: 6px;
    margin-top: -3px;
    transform: rotate(90deg);
    transform-origin: 100% 50%;
}
.second-hand{
    width: 45%;
    height: 2px;
    margin-top: -1px;
    background-color: #b3b3b3;
}
.min-hand{
    width: 40%;
    height: 4px;
    margin-top: -0.5px;
    background-color: rgba(8, 172, 194, 0.973);
}

JavaScript驱动动态效果

JavaScript部分是时钟的核心,负责实时更新指针的位置,模拟时间的流逝。setDate函数每秒执行一次,通过new Date()获取当前时间,并根据时、分、秒计算相应的旋转角度(单位为度),再通过transform: rotate() CSS属性实现指针的动态旋转。这里利用了时钟学的基本原理:一圈360度,一小时内时针走30度(12小时制),一分钟内分针走6度,一秒内秒针走6度。为了使指针从表盘的中心点开始旋转,设置了transform-origin属性。

var secondHand =document.querySelector('.second-hand')
var minHand =document.querySelector('.min-hand')
var hourHand =document.querySelector('.hour-hand')

function setDate(){
    //拿到当前时间
    var now = new Date()

    //读秒
    var seconds = now.getSeconds()
    //计算旋转角度
    var secondsDeg = ((seconds / 60) * 360) + 90
    //设置秒针角度
    secondHand.style.transform = `rotate(${secondsDeg}deg)`

    //读分
    var mins = now.getMinutes()

    var minsDeg = ((mins / 60) * 360) + 90

    minHand.style.transform = `rotate(${minsDeg}deg)`

    //读时
    var hours = now.getHours()
    
    var hoursDeg = ((hours / 12) * 360+ (mins / 60) * 30) + 90

    hourHand.style.transform = `rotate(${hoursDeg}deg)`
}

setInterval(setDate, 1000);

效果展示

image.png

总结

这段代码不仅展示了如何通过前端技术实现一个既实用又具有设计感的时钟,还体现了前端开发中HTML、CSS和JavaScript三者间紧密合作的重要性。通过简洁的代码结构和巧妙的样式设定,实现了动态时钟效果,不仅加深了对时间表示和动画实现的理解,也启示了开发者如何在网页设计中融合创意与技术,创造出既有功能性又不失美感的作品。这样的实践案例,无疑是对前端开发者技能的一次综合考验,也是对创意和美感追求的一次展现。