前端样式练手:阴阳图+时钟的组合

news2024/12/26 13:20:45

开篇

今天的小作品是突然脑子灵光一闪写出来的,代码不多,就不过多赘述了。

代码实现

<template>
  <div class="clock-container">
    <!-- 八卦图 -->
    <!-- <div class="bagua">
      <div
        v-for="(trigram, index) in trigrams"
        :key="index"
        class="trigram"
        :style="{ transform: `rotate(${index * 45}deg)` }"
        :data-name="trigram.name"
      >
        <div class="trigram-lines">
          <div
            v-for="(line, lineIndex) in trigram.lines"
            :key="lineIndex"
            :class="['line', line ? 'yang' : 'yin']"
          ></div>
        </div>
      </div>
    </div> -->

    <!-- 太极图 -->
    <div class="taiji">
      <div class="taiji-inner">
        <div class="yang">
          <div class="dot"></div>
        </div>
        <div class="yin">
          <div class="dot"></div>
        </div>
      </div>
    </div>

    <!-- 时钟 -->
    <div class="clock">
      <div class="hand hour" :style="hourRotation"></div>
      <div class="hand minute" :style="minuteRotation"></div>
      <div class="hand second" :style="secondRotation"></div>
      <div
        v-for="n in 12"
        :key="n"
        class="number"
        :style="{ transform: `rotate(${n * 30}deg)` }"
      >
        <span :style="{ transform: `rotate(-${n * 30}deg)` }">{{ n }}</span>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue';

const time = ref(new Date());
let timer;

const updateTime = () => {
  time.value = new Date();
};

onMounted(() => {
  timer = setInterval(updateTime, 1000);
});

onUnmounted(() => {
  clearInterval(timer);
});

const hourRotation = computed(() => ({
  transform: `rotate(${(time.value.getHours() % 12 + time.value.getMinutes() / 60) * 30}deg)`,
}));

const minuteRotation = computed(() => ({
  transform: `rotate(${time.value.getMinutes() * 6}deg)`,
}));

const secondRotation = computed(() => ({
  transform: `rotate(${time.value.getSeconds() * 6}deg)`,
}));

// 八卦数据:每个卦象由三条爻组成,true表示阳爻,false表示阴爻
// const trigrams = [
//   { name: '乾', lines: [true, true, true] },    // ?
//   { name: '兑', lines: [true, true, false] },   // ?
//   { name: '离', lines: [true, false, true] },   // ?
//   { name: '震', lines: [false, false, true] },  // ?
//   { name: '巽', lines: [true, false, false] },  // ?
//   { name: '坎', lines: [false, true, false] },  // ?
//   { name: '艮', lines: [false, true, true] },   // ?
//   { name: '坤', lines: [false, false, false] }  // ?
// ];
</script>

<style scoped>
.clock-container {
  position: relative;
  width: 600px;
  height: 600px;
}

.bagua {
  position: absolute;
  width: 100%;
  height: 100%;
  animation: rotate 60s linear infinite;
  pointer-events: none;
}

.trigram {
  position: absolute;
  width: 80px;
  height: 160px;
  top: 0;
  left: 50%;
  transform-origin: 50% 300px;
  margin-left: -40px;
  display: flex;
  justify-content: center;
  align-items: flex-start;
}

.trigram-lines {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  padding: 10px;
  background: rgba(255, 255, 255, 0.8);
  border-radius: 8px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}

.line {
  width: 60px;
  height: 8px;
  background: #000;
  border-radius: 4px;
}

.line.yang {
  background: #000;
  border-radius: 2px;
}

.line.yin {
  background: transparent;
  display: flex;
  justify-content: space-between;
}

.line.yin::before,
.line.yin::after {
  content: '';
  width: 25px;
  height: 8px;
  background: #000;
  border-radius: 4px;
}

.line.yin::before {
  left: 0;
}

.line.yin::after {
  right: 0;
}

.trigram::after {
  content: attr(data-name);
  position: absolute;
  top: -30px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 16px;
  font-weight: bold;
  color: #000;
  background: rgba(255, 255, 255, 0.9);
  padding: 4px 10px;
  border-radius: 4px;
  white-space: nowrap;
}

