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

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式,效果如下:

一、html代码如下:

<template>
  <!--圆圈-->
  <div class="notice_border">
    <div class="notice_position notice_name_class" v-for="item in [3,6,9,12]">{{ item }}</div>
    <!--最中心的点-->
    <div class="notice_node"/>
    <!--时针-->
    <div class="notice_hour_class" ref="hour_time"/>
    <!--分针-->
    <div class="notice_minutes_class" ref="second_time"/>
    <!--刻度线-->
    <div class="scale_class" :ref="`scale_${index}`" v-for="(item,index) in 60" :key="index"/>
  </div>
</template>

二、js代码如下:

<script>
export default{
  data(){
    return{

     }
  },
  mounted(){
    this.get_notice_time();
  },
  methods:{
    get_notice_time(){
     let notice_time = '12:00';//时间格式
      for (let i = 0; i < 60; i++) {
        let scale_class = this.$refs[`scale_${i}`];  // 获取每个元素
        scale_class[0].style.transform = `rotate(${i * 6}deg)`;  // 修改样式
      }

      let hour_time = this.$refs.hour_time;//时针
      let second_time = this.$refs.second_time;//分针
      if (notice_time!= 0) {
        hour_time.style.transform = `rotate(${moment(notice_time.split(':')[0], 'HH').format('H') * 30}deg)`;//时针一次转30°
        second_time.style.transform = `rotate(${moment(notice_time.split(':')[1], 'mm').format('m') * 6}deg)`;//分针一次转6°
      }
    }
  }
}
</script>

三、style代码如下:

<style>
//圆圈样式
.notice_border {
  width: 58%;
  height: 57%;
  border-radius: 100%;
  border: 5px solid #3673E3;
  position: absolute;
  right: 10%;
  top: 14%;
}

//字体位置
.notice_position {
  position: absolute;
  color: skyblue;
  font-weight: bolder;
}

//字体样式 3,6,9,12
.notice_name_class:nth-child(1) {
  right: 7%;
  top: 41%;
}

.notice_name_class:nth-child(2) {
  right: 44%;
  bottom: 4%;
}

.notice_name_class:nth-child(3) {
  left: 8%;
  top: 41%;
}

.notice_name_class:nth-child(4) {
  left: 42%;
  top: 4%;
}

//节点样式
.notice_node {
  position: absolute;
  width: 10%;
  height: 10%;
  border-radius: 100%;
  background-color: #3673E3;
  left: 45%;
  top: 45%;
  z-index: 2;
}

//时针样式
.notice_hour_class {
  position: absolute;
  width: 5%;
  height: 20%;
  background-color: red;
  left: 47.5%;
  top: 30%;
  border-radius: 5px 5px 0 0;
  z-index: 1;
  transform-origin: bottom; //绕着底部旋转
  //transform: rotate(90deg);
}

//分针样式
.notice_minutes_class {
  position: absolute;
  width: 5%;
  height: 33%;
  background-color: #3673E3;
  //background-color: white;
  left: 47.5%;
  top: 18%;
  border-radius: 5px 5px 0 0;
  transform-origin: bottom; //绕着底部旋转
}

//默认刻度线
.scale_class {
  position: absolute;
  width: 1%;
  height: 7%;
  background-color: #3673E3;
  top: 0;
  left: 50%;
  transform-origin: center 60px;//设置中心点旋转,要绕着notice_node 
}

//循环每一个刻度线,5的倍数
.scale_class:nth-of-type(5n-2) {
  width: 2.5%;
  height: 10%;
}
</style>

四、完整代码如下:

可以用作时钟的通用组件。

<template>
  <!--圆圈-->
  <div class="notice_border">
    <div class="notice_position notice_name_class" v-for="item in [3,6,9,12]">{{ item }}</div>
    <!--最中心的点-->
    <div class="notice_node"/>
    <!--时针-->
    <div class="notice_hour_class" ref="hour_time"/>
    <!--分针-->
    <div class="notice_minutes_class" ref="second_time"/>
    <!--刻度线-->
    <div class="scale_class" :ref="`scale_${index}`" v-for="(item,index) in 60" :key="index"/>
  </div>
</template>
<script>
import moment from "moment";

