手写进度条,鼠标移入显示悬浮框

news2024/9/25 11:18:06

效果

鼠标移入显示悬浮框

<template>
  <div class="box">
    <div class="mid-box">
      <div class="mid-contant">
        <!-- 提示框 -->
        <div
          v-if="hover"
          class="tooltip"
          :style="{
            top: hovertop,
          }"
        >
          <div>{{ hoverArea }}</div>
          <div>销量:{{ hoverSalse }}</div>
          <div>目标量:{{ hoverTarget }}</div>
        </div>
        <!-- 单个数据项--鼠标移入传索引,显示当前的提示框并添加移入的背景,鼠标移除隐藏提示框并取消移入背景(currentHoverIndex = -1)-->
        <div
          class="progress-box"
          v-for="(item, index) in progressData"
          :key="index"
          @mouseover="hoverFn(index)"
          @mouseleave="(hover = false), (currentHoverIndex = -1)"
        >
          <div class="left-text">
            {{ item.area }}
          </div>

          <div class="middle-bar">
            <div class="progress-bar">
              <!-- 预警线,低于预警线爆红 -->
              <div
                class="warn-line"
                :style="{ left: item.warnLine * 100 + '%' }"
              ></div>
              <!-- 达成bar -->
              <div
                class="progress"
                :style="{
                  width: item.realValue > 1 ? '100%' : item.value,
                  background:
                    item.realValue < item.warnLine ? '#ff4938' : '#02cdcb',
                }"
              ></div>
            </div>
          </div>
          <div class="right-data">{{ item.value }}</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      //模拟数据
      progressData: [
        {
          area: "东部大区",
          realValue: 0.223,
          value: "22%",
          warnLine: 0.5, //预警线(达标线)
          salse: 3999,
          target: 17933,
        },
        {
          area: "北部大区",
          realValue: 0.341,
          value: "34%",
          warnLine: 0.8,
          salse: 1820,
          target: 5337,
        },
        {
          area: "南部大区",
          realValue: 0.83,
          value: "83%",
          warnLine: 0.5,
          salse: 12320,
          target: 14843,
        },
        {
          area: "中部大区",
          realValue: 0.83,
          value: "83%",
          warnLine: 0.5,
          salse: 4520,
          target: 5446,
        },
        {
          area: "西部大区",
          realValue: 1.23,
          value: "123%",
          warnLine: 0.8,
          salse: 2520,
          target: 2048,
        },
        {
          area: "全部大区数据",
          realValue: 0.53,
          value: "53%",
          warnLine: 0.5,
          salse: 1820,
          target: 3434,
        },
      ],
      //默认没有鼠标移入状态
      currentHoverIndex: -1,
      // 是否显示提示框
      hover: false,
      hoverArea: "",
      hoverSalse: 0,
      hoverTarget: 0,
    };
  },
  methods: {
    // 鼠标移入效果
    hoverFn(index) {
      this.hover= true
      this.currentHoverIndex = index;
      this.hoverArea = this.progressData[index].area;
      this.hoverSalse = this.progressData[index].salse;
      this.hoverTarget = this.progressData[index].target;
    },
  },
  computed:{
    // 提示框显示的位置:最后两条显示在当前数据项上方,其他显示在下方
    hovertop(){
      return this.progressData.length<3|| this.currentHoverIndex<this.progressData.length-2 ? (46*this.currentHoverIndex+46) +'px':(46*(this.currentHoverIndex-1)) +'px'
    }
  }
};
</script>

<style lang="less" scoped>
.box {
  position: relative;
  width: 100vw;
  height: 100vh;
  top: 0;
  left: 0;
  background-color: #0d1f50;
  color: rgba(255, 255, 255, 0.8);
  font-size: 8px;
}
.mid-box {
  width: 200px;
  height: 50vh;
  overflow: hidden;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  border: 1px solid #605f5f;
  background-color: #161c4e;
  .mid-contant {
    overflow-y: scroll;
    height: 100%;
  }
}
.progress-box {
  padding: 5px 8px;
  border: 1px solid #000;
  display: flex;
  justify-content: space-between;
  align-items: center;
 box-sizing: border-box;
  .left-text {
    width: 20%;
    // 文字两行显示,溢出使用省略号
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
     
  }
  .middle-bar {
    width: 60%;
    height: 36px;

    .progress-bar {
      display: flex;
      align-items: center;
      position: relative;
      top: 0;
      left: 0;
      height: 100%;
      width: 100%;
      .warn-line {
        border-left: 1px solid #fff;
        height: 20px;
        position: absolute;
        top: calc(50% - 10px);
      }
      .progress {
        height: 16px;
      }
    }
  }
  .right-data {
    width: 20%;
  }
}
/* 滚动槽 */
::-webkit-scrollbar {
  width: 5px;
}
// 滚动条滑块
::-webkit-scrollbar-thumb {
  width: 5px;
  border-radius: 3px;
  background-color: #72afeb;
}
// 提示框
.tooltip {
  position: absolute;
  left:40%;
  border: 1px solid #1963da;
  background-color: #2c2c9e;
  color: rgba(255, 255, 255, 0.8);
  z-index: 99999;
}
</style>>