.taiji {
  position: absolute;
  width: 500px;
  height: 500px;
  top: 50px;
  left: 50px;
  border-radius: 50%;
  background: linear-gradient(90deg, #000 50%, #fff 50%);
  animation: rotate 30s linear infinite;
}

.taiji-inner {
  position: relative;
  width: 100%;
  height: 100%;
}

.yang,
.yin {
  position: absolute;
  width: 50%;
  height: 50%;
  border-radius: 50%;
}

.yang {
  background: #000;
  top: 0;
  left: 25%;
}

.yin {
  background: #fff;
  bottom: 0;
  left: 25%;
}

.dot {
  position: absolute;
  width: 50%;
  height: 50%;
  border-radius: 50%;
  top: 25%;
  left: 25%;
}

.yang .dot {
  background: #fff;
}

.yin .dot {
  background: #000;
}

.clock {
  position: absolute;
  width: 300px;
  height: 300px;
  top: 150px;
  left: 150px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.9);
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
}

.hand {
  position: absolute;
  bottom: 50%;
  left: 50%;
  transform-origin: bottom;
  background: #333;
}

.hour {
  width: 4px;
  height: 60px;
  margin-left: -2px;
}

.minute {
  width: 3px;
  height: 80px;
  margin-left: -1.5px;
  background: #666;
}

.second {
  width: 2px;
  height: 90px;
  margin-left: -1px;
  background: #f00;
}

.number {
  position: absolute;
  width: 100%;
  height: 100%;
  text-align: center;
  transform-origin: center;
}

