【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条

news2024/9/20 22:40:18

创建一个动态进度环组件

在现代网页设计中,进度环是一种常见的视觉元素,用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件,该组件不仅具有美观的视觉效果,还能够根据用户输入动态改变颜色。

在这里插入图片描述

已经支持动态配置-----

相似&灵感

抖音代码示例–直通车
在这里插入图片描述

HTML结构

首先,我们定义了组件的基本HTML结构。在<template>标签内,我们创建了一个div元素,它包含了两个子元素:一个用于显示进度环的div和一个输入框,用户可以通过输入框来改变进度环的颜色。

<template>
   <div class="progress-ring">
     <div class="progress-ring-circle">
       <span
         v-for="(item, index) in 25"
         :key="index"
         :style="{ transform: `rotate(${(index / stripNumber) * 360 + 210}deg)` }"
       ></span>
     </div>
     <input type="text" v-model="value" />
     <button type="button" @click="chColor()">开始</button>
   </div>
</template>

Less样式

接下来,我们使用Less来定义进度环的样式。我们创建了一个.progress-ring-circle类,它定义了进度环的基本样式,包括尺寸、位置和旋转效果。我们还定义了一个span伪元素,用于显示进度环的颜色。

<style scoped lang="less">
.progress-ring-circle {
   width: 40vw;
   height: 40vw;
   position: absolute;
   display: flex;
   justify-content: center;
   align-items: center;
   transform: rotate3d(1, 0, 0, -66deg);
   margin: 120px;

   span {
     --bg: rgba(0, 0, 0, 0);
     --sg: transparent;
     position: absolute;
     height: 100%;
     width: 100%;
     display: flex;
     justify-content: center;
     align-items: start;
     // transform-origin: 0% 0%; /* 将旋转原点设置在左上角 */
   }

   span::after {
     content: "";
     width: 2.5vw;  // 可自行改为动态宽度
     height: 3vw;
     position: absolute;
     background-color: var(--bg);
     box-shadow: 0 0 0.5vw var(--sg), 0 0 1vw var(--sg), 0 0 2vw var(--sg);
     transition: 0.8s linear; /* 指定过渡属性 */
   }
}
</style>

Vue.js逻辑

最后,我们使用Vue.js来添加动态功能。在<script>标签内,我们定义了组件的逻辑。我们创建了一个名为ProgressRing的Vue组件,并在data函数中定义了几个数据属性,包括进度环的颜色值和进度值。

<script>
export default {
   name: "ProgressRing",
   data() {
     return {
       items: ["item 1", "item 2", "item 3", "item 4", "item 5"], // 你可以根据需要修改这个数组
       value: 20,
       stripNumber: 25
     };
   },
   mounted() {},
   methods: {
     chColor() {
       const main = document.querySelector(".progress-ring-circle");
       console.log(main.children.length);
       for (let i = main.children.length - 1; i >= 0; i--) {
         var number = this.stripNumber - this.value / (100 / this.stripNumber);
         if (i >= number) {
           main.children[i].style.setProperty(
             "--bg",
             `hsl(${(i / this.stripNumber) * 360}, 100%, 50%)`
           );
           main.children[i].style.setProperty(
             "--sg",
             `hsl(${(i / this.stripNumber) * 360}, 100%, 50%)`
           );
         } else {
           main.children[i].style.setProperty("--bg", "rgba(0, 0, 0, 0)");
           main.children[i].style.setProperty("--sg", "transparent");
         }
       }
     }
   }
};
</script>

chColor方法中,我们根据用户输入的值动态改变进度环的颜色。我们通过遍历进度环的子元素,并根据当前的进度值来设置每个子元素的颜色。

通过以上步骤,我们成功创建了一个动态进度环组件,它不仅具有美观的视觉效果,还能够根据用户输入动态改变颜色。这种组件在网页设计中非常实用,可以用于展示加载状态或任务完成度。

完整代码:

<style scoped lang="less">
.progress-ring-circle {
  width: 40vw;
  height: 40vw;
  position: absolute;
  display: flex;
  justify-content: center;
  align-items: center;
  transform: rotate3d(1, 0, 0, -66deg);
  margin: 120px;

  span {
    --bg: rgba(0, 0, 0, 0);
    --sg: transparent;
    position: absolute;
    height: 100%;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: start;
    // transform-origin: 0% 0%; /* 将旋转原点设置在左上角 */
  }

  span::after {
    content: "";
    width: 2.5vw; // 改变stripNumber时记得改
    height: 3vw;
    position: absolute;
    background-color: var(--bg);
    box-shadow: 0 0 0.5vw var(--sg), 0 0 1vw var(--sg), 0 0 2vw var(--sg);
    transition: 0.8s linear; /* 指定过渡属性 */
  }
}
</style>
<template>
  <div class="progress-ring">
    <div class="progress-ring-circle">
      <span
        v-for="(item, index) in stripNumber"
        :key="index"
        :style="{
          transform: `rotate(${(index / stripNumber) * 360 + 210}deg)`
        }"
      ></span>
    </div>
    <input type="text" v-model="value" />
    <button type="button" @click="chColor()">开始</button>
  </div>
</template>

<script>
export default {
  name: "ProgressRing",
  data() {
    return {
      items: ["item 1", "item 2", "item 3", "item 4", "item 5"], // 你可以根据需要修改这个数组
      value: 20,
      stripNumber: 25
    };
  },
  mounted() {},
  methods: {
    chColor() {
      const main = document.querySelector(".progress-ring-circle");
      console.log(main.children.length);
      // for (let i = 0; i < main.children.length; i++) {
      for (let i = main.children.length - 1; i >= 0; i--) {
        var number = this.stripNumber - this.value / (100 / this.stripNumber);
        if (i >= number) {
          main.children[i].style.setProperty(
            "--bg",
            // "red"
            `hsl(${(i / this.stripNumber) * 360}, 100%, 50%)`
          );
          main.children[i].style.setProperty(
            "--sg",
            `hsl(${(i / this.stripNumber) * 360}, 100%, 50%)`
          );
        } else {
          main.children[i].style.setProperty("--bg", "rgba(0, 0, 0, 0)");
          main.children[i].style.setProperty("--sg", "transparent");
        }
      }
    }
  }
};
</script>


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

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

相关文章

「链表」Floyd判环法(弗洛伊德判圈法|龟兔赛跑法)/ LeetCode 141(C++)

给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;…

【C++】C++11的新特性 — function 包装器 , bind包装器

有些人的生活&#xff0c;可以轻轻松松&#xff0c;有些人的生活就是奥运会&#xff0c;生下来就在跑道上&#xff0c;如果不去全力奔跑&#xff0c;注定会被淘汰&#xff0c;更何况&#xff0c;即使努力奔跑&#xff0c;也未必能战胜很多人。 -- 傅首尔 -- C11的新特性 1 fun…

判断字符串是否接近:深入解析及优化【字符串、哈希表、优化过程】

本文将详细解析解决这个问题的思路&#xff0c;并逐步优化实现方案。 问题描述 给定两个字符串 word1 和 word2&#xff0c;如果通过以下操作可以将 word1 转换为 word2&#xff0c;则认为它们是接近的&#xff1a; 交换任意两个现有字符。将一个现有字符的每次出现转换为另…

SQL进阶技巧:多行转列问题中如何保证不同字段内容有序性及一一对应?【collect_list函数有序性保证问题】

目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…

android13 禁止某个app接口某个广播 禁止应用接受开机广播 禁止应用接收广播

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码更改 4.彩蛋 1.前言 我们在定制系统的过程中,有时候,有些客户的应用的一些表现,并不能满足需求。例如应用接收了开机广播,然后做了一些事情,起调了某些activity。或者接受了某个广播,做了一些操作等…

网络安全第一次作业(ubuntuan安装nginx以及php部署 and sql注入(less01-08)))

ubuntuan安装nginx以及php部署 1.安装依赖包 rootadmin123-virtual-machine:~# apt-get install gcc libpcre3 libpcre3-dev zliblg zliblg-dev openssl libssl-dev2.安装nginx 到https://nginx.org/en/download.html下载nginx 之后将压缩包通过xtfp传输到ubuntu的/usr/loc…

Android:Uniapp平台中接入即构RTC+相芯美颜

0 前言 前阵子使用Uniapp平台开发了一个跨平台app&#xff0c;并且接入了即构RTC后&#xff0c;今天想进一步丰富app的直播功能。之前有相芯美颜的开发经验&#xff0c;打算将相芯美颜接入即构RTC. **在DCloud插件市场找到了在即构RTC接入相芯美颜插件&#xff0c;https://ex…

