扇形旋转切换效果(等级切换转盘)

news2024/12/1 0:39:50

实现动态扇形旋转切换效果,切换进度支持渐变效果

效果展示

在这里插入图片描述

在线示例 https://code.juejin.cn/pen/7425559403589271588

源码实现

<!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>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    .position-center {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
      bottom: 0;
    }

    .container {
      --height: 20vh;
      --progress: 0;

      width: 100%;
      height: var(--height);
      position: relative;
      overflow: hidden;

      .inner {
        width: 200%;
        height: calc(var(--height) * 2);
        background-color: #2f2f2f;
        border-radius: 50%;
        overflow: hidden;

        .circle {
          width: calc(var(--height) * 6.5);
          height: calc(var(--height) * 6.5);
          border-radius: 50%;
        }

        .circle-bottom {
          bottom: 12%;
          overflow: hidden;
          padding: 25% 15% 0 15%;
          background-color: #535353;

          .circle-mask {
            width: calc(var(--progress) * 1%);
            height: 100%;
            background-image: linear-gradient(to right, rgba(31, 231, 236, .3), rgba(31, 231, 236, .7));
            transition: all .3s ease-in-out;
          }
        }

        .circle-top {
          background-color: #2f2f2f;
          bottom: 13%;
          padding: 27% 15% 0 15%;

          color: #fff;
          display: flex;
          justify-content: space-around;
          align-items: flex-end;
        }

        .circle-main {
          width: calc(var(--height) * 6.5);
          height: calc(var(--height) * 6.5);
          border-radius: 50%;
          transition: all .3s ease-in-out;
          transform: translateX(-50%) rotate(0deg);

          .item {
            --rotate: 0;
            position: absolute;
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: flex-end;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%) rotate(calc(var(--rotate) * -1deg));

            .item-inner {
              display: flex;
              flex-direction: column;
              align-items: center;
              position: relative;
              bottom: -30px;
              font-size: 14px;
              color: #ccc;

              .point {
                width: 7px;
                height: 7px;
                background-color: #fff;
                border-radius: 50%;
                margin-top: 4px;
                box-shadow: 0 0 10px rgba(255, 255, 255, 0.8);


                &::before {
                  content: '';
                  width: 12px;
                  height: 12px;
                  border-radius: 50%;
                  position: absolute;
                  top: 50%;
                  left: 50%;
                  transform: translate(-50%, -50%);
                }
              }

              .label-bottom {
                margin-top: 5px;
              }
            }

            .active {
              .point {
                background-color: rgba(31, 231, 236, 1);

                &::before {
                  background-color: rgba(31, 231, 236, 0.3);
                }
              }
            }
          }
        }
      }
    }

    .btns {
      position: absolute;
      bottom: 500px;
      left: 50%;
      transform: translateX(-50%);
      button {
        color: #1fe7ec;
        border: 1px solid #1fe7ec;
        background-color: transparent;
        padding: 4px 15px;
        border-radius: 4px;
        font-size: 14px;
      }
    }
  </style>
</head>

