vue一个简易时钟

在这里插入图片描述

<template>
  <div class="">
    时间{{ time }}

    <div class="base1">
      <div class="move-to-center line"></div>
      <div class="move-to-center line line2"></div>
      <div class="move-to-center line line3"></div>
      <div class="move-to-center line line4"></div>
      <div class="move-to-center line line5"></div>
      <div class="move-to-center line line6"></div>
      <!--base2用来遮挡line1~6-->
      <div class="move-to-center base2"></div>
      <!--这里DOM节点有排列顺序要求,center在最上面挡住3个指针~-->
      <div class="ptr m-ptr" :style="{ transform: `rotate(${mPtr}deg)` }"></div>
      <div class="ptr h-ptr" :style="{ transform: `rotate(${hPtr}deg)` }"></div>
      <div class="ptr s-ptr" :style="{ transform: `rotate(${sPtr}deg)` }"></div>
      <div class="move-to-center center"></div>
    </div>
    <div class="time-label">当前时间:{{ time }}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      timer: '',
      time: '',
      h: 0,
      m: 0,
      s: 0,
      sPtr: -180,
      mPtr: -180,
      hPtr: -180
    }
  },
  async created() {
    let d = new Date()
    let h = d.getHours()
    let m = d.getMinutes()
    let s = d.getSeconds()
    this.h = h >= 10 ? h : `0${h}`
    this.m = m >= 10 ? m : `0${m}`
    this.s = s >= 10 ? s : `0${s}`
    this.sPtr += s * 6
    this.mPtr += m * 6 + s * 0.1
    this.hPtr += h * 30 + m * 0.5 + s / 120
    setInterval(() => {
      this.updateTime()
      this.updatePtr()
    }, 1000)
    this.gettoday()
    await this.getTime()
  },
  methods: {
    updateTime() {
      this.s++
      if (this.s === 60) {
        this.m++
        this.s = 0
      }
      if (this.m === 60) {
        this.h++
        this.m = 0
      }
      if (this.h === 24) {
        this.h = 0
      }
    },
    updatePtr() {
      this.sPtr += 6
      if (this.sPtr > 360) this.sPtr -= 360
      this.mPtr += 0.1
      if (this.mPtr > 360) this.mPtr -= 360
      this.hPtr += 1 / 120
      if (this.hPtr > 360) this.hPtr -= 360
    },
    gettoday() {
      let data = new Date()
      //   获取时分秒
      let h = data.getHours()
      let m = data.getMinutes()
      let s = data.getSeconds()
      if (h < 10) {
        h = '0' + h
      }
      if (m < 10) {
        m = '0' + m
      }
      if (s < 10) {
        s = '0' + s
      }
      this.time = h + ':' + m + ':' + s
    },
    getTime() {
      this.timer = setInterval(() => {
        this.gettoday()
      }, 1000)
    }
  },
  beforeDestroy() {
    clearInterval(this.timer)
  }
}
</script>

<style lang="scss" scoped>
body {
  margin: 0;
  background-color: wheat;
}

div {
  box-sizing: border-box;
}