Golang | Leetcode Golang题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; func wiggleSort(nums []int) {n : len(nums)x : (n 1) / 2target : quickSelect(nums, x-1)transAddress : func(i int) int { return (2*n - 2*i - 1) % (n | 1) }for k, i, j : 0, 0, n-1; k < j; k {tk : transAddress(k)if nums[t…

STM32之GPIO(General Purpose Input/Output,通用型输入输出)

文章目录 前言一、GPIO简介二、GPIO结构2.1 GPIO基本结构2.2 GPIO位结构2.2.1 输入部分2.2.1 输出部分 四、GPIO模式4.1 浮空/上拉/下拉输入4.2 模拟输入4.3 开漏/推挽输出4.4 复用开漏/推挽输出 前言 提示&#xff1a;本文主要用作在学习江协科大STM32入门教程后做的归纳总结…

【数据结构-前缀哈希】力扣523. 连续的子数组和

给你一个整数数组 nums 和一个整数 k &#xff0c;如果 nums 有一个 好的子数组 返回 true &#xff0c;否则返回 false&#xff1a; 一个 好的子数组 是&#xff1a; 长度 至少为 2 &#xff0c;且 子数组元素总和为 k 的倍数。 注意&#xff1a; 子数组 是数组中 连续 的部…

SpringBoot快速学习

目录 SpringBoot配置文件 多环境配置 SpringBoot整合junit SpringBoot整合mybatis 1.在创建时勾选需要的模块 2.定义实体类 3.定义dao接口 4.编写数据库配置 5.使用Druid数据源 SpringBoot 是对 Spring 开发进行简化的。 那我们先来看看SpringMVC开发中的一些必须流程…

C++ | Leetcode C++题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; class Solution { public:int partitionAroundPivot(int left, int right, int pivot, vector<int> &nums) {int pivotValue nums[pivot];int newPivot left;swap(nums[pivot], nums[right]);for (int i left; i < right; …

【Buffer Pool】定长内存池的实现

创建一个大块的内存内存 1.内存的类型是什么&#xff1f; char* 方便有多少字节就乘以多少字节 2.如何还回来内存&#xff1f;可以将换回来的小块的内存块链接起来&#xff0c;使用freeList 3.如何链接起来? 让上一个内存块的数据存下一个内存块的地址即可 4.如果内存块的…

Mybatis-plus乐观锁

为什么要用锁 原因是当两个线程并发修改同一条数据时候 例如有条数据 id 1 count(金额/数量) 500 有两个线程都在查询数据库 查出来都是 1 500 现在两个线程都要修改这条数据 在原来基础上20 和30 那么理论来讲应该是550 可是实际有可能是530 原…

点双联通分量和边双联通分量如何选择?

先讲一下 &#xff0c;双联通分量 一定是用于 无向图 考虑什么时候需要用边双联通分量呢&#xff1f;&#xff0c;考虑给你的是一个一般图&#xff0c;需要你把联通的点都缩起来&#xff0c;视作一个点的情况&#xff0c;就是说割点可以反复访问&#xff0c;就是说割点和其他点…

鸿蒙应用服务开发【华为支付服务】 服务端

介绍 华为支付云侧接口 Java SDK Sample。 官方 Java 语言开发库pay-java由 core 和 service 组成&#xff1a; core 为基础库。包含自动签名和验签的 HTTP 客户端、回调处理、加解密库。service 为业务服务。基于业务场景提供不同的业务类&#xff0c;其下的方法为对应的ht…

openai-dotnet:OpenAI官方提供的.NET SDK库!

自从ChatGPT大火以来&#xff0c;针对OpenaAI提供的API接口&#xff0c;封装的SDK库非常多。 之前也推荐过几个.Net版本&#xff0c;今天推荐下OpenAI官方提供的.NET 库&#xff01; 01 项目简介 openai-dotnet是OpenAI 官方提供的 .NET库&#xff0c;用于方便.NET应用程序中…

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…

搭建基于树莓派的Linux学习环境(TODO)

主要是想学一下Linux内核&#xff0c;所以搭一套环境&#xff0c;其实有几个选择&#xff0c;都是我买了板子的。 首先是正点原子的RK3568&#xff0c;最早是想弄安卓&#xff0c;但是SDK的大小真的把我劝退了&#xff0c;动不动几百个G的空间&#xff0c;还有就是保底16个G的…

108 将有序数组转换为二叉搜索树

解题思路&#xff1a; 平衡二叉树&#xff0c;又称自平衡二叉搜索树&#xff08;简称AVL树&#xff09;&#xff0c;其特点如下: 每个子树都为平衡二叉树高度平衡&#xff1a;任意节左子树与右子树高度差不超过1排序树&#xff1a;左子树的所有节点的值小于该节点&#xff0c;…