<body>
  <div id="container" class="container" style="--progress: 33.33">
    <div class="inner position-center">
      <div class="circle circle-bottom position-center">
        <div class="circle-mask"></div>
      </div>
      <div class="circle circle-top position-center">
        <div id="circle" class="circle-main position-center">
          <div class="item" style="--rotate: -15;">
            <div class="item-inner active">
              <div class="label-top">10-15w</div>
              <div class="point"></div>
              <div class="label-bottom">旅行家 V1</div>
            </div>
          </div>
          <div class="item" style="--rotate: 0;">
            <div class="item-inner">
              <div class="label-top">15-20w</div>
              <div class="point"></div>
              <div class="label-bottom">旅行家 V2</div>
            </div>
          </div>
          <div class="item" style="--rotate: 15;">
            <div class="item-inner">
              <div class="label-top">20w+</div>
              <div class="point"></div>
              <div class="label-bottom">旅行家 V3</div>
            </div>
          </div>
          <div class="item" style="--rotate: 30;">
            <div class="item-inner">
              <div class="label-top">30w+</div>
              <div class="point"></div>
              <div class="label-bottom">旅行家 V4</div>
            </div>
          </div>
          <div class="item" style="--rotate: 45;">
            <div class="item-inner">
              <div class="label-top">50w+</div>
              <div class="point"></div>
              <div class="label-bottom">旅行家 V5</div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>

  <div class="btns">
    <button onclick="prev()">上一个</button>
    <button onclick="next()">下一个</button>
  </div>

  <script>
    const container = document.getElementById('container')
    const circle = document.getElementById('circle')
    const max = circle.children.length

    let currentIndex = 0

    const acitve = () => {
      const items = circle.querySelectorAll('.item')
      items.forEach((item, index) => {
        const itemInner = item.querySelector('.item-inner')
        if (index === currentIndex) {
          itemInner.classList.add('active')
        } else {
          itemInner.classList.remove('active')
        }
      })
    }
    const next = () => {
      if (currentIndex < max - 1) {
        currentIndex += 1
      }

      if (currentIndex < max - 1) {
        container.style.setProperty('--progress', 50)
        circle.style.transform = `translateX(-50%) rotate(${15 * (currentIndex - 1)}deg)`
      } else {
        container.style.setProperty('--progress', 100)
      }

      acitve()
    }

    const prev = () => {
      if (currentIndex > 0) {
        currentIndex -= 1
      }

      if (currentIndex > 0) {
        container.style.setProperty('--progress', 50)
        circle.style.transform = `translateX(-50%) rotate(${15 * (currentIndex - 1)}deg)`
      } else {
        container.style.setProperty('--progress', 33.33)
      }

      acitve()
    }
  </script>
</body>

</html>

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

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

相关文章

华宇携司法大模型亮相2024中国移动全球合作伙伴大会

2024中国移动全球合作伙伴大会于10月11日在广州琶洲保利世贸博览馆盛大开幕。本届大会以“智焕新生 共创AI时代”为主题&#xff0c;深入探讨数据、算力与人工智能如何深度融合&#xff0c;全力推进AI规模发展、规模应用&#xff0c;加快形成AI技术能力、经济效益上的规模效应&…

【NestJS入门到精通】装饰器

目录 方法装饰器通过prototype添加属性、方法 属性装饰器拓展 方法装饰器参数装饰器 方法装饰器 ClassDecorator 定义了一个类装饰器 a&#xff0c;并将其应用于类 A。装饰器 a 会在类 A 被定义时执行。 const a:ClassDecorator (target:any)>{console.log(target,targe…

Python Django 数据库优化与性能调优

Python Django 数据库优化与性能调优 Django 是一个非常流行的 Python Web 框架&#xff0c;它的 ORM&#xff08;对象关系映射&#xff09;允许开发者以简单且直观的方式操作数据库。然而&#xff0c;随着数据量的增长&#xff0c;数据库操作的效率可能会成为瓶颈&#xff0c…

【SQL Server】数据库在新建查询后闪退——解决方案:以管理员的身份运行

我的SQLServer2022之前都是可以用的&#xff0c;隔了好久没有使用&#xff0c;今天要用到去写一些SQL 语句 结果在点击新建查询后闪退了&#xff0c; 经过查询后&#xff0c;解决方案&#xff1a; 以管理员的身份运行后点击新建查询&#xff0c;发现正常了 总结&#xff1a;以…

PyQt 入门教程(2)搭建开发环境

文章目录 一、搭建开发环境1、安装PyQt6与pyqt6-tools2、配置外部工具QtDesigner与PYUIC 一、搭建开发环境 1、安装PyQt6与pyqt6-tools PyQt6&#xff1a; PyQt的开发库。pyqt6-tools&#xff1a; QtDesigner 设计器支撑库。 通过PyCharm安装开发库&#xff0c;命令如下&…

探索全流量回溯分析系统:IT运维的必备利器

目录 一、什么是全流量回溯分析系统&#xff1f; 二、全流量回溯分析系统的核心功能 三、IT运维中的实际应用案例 四、IT运维中使用全流量回溯分析系统的技巧 结语 AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的IT运维中&#xff0c;网络故…

【Python爬虫实战】正则:多字符匹配、开头与结尾定位、分组技术详解

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配多个字符 &#xff08;一&#xff09;匹配任意多个字符 &#xff0…