重点:通过数据控制元素的样式,比如宽高,背景等

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

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

相关文章

c语言堆排序(详解)

堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;它的基本概念包括&#xff1a; 建立堆&#xff1a;将待排序的列表构建成一个二叉堆&#xff0c;即满足堆的性质的完全二叉树&#xff0c;可以是最大堆或最小堆。最大堆要求父节点的值大于等于其子节点的值&#x…

Linux(21):软件安装 RPM,SRPM 与 YUM

软件管理员简介 以原始码的方式来安装软件&#xff0c;是利用厂商释出的Tarball来进行软件的安装。 不过&#xff0c;你每次安装软件都需要侦测操作系统与环境、设定编译参数、实际的编译、最后还要依据个人喜好的方式来安装软件到定位。这过程是真的很麻烦的。 如果厂商先在他…

FastAPI之表单数据

FastAPI 表单数据处理教程 FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;它用 Python 3.6类型提示的特性旨在方便和快速地设计和构建 APIs&#xff0c;并且减少代码的冗余与错误。下面将介绍如何在 FastAPI 中处理…

工业级路由器在风力发电场的远程监控技术

工业级路由器在风力发电场的远程监控技术方面具有重要的应用意义。风力发电场通常由分布在广阔地区的风力发电机组组成&#xff0c;需要进行实时监测、数据采集和远程管理。工业级路由器作为网络通信设备&#xff0c;能够提供稳定可靠的网络连接和多种远程管理功能&#xff0c;…

鸿蒙OS应用开发之登录界面

在前面学习了输入文本组件和按钮组件,可以使用这两种组件来实现一些常用的功能,比如登录界面,这种界面是每个程序员经常会到遇到的,比如让用户输入用户名称和密码。 在这里我们就来实现如下面的界面: 在上面界面里,第一个文本框用来输入用户名称,第二个用来输入用户密码…

python列表的循环遍历

数据容器&#xff1a;一个可以存储多个元素的Python数据类型 有哪些数据容器&#xff1a;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;str&#xff08;字符串&#xff09;&#xff0c;set&#xff08;集合&#xff09;&#x…

【STM32】ADC模数转换器

1 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 STM32是数字电路&#xff0c;只有高低电平&#xff0c;没有几V电压的概念&#xff…

21. python __init__.py 文件的行为

重复打印行为分析 说明结论主模块主模块所在位置不会被python认为是包 说明 我在调试代码的时候&#xff0c;发现上面的print打印了两次&#xff0c;如果将图片中的 from aaa.F import Cat 改成 from F import Cat 则print只会打印一次。这是为什么呢&#xff1f; 结论 from …

华为海思、燧原、海光等齐力打破封锁,谁主AI芯片江山| 百能云芯

近期&#xff0c;美国对英伟达出口进行了限制&#xff0c;导致英伟达无法向中国大陆销售AI芯片&#xff0c;这一局势催生了中国本土IC设计企业的崛起&#xff0c;包括华为旗下的海思科技、腾讯旗下的燧原科技&#xff0c;以及海光信息和新创公司天数智芯等纷纷抢占市场。 据百能…

微信公众服务号升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

深度探索Linux操作系统 —— Linux图形原理探讨

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 深度探索Linux操作系统 —— 构建initramfs 深度探索Linux操作系统 —— 从内核空间到用户空间 深度探索Linux操作系统 —— 构建根文件系统…

基于SpringBoot+Thymeleaf+Mybatis学生信息管理系统(源码+数据库)

一、项目简介 本项目是一套基于SpringBootThymeleafMybatis学生信息管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试…

字符雨canvas

整体思路&#xff1a; 确定好字符雨的具体字符是什么&#xff0c;需要多少行多少列这里是写死的其实也可以用循环加随机的方式生成不一样的字符雨&#xff0c;行列也可以读一下宽度然后做一下出发算一下也行首先得有一张画布搞起&#xff0c;然后循环列数去绘画字符定时器循环…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力&#xff0c;整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面&#xff0c;方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

步进电机驱动芯片TB6600HG部分翻译

有些参数没看懂。一边设计&#xff0c;一边修正。 目录 1.芯片梗概 2.引脚配置 1)引脚含义 2)内部逻辑 3.功能详解 1&#xff09;励磁模式设置 2&#xff09;功能设置 3&#xff09;初始模式 4&#xff09;100% 电流设置(电流值) 5&#xff09;OSC 6&#xff09;衰减…

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

【背景】 最近在研究远程画面,所以就实践了一下。技术采用我认为比较合适的WebRTC。 这篇文章的基础是我的另一篇博文,如果希望顺利完成本篇操作,请先关注我后查询我的如下博文: 【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面 上一篇地址: 【WebRTC】【Uni…

【PWN】学习笔记(三)【返回导向编程】(中)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

一文了解java中volatile关键字

认识volatile volatile关键字的作用有两个&#xff1a;变量修改对其他线程立即可见、禁止指令重排。 第二个作用我们后面再讲&#xff0c;先主要讲一下第一个作用。通俗点来说&#xff0c;就是我在一个线程对一个变量进行了修改&#xff0c;那么其他线程马上就可以知道我修改…