.number span {
  display: inline-block;
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
</style>

在这里插入图片描述

这里看起来代码量比较大,是因为我在尝试在阴阳图外面加一个八卦图,但是失败了,这里只能等待后续有时间了再完善了。其实单纯阴阳图的代码量还是很少的,我在下面把阴阳图的实现样式代码抽离出来。

阴阳图代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      body {
        height: 100vh;
        width: 100vw;
      }
      .taiji {
        width: 500px;
        height: 500px;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        border-radius: 50%;
        background: linear-gradient(90deg, #000 50%, #fff 50%);
        animation: rotate 10s linear infinite;
        border: 1px solid #000;
      }

      .taiji-inner {
        position: relative;
        width: 100%;
        height: 100%;
      }

      .yang,
      .yin {
        position: absolute;
        width: 50%;
        height: 50%;
        border-radius: 50%;
      }

      .yang {
        background: #000;
        top: 0;
        left: 25%;
      }

      .yin {
        background: #fff;
        bottom: 0;
        left: 25%;
      }
    </style>
  </head>
  <body>
    <div class="taiji">
      <div class="taiji-inner">
        <div class="yang">
          <div class="dot"></div>
        </div>
        <div class="yin">
          <div class="dot"></div>
        </div>
      </div>
    </div>
  </body>
</html>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW软件项目设计方案如何制定

制定LabVIEW软件项目设计方案需要综合考虑需求分析、架构设计、功能模块划分和时间预算等多个方面&#xff0c;确保项目开发过程高效、可控且最终满足目标要求。以下是一个详细的制定流程&#xff1a; ​ 1. 需求分析 目标定义&#xff1a;明确项目的目标&#xff0c;例如数据采…

IMX芯片启动方式

一、启动方式选择 a)概述 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次…

Pyside6 在 pycharm 中的配置

打开文件->设置 找到 工具->外部工具 点击 号 创建一个外部工具 QtDesigner 名称:QtDesigner 程序&#xff1a;D:\miniconda\envs\ergoAI-qt\Lib\site-packages\PySide6\designer.exe 实参&#xff1a;$FileName$ 工作目录&#xff1a;$FileDir$ PyUIC 名称&#xf…

Elasticsearch:什么是提示工程 - prompt engineering?

提示工程流程定义 提示工程是一种工程技术&#xff0c;用于设计生成式 AI 工具&#xff08;generative AI tools&#xff09;的输入&#xff0c;以调整大型语言模型并优化输出。 提示&#xff08;prompts&#xff09;被称为输入&#xff0c;而由生成性 AI 工具生成的答案是输…

金融租赁系统的发展与全球化战略实施探讨

内容概要 金融租赁系统的演变并非一帆风顺&#xff0c;像一场跌宕起伏的电影。首先&#xff0c;咱们得看看它的起源及现状。随着经济的快速发展&#xff0c;金融租赁逐渐作为一种灵活的融资手段崭露头角。在中国市场中&#xff0c;企业对设备和技术更新换代的需求日益迫切&…

1.flask介绍、入门、基本用法

flask与djiango的区别 djiango是一个大而全的框架。 djiango内部为我们提供了非常多的组件: orm/session/cookie/admin/form/modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接 flask 是一个轻量级的框架&#xff0c;本身没有什么太多的功能&a…

【vue2父组件调用子组件方法之slot的使用】

父组件调用子组件方法之slot的使用 具体功能需求&#xff1a; 一个页面&#xff0c;点击按钮&#xff0c;打开一个弹窗。弹窗有自定义表单和公共表单&#xff0c;提交的时候要获取两个表单的数据以及复显表单数据 为什么使用插槽了&#xff0c;因为我需要在弹窗中复用公共表单…

认识计算机网络

单单看这一个词语&#xff0c;有熟悉又陌生&#xff0c;让我们来重新认识一下这位大角色——计算机网络。、 一、是什么 以及 怎么来的 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路和通信设备连接起来&#xff0c;在网络操…

GitLab部署到阿里云服务器上

GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能&#xff0c;能够浏览源代码&#xff0c;管理缺陷和注释。 一、安装 1.创建一…

windows nacos安装配置

GitHub下载压缩包 解压目录&#xff08;注意不要用中文路径&#xff09; 在mysql先创建数据库nacos&#xff0c;再执行sql脚本 配置数据库 #*************** Config Module Related Configurations ***************# ### If use MySQL as datasource: ### Deprecated conf…

ChildLife“童年时光杯”足球联赛启动 共促青少年健康成长

2024年12月21日至22日&#xff0c;由美国知名婴幼儿营养品牌ChildLife童年时光赞助的“童年时光杯”青少年足球联赛将在上海拉开帷幕。本次赛事U7/U8组别共有16支足球队参赛&#xff0c;包括上海幸运星足球俱乐部旗下的明星球队&#xff0c;以及其他青少年俱乐部的优秀队伍&…

动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录 引例 其余经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 引例 OJ 传送门Leetcode<647>回文子串 画图分析&#xff1a; 使用动态规划解决 原理&#xff1a;能够将所有子串是否是回文的信息保存在dp表中 在使用暴力方法枚举出所有子串&#xff0c;是…

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…

探索Flink动态CEP:杭州银行的实战案例

摘要&#xff1a;本文撰写自杭州银行大数据工程师唐占峰、欧阳武林老师。将介绍 Flink 动态 CEP的定义与核心概念、应用场景、并深入探讨其技术实现并介绍使用方式。主要分为以下几个内容&#xff1a; Flink动态CEP简介 Flink动态CEP的应用场景 Flink动态CEP的技术实现 Flin…

Git多人协作流程与git命令

目录 一、拉取&#xff1a;从仓库到本地1、第一次拉取2、后续的拉取 二、上传&#xff1a;从本地到仓库三、git commit版本信息标注 一、拉取&#xff1a;从仓库到本地 1、第一次拉取 # clone项目 git clone xxx2、后续的拉取 第一次拉取是指本地为空&#xff0c;如果本地已…

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

[Unity] ShaderGraph动态修改Keyword Enum,实现不同效果一键切换

上次更新已然四个月前&#xff0c;零零散散的工作结束&#xff0c;终于有时间写点东西记录一下~ 实际使用中&#xff0c;经常会碰到同一个对象需要切换不同的材质&#xff0c;固然可以通过C#直接替换材质球。 或者在ShaderGraph中使用Comparison配合Branch实现切换&#xff…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述&#xff1a;1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时&#xff0c;往往会想到在多个GPU或多台机器上进行模型训练。不过&#xff0c;即便是在单个GPU上&#xff0c;也存在多种方法来训练更大规模的模型并提升…

数据结构(哈希表(中)纯概念版)

前言 哈希表&#xff08;Hash Table&#xff09;是计算机科学中的一个基础而重要的数据结构&#xff0c;它广泛评估各种算法和系统中&#xff0c;尤其是在需要快速查找、插入和删除操作的场景中。由于其O( 1)的平均时间复杂度&#xff0c;存储表在性能要求较高的应用中表现得非…