效果如下:

代码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>现代风格时钟</title>
  <style>
    body {
      display: flex;
      justify-content: center;
      align-items: center;
      height: 100vh;
      margin: 0;
      font-family: Arial, sans-serif;
      background-color: #f0f0f0;
      transition: background-color 0.5s;
    }
    .clock-container {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
    .clock {
      position: relative;
      width: 200px;
      height: 200px;
      /*将正方形变为圆形*/
      border-radius: 50%;
      background-color: white;
      border: 1px solid black;
      /*添加阴影*/
      box-shadow: 0 0 20px rgba(0,0,0,0.1);
    }
    /*实现时针、分针、秒针绕圆心转动*/
    .hand {
      /*圆心定位*/
      position: absolute;
      bottom: 50%; /*距离底部50%*/
      left: 50%; /*距离左边50%,此时只有translateX向左移动50%(即translate(-50%),此时旋转轴才和圆心重合)*/
      /* 设置旋转元素的基点位置 ,即旋转轴的位置*/
      /*默认值为50% 50%,即矩形的中心,x轴的位置应该为center(即50%),y轴的位置为bottom(即100%),top为0,bottom为100%*/
      transform-origin: 50% 100%;
      /*倒圆角*/
      border-radius: 5px;
    }
    /*时针*/
    .hour {
      width: 4px;
      height: 50px;
      background-color: #333;
    }
    /*分针*/
    .minute {
      width: 3px;
      height: 70px;
      background-color: #666;
    }
    /*秒针*/
    .second {
      width: 2px;
      height: 90px;
      background-color: #e74c3c;
    }
    /*圆心*/
    .center {
      position: absolute;
      top: 50%;/*距顶部0%*/
      left: 50%;/*距左边50%*/
      /*正方形左上角在50% 50%处*/
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background-color: #333;
      /*正方形向左移动50%,向上移动50%,此时中心位置为50% 50%*/
      transform: translate(-50%, -50%);
    }
    .digital-time {
      font-size: 48px;
      margin-top: 20px;
      color: #333;
    }
    .mode-switch {
      margin-top: 20px;
      padding: 10px 20px;
      font-size: 16px;
      cursor: pointer;
      background-color: #333;
      color: white;
      border: none;
      border-radius: 5px;
      transition: background-color 0.3s;
    }
    .mode-switch:hover {
      background-color: #555;
    }
    .night-mode {
      background-color: #222;
    }
    .night-mode .clock {
      background-color: #333;
      box-shadow: 0 0 20px rgba(255,255,255,0.1);
    }
    .night-mode .hour, .night-mode .minute {
      background-color: #fff;
    }
    .night-mode .second {
      background-color: #e74c3c;
    }
    .night-mode .center {
      background-color: #fff;
    }
    .night-mode .digital-time {
      color: #fff;
    }
    .night-mode .mode-switch {
      background-color: #f0f0f0;
      color: #333;
    }
    .night-mode .mode-switch:hover {
      background-color: #ddd;
    }
  </style>
</head>
<body>
<div class="clock-container">
  <div class="clock">
    <div class="hand hour"></div>
    <div class="hand minute"></div>
    <div class="hand second"></div>
    <div class="center"></div>
  </div>
  <div class="digital-time"></div>
  <button class="mode-switch">Dark mode</button>
</div>

<script>
  function updateClock() {
    const now = new Date();
    const hours = now.getHours();
    const minutes = now.getMinutes();
    const seconds = now.getSeconds();

    const hourDeg = (hours % 12 + minutes / 60) * 30; // 总共360度,一圈是12个小时,那么一个小时30度
    const minuteDeg = (minutes + seconds / 60) * 6; // 总共360度,一圈是60分钟,那么一分钟6度
    const secondDeg = seconds * 6; // 总共360度,一圈是60秒,那么一秒钟6度
    // 让时针转动,translateX(-50%)表示矩形向左移动50%,此时旋转轴与圆心重合
    document.querySelector('.hour').style.transform = `translateX(-50%) rotate(${hourDeg}deg)`;
    // 让分针转动,translateX(-50%)表示矩形向左移动50%,此时旋转轴与圆心重合
    document.querySelector('.minute').style.transform = `translateX(-50%) rotate(${minuteDeg}deg)`;
    // 让秒针转动,translateX(-50%)表示矩形向左移动50%,此时旋转轴与圆心重合
    document.querySelector('.second').style.transform = `translateX(-50%) rotate(${secondDeg}deg)`;
    // 显示时间
    const digitalTime = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')} ${hours >= 12 ? 'PM' : 'AM'}`;
    document.querySelector('.digital-time').textContent = digitalTime;
  }
  // 切换模式
  function toggleMode() {
    // 使用document.body.classList.toggle('night-mode');的时候,当前元素body有'night-mode'这个类名时删除这个类名,反之没有这个类名则添加这个类名到classList的后面
    document.body.classList.toggle('night-mode');
    const button = document.querySelector('.mode-switch'); // 选择按钮
    button.textContent = document.body.classList.contains('night-mode') ? 'Light mode' : 'Dark mode';  // 修改内容
  }

  setInterval(updateClock, 1000); // 1000毫秒,即1s钟执行一次
  // updateClock(); // 立即更新一次,避免延迟
  // 监听单击事件,即单击就切换模式
  document.querySelector('.mode-switch').addEventListener('click', toggleMode);
</script>
</body>
</html>

下面来解析样式代码:

position: absolute;
bottom: 50%; /*距离底部50%*/
left: 50%; /*距离左边50%,此时只有translateX向左移动50%(即translate(-50%),此时旋转轴才和圆心重合)*/

此时矩形的左下角在50% 50%的地方,如下图所示:

transform-origin: 50% 100%;

表示旋转轴的位置在底边中点的位置:

即旋转轴的位置如下图所示:

再通过transform属性,将矩形向左平移50%,即(-50%)

transform: translateX(-50%);

如下图所示:

最后用transform属性的rotate旋转角度即可实现绕旋转中(即圆心)旋转

 

posted on 2024-10-10 10:10  周文豪  阅读(23)  评论(0编辑  收藏  举报