.container {
  width: 100%;
  height: 100vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.base1 {
  background-color: #ddd;
  border: 10px solid #ed6e46;
  border-radius: 50%;
  width: 300px;
  height: 300px;
  position: relative;
}

.move-to-center {
  position: absolute;
  top: 50%;
  left: 50%;
}

.center {
  --cw: 20px;
  --offset: calc(-1 * var(--cw) / 2);
  width: var(--cw);
  height: var(--cw);
  border-radius: 50%;
  background-color: #ed6e46;
  margin-left: var(--offset);
  margin-top: var(--offset);
}

.base2 {
  --shade-w: 260px;
  --offset: calc(-1 * var(--shade-w) / 2);
  width: var(--shade-w);
  height: var(--shade-w);
  border-radius: 50%;
  background-color: #ddd;
  margin-left: var(--offset);
  margin-top: var(--offset);
}

.line {
  width: 5px;
  height: 280px;
  background-color: gray;
  margin-left: -2.5px;
  margin-top: -140px;
}

.line2 {
  transform: rotate(30deg);
}

.line3 {
  transform: rotate(60deg);
}

.line4 {
  transform: rotate(90deg);
}

.line5 {
  transform: rotate(120deg);
}

.line6 {
  transform: rotate(150deg);
}

.ptr {
  position: absolute;
  top: 50%;
  left: 50%;
  transform-origin: top;
}

.s-ptr {
  background-color: black;
  width: 2px;
  height: 110px;
  margin-left: -1px;
}

.m-ptr {
  background-color: #f8b65b;
  --w: 8px;
  width: var(--w);
  height: 90px;
  border-radius: calc(var(--w) / 2);
  margin-left: calc(-1 * var(--w) / 2);
}

.h-ptr {
  background-color: #f8b65b;
  --w: 8px;
  width: var(--w);
  height: 70px;
  border-radius: calc(var(--w) / 2);
  margin-left: calc(-1 * var(--w) / 2);
}

.time-label {
  margin-top: 32px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627830.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion入门使用技巧及个人实例分享--大模型及lora篇

大家好&#xff0c;近期使用Stable Diffusion比较多&#xff0c;积累整理了一些内容&#xff0c;得空分享给大家。如果你近期正好在关注AI绘画领域&#xff0c;可以看看哦。 本文比较适合已经解决了安装问题&#xff0c;&#xff08;没有安装的在文末领取&#xff09; 在寻找合…

wireshark_概念

ARP (Address Resolution Protocol&#xff09;协议&#xff0c;即地址解析协议。该协议的功能就是将IP地址解析成MAC地址。 混杂模式 抓取经过网卡的所有数据包&#xff0c;包括发往本网卡和非发往本网卡的。 非混杂模式 只抓取目标地址是本网卡的数据包&#xff0c;对于发往…

鲁大师2023两轮电动车行业调研报告

自2021年3月起&#xff0c;鲁大师已经连续两年发布涵盖了电动自行车、轻便电动摩托、中高端电动摩托等品类的《电动两轮车行业报告》。如今&#xff0c;在持续进军两轮电动车评测的基础上&#xff0c;通过线上线下多维度深入调研&#xff0c;鲁大师拟于近期发布《2023两轮电动车…

修改远程服务器Nginx默认端口

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

【python数据预处理系列】使用Pandas的factorize()函数进行类别编码(整数编码)

在Pandas中&#xff0c;factorize()函数主要用于将分类变量转换为整数编码&#xff0c;这对于减少内存使用或准备数据进行某些统计分析非常有用。 它实际上是将列的唯一值映射到从0开始的整数序列上。 假设有一个DataFrame&#xff0c;其中一列包含一些类别值&#xff0c;你希望…

关于电源1

电源的定义 广义定义&#xff1a;电源是将其它形式的能转换成电能的装置。 例如&#xff1a;发电机&#xff1a;将热能、水能、风能、核能、光照、震动等转化为电能的装置。 电池&#xff1a;将化学能转换为电能。 狭义定义&#xf…

哪个品牌led灯好?五大公认最好用的护眼台灯推荐!

哪个品牌led灯好&#xff1f;经过查找信息之后可以明确地看到市面上受好评比较多的护眼台灯是书客、松下、飞利浦等品牌&#xff0c;我也精心挑选了五款公认最优秀的护眼台灯进行推荐&#xff01;在现代生活中&#xff0c;护眼台灯不仅是照明工具&#xff0c;更是关乎眼部健康的…

GPT-4o API 全新版本发布:提升性能,增加性价比

5月13日&#xff0c;OpenAI 发布了全新ChatGPT模型 GPT-4o&#xff0c;它在响应速度和多媒体理解上都有显著提升。在这篇文章中&#xff0c;我们将介绍 GPT-4o 的主要特点及其 API 集成方式。 什么是 GPT-4o&#xff1f; GPT-4o 是 OpenAI 于5月13日发布的最新多模态 AI 模型…

嵌入式详细教程:基于STM32实现语音识别系统

目录 文章主题环境准备语音识别系统基础代码示例&#xff1a;实现语音识别系统应用场景&#xff1a;智能家居与便携设备问题解决方案与优化 1. 文章主题 文章主题 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现语音识别系统&#xff0c;特别是如何通过STM32与麦克风…

HTTP代理可以应用在那些领域呢

HTTP代理是IP代理领域中一个重要组成部分&#xff0c;它基于HTTP协议传输&#xff0c;使用海外服务器帮助用户绕开访问限制&#xff0c;浏览查看海外资讯信息。 HTTP代理可以应用在哪些领域呢&#xff1f; 1.保护使用者隐私 当今越来越数据被上传到网络云端上&#xff0c;用户…

网关过滤器实现接口签名检验

背景 往往项目中的开放接口可能被别有用心者对其进行抓包然后对请求参数进行篡改&#xff0c;或者重复请求占用系统资源为此我们行业内使用比较多的策略是接口签名校验。签名校验的实现可以用注解aop的形式实现&#xff0c;也可以使用过滤器统一拦截校验实现&#xff0c;此篇文…

从新手到高手,教你如何改造你的广告思维方式!

想要广告震撼人心又让人长时间记住&#xff1f;答案肯定是“创意”二字。广告创意&#xff0c;说白了就是脑洞大开&#xff0c;想法新颖。那些很流行的广告&#xff0c;都是因为背后的想法特别、新颖。做广告啊&#xff0c;就得不停地思考&#xff0c;创新思维是关键。 广告思…

智能数据提取:在严格数据治理与安全标准下的实践路径

一、引言 随着信息技术的飞速发展&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据量的爆炸式增长和数据格式的多样化&#xff0c;使得传统的数据提取方法变得效率低下且难以满足业务需求。智能数据提取技术应运而生&#xff0c;它通过应用人工智能和机器学…

基于Springboot汽车租赁预约管理系统

一&#xff1a;功能介绍 本系统是Springboot项目采用的技术栈主要有Spring、mybaits、springboot、mysql数据库 功能角色主要分为管理员、超级管理员、用户等几个角色 二&#xff1a;功能截图 三&#xff1a;源码获取

CheckStyle静态样式之道

优质博文&#xff1a;IT-BLOG-CN 在标准化的统一样式检查规范里&#xff0c;最为常用的统一样式工具是checkstyle插件&#xff0c;而不是国内阿里的代码规约插件。 【1】下载插件 【2】配置生效 配置生效及告警设置 【3】配置checkstyle.xml 官网地址 官网最新Releases 下面…

2024年京东618红包领取口令是什么?2024年618京东红包活动时间是从什么时候开始到几号结束?

2024年京东618红包活动时间 京东618红包活动时间是从2024年5月28日开始&#xff0c;一直持续到6月18日结束。 2024年京东618红包领取方式 在2024年京东618活动时间内&#xff0c;每天都可以打开手机京东APP&#xff0c;输入框搜索红包领取口令「 天降红包882 」&#xff0c;搜…

253 基于matlab的液压位置控制源代码

基于matlab的液压位置控制源代码&#xff0c;有摩擦补偿&#xff0c;利用滑模控制器实现&#xff0c;神经网络逼近。最后实现位置角度和速度的控制。输出控制误差。程序已调通&#xff0c;可直接运行。 253 液压位置控制 滑模控制器 控制误差 - 小红书 (xiaohongshu.com)

Excel 每 N 列内容填成一行

Excel表格从第 2 列起&#xff0c;每 N 列为一组&#xff0c;以 N2 为例&#xff1a; ABCDEFG1IDType 1Count 1Type 2Count 2Type 3Count 321a640d290a32d12000a1900f600043f48000f3600e160054c46000e3100b120065e47000c3400d140076b64000b3600c1200 现在要进列转行&#xff…

5G技术相关部分图解

1、面向5G商用网络的全系列解决方案 面向5G商用网络的全系列解决方案涵盖了从核心网到接入网的各个方面&#xff0c;确保网络的高性能、高可靠性和高安全性 2、2\3\4\5G带宽图解 G带宽的提升将推动许多新型应用的发展&#xff0c;并提供更快速、更可靠的移动通信体验。然而…

为Akamai 云平台上部署的资源配置2FA跳板机-上

为重要账户启用2FA&#xff0c;这几乎已经成为保护账户和数据安全的一种标准做法。无论登录常见应用或服务&#xff0c;或是访问企业内部资源&#xff0c;时不时都会需要进行2FA验证。那么当你在Akamai Connected Cloud云平台中部署了各类资源&#xff08;云计算、云存储、SaaS…