OpenAI Canvas:提升编程与写作效率的全新工作界面

随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;不仅限于生成文本&#xff0c;还能逐步扩展至编程、设计等任务的支持。近期&#xff0c;OpenAI 推出了一个名为 Canvas 的全新功能&#xff0c;专门用于协助用户进行编程和写作。这一功能与 Claud…

请求参数中字符串的+变成了空格

前端请求 后端接收到的结果 在URL中&#xff0c;某些字符&#xff08;包括空格、、&、? 等&#xff09;需要被编码。具体而言&#xff0c;在URL中&#xff0c;空格通常被编码为 或 %20。因此&#xff0c;如果你在请求参数中使用 &#xff0c;它会被解释为一个空格。 如果…

C++ | Leetcode C++题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; class Solution { public:bool makesquare(vector<int>& matchsticks) {int totalLen accumulate(matchsticks.begin(), matchsticks.end(), 0);if (totalLen % 4 ! 0) {return false;}int len totalLen / 4, n matchsticks.s…

lstm和informer和gru模型对比

1 介绍 本文使用数据集&#xff0c;对三个模型进行了对比&#xff0c;代码使用python完成&#xff0c;通过对比&#xff0c;发现lstm>gru>informer. 2 数据读取 使用降水量数据集&#xff0c;第一列表示降水&#xff0c;第二列表示出水量。 输入是两个特征输出是一个…

百度视觉搜索架构演进实践

本文深入探讨百度视觉搜索在快速发展的业务及技术背景下&#xff0c;如何通过持续的技术创新和架构升级强化自身的竞争力和适应性&#xff0c;支撑业务健康高效迭代。本文介绍了我们如何通过技术栈升级、架构能力提升以及稳定性建设&#xff0c;来实现全链路架构的演进。借助Go…

MySQL 9从入门到性能优化-二进制日志

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

matlab输入汉字时,输入法在左上角显示解决办法

解决方法&#xff1a; 输入汉字时输入法在左上角显示&#xff08;如图1&#xff09;&#xff0c;将鼠标放在竖着的小点处拖动到工作区合适位置&#xff08;如图2&#xff09;&#xff0c;下次输入汉字时输入法便在图2处显示。 图1 图2

前端小技巧-网页点击动画效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>点击触发动画效果</title><link rel"stylesheet" href"styles.css" /></head><style>/* styles.css */…

【C++ 贪心 滑动窗口 前后缀分解】948. 令牌放置|1762

本文涉及的基础知识点 贪心 决策包容性 C算法&#xff1a;滑动窗口及双指针总结 反向双指针 C前后缀分解 LeetCode948. 令牌放置 你的初始 能量 为 power&#xff0c;初始 分数 为 0&#xff0c;只有一包令牌以整数数组 tokens 给出。其中 tokens[i] 是第 i 个令牌的值&…

C语言 | Leetcode C语言题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; bool makesquare(int* matchsticks, int matchsticksSize) {int totalLen 0;for (int i 0; i < matchsticksSize; i) {totalLen matchsticks[i];}if (totalLen % 4 ! 0) {return false;}int len totalLen / 4, n matchsticksSize;i…

【实战经验】互联网信息服务域名注册和备案-指导指南 v2

一、业务场景 个人/企业/组织&#xff08;ICP&#xff09;在提供互联网信息服务&#xff08;例&#xff1a;开通网站、小程序&#xff09;之前&#xff0c;应当向为其接入互联网服务的互联网服务提供商&#xff08;ISP&#xff09;&#xff08;腾讯、阿里云&#xff09;提交相关…

【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)

前言 &#x1f31f;&#x1f31f;本期讲解关于CAS的补充和JUC中有用的类&#xff0c;这里涉及到高频面试题哦~~~ &#x1f308;上期博客在这里&#xff1a;【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&…

初识算法 · 滑动窗口(3)

目录 前言&#xff1a; 水果成篮 题目解析 算法原理 算法编写 找到字符串中所有字符异位词 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是滑动窗口&#xff0c;通过两道题目讲解&#xff0c;一道是水果成篮&#xff0c;一道是找到字符串中的所有字母异…