export default {
  data(){
    return{
      notice_time:'',//时间
    }
  },
  props: {
    // 获取传入时间
    props_time: {
      type: [String,Number],
    }
  },
  watch:{
    props_time(newVal,oldVal){
      this.notice_time = newVal;
      this.get_notice_time();
    },deep:true
  },
  methods: {
    get_notice_time() {
      //let notice_time = this.notice_time;//时间格式
      let notice_time = '12:00';//时间格式
      for (let i = 0; i < 60; i++) {
        let scale_class = this.$refs[`scale_${i}`];  // 获取每个元素
        scale_class[0].style.transform = `rotate(${i * 6}deg)`;  // 修改样式
      }

      let hour_time = this.$refs.hour_time;//时针
      let second_time = this.$refs.second_time;//分针
      if (notice_time != 0) {//防止时间为空
        hour_time.style.transform = `rotate(${moment(notice_time.split(':')[0], 'HH').format('H') * 30}deg)`;//时针一次转30°
        second_time.style.transform = `rotate(${moment(notice_time.split(':')[1], 'mm').format('m') * 6}deg)`;//分针一次转6°
      }
    }
  }
}
</script>
<style scoped lang="less">
.notice_border {
  width: 58%;
  height: 57%;
  border-radius: 100%;
  border: 5px solid #3673E3;
  position: relative;
}


.notice_position {
  position: absolute;
  color: skyblue;
  font-weight: bolder;
}

.notice_name_class:nth-child(1) {
  right: 7%;
  top: 41%;
}

.notice_name_class:nth-child(2) {
  right: 44%;
  bottom: 4%;
}

.notice_name_class:nth-child(3) {
  left: 8%;
  top: 41%;
}

.notice_name_class:nth-child(4) {
  left: 42%;
  top: 4%;
}

.notice_node {
  position: absolute;
  width: 10%;
  height: 10%;
  border-radius: 100%;
  background-color: #3673E3;
  left: 45%;
  top: 45%;
  z-index: 2;
}

.notice_hour_class {
  position: absolute;
  width: 5%;
  height: 20%;
  background-color: red;
  left: 47.5%;
  top: 30%;
  border-radius: 5px 5px 0 0;
  z-index: 1;
  transform-origin: bottom;
  //transform: rotate(90deg);
}

.notice_minutes_class {
  position: absolute;
  width: 5%;
  height: 33%;
  background-color: #3673E3;
  left: 47.5%;
  top: 18%;
  border-radius: 5px 5px 0 0;
  transform-origin: bottom;
}

.scale_class {
  position: absolute;
  width: 1%;
  height: 7%;
  background-color: #3673E3;
  top: 0;
  left: 50%;
  transform-origin: center 60px;
}

.scale_class:nth-of-type(5n-2) {
  width: 2.5%;
  height: 10%;
}
</style>


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

相关文章:

  • 《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
  • 掌握正则表达式:从入门到精通的实战指南
  • Nature Electronics——近传感器计算:50 nm异构集成技术的革命
  • 用python 进行雷电接口检测
  • BGP的local_preference本地优先级属性
  • 联邦学习中的LoRA:FedLoRA
  • HTML5 波动动画(Pulse Animation)详解
  • 微信小程序中使用weui组件库
  • 基于知识蒸馏的跨模态目标检测方法总结
  • 【问题记录】npm create vue@latest报错
  • 后勤管理系统|Java|SSM|VUE| 前后端分离
  • 系统分析师笔记
  • 上门按摩系统架构与功能分析
  • PHP语言的正则表达式
  • 面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现
  • STM32之一种双通路CAN总线消息备份冗余处理方法(十三)
  • 工业级千兆路由器 5G+WIFI6 高速稳定串口采集
  • 计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
  • 系统架构设计师考点—软件工程基础知识
  • Ruby语言的多线程编程
  • React Native 项目 Error: EMFILE: too many open files, watch
  • Linux 环境(Ubuntu)部署 Hadoop 环境
  • 【开源免费】基于SpringBoot+Vue.JS教学辅助平台(JAVA毕业设计)
  • C#语言的函数实现
  • WebSocket 安全实践:从认证到加密
  • 常见框架漏洞常见中间件漏洞