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

效果

鼠标移入显示悬浮框

<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>>

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

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

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

相关文章

模块二——滑动窗口:438.找到字符串中所有字母异位词

文章目录 题目描述算法原理滑动窗口哈希表 代码实现 题目描述 题目链接&#xff1a;438.找到字符串中所有字母异位词 算法原理 滑动窗口哈希表 因为字符串p的异位词的⻓度⼀定与字符串p 的⻓度相同&#xff0c;所以我们可以在字符串s 中构造⼀个⻓度为与字符串p的⻓度相同…

基础算法(2):排序(2):计数排序

1.计数排序实现 计数排序是一个非基于比较的稳定的线性时间的排序算法&#xff0c;而选择排序是基于比较的&#xff0c;计数排序不用&#xff0c;它的实现依靠计数。 工作原理&#xff1a;使用一个额外的数组&#xff0c;其中第i个位置是待排序数组1中值等于i的元素的个数&…

Ansible介绍与安装

Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件&#xff0c;能够用来管理各种资源。用户可以使用Ansible自动部署应用程序&#xff0c;以此实现IT基础架构的全面部署。例如&#xff0c;借助于Ansible&#xff0c;我们可以轻松地对服务器进行初始化配置、安全基线…

显示器件是什么

显示器件 电子元器件百科 文章目录 显示器件前言一、显示器件是什么二、显示器件的类别三、显示器件的应用实例四、显示器件的作用原理总结前言 显示器件根据不同的技术原理和应用领域,具有不同的特点和优势,可适用于电子产品、电视、计算机显示器、手持设备、汽车仪表盘等…

产品入门第四讲:Axure动态面板

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还…

Java刷题篇——合并两个有序数组

1.题目描述 给出一个有序的整数数组A 和有序的整数数组 B&#xff0c;请将数组B合并到数组A中&#xff0c;变成一个有序的升序数组。 数据范围&#xff1a;0 < n,m < 100, |A~i~| < 100, |B~i~| < 100 注意&#xff1a; 保证 A 数组有足够的空间存放 B 数组的元…

(C++)只出现一次的数字I--异或

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

AI:100-基于卷积神经网络的农作物生长状态监测

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

Axure的动态面板

目录 动态面板 什么是Auxre动态模板 动态模板的步骤 应用场景 实战案例 轮播图 多功能登录界面 主界面左侧菜单栏 动态面板 什么是Auxre动态模板 动态面板是Axure中的一个重要功能&#xff0c;它允许用户创建可交互的页面&#xff0c;并模拟用户与页面的交互。通过添加元素…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

Apache DolphinScheduler 社区荣获 “2023 年度优秀开源技术团队“ 奖项

在开源社区日益繁荣的今天&#xff0c;我们非常荣幸地宣布&#xff1a;Apache DolphinScheduler 社区在 OSCHINA 平台的评选中荣获了“2023 年度优秀开源技术团队”奖项。这一奖项反映了我们社区在过去一年里在内容发表的深度与广度、活动运营影响力以及对开源文化的推广方面所…

每日一题 --- 2477. 到达首都的最少油耗

链式前向星解法 核心点是我dfs两次&#xff0c;第一次是求出每个节点的叶子节点有多少个&#xff1f; 因为我们可以看做从当前节点出发到当前节点的根节点的话&#xff0c;那么需要知道当前节点叶子节点个数&#xff0c;也就是我们让当前节点的叶子结点&#xff08;代表&…

yolov8常用命令

1.运行预测 &#xff08;1&#xff09;运行目标检测模型&#xff1a; yolo predict modelyolov8n.pt sourcebus.jpg &#xff08;2&#xff09;运行目标检测与分割模型 yolo predict modelyolov8n-seg.pt sourcebus.jpg 2.模型训练 复制coco128.yaml更名为myDetect.y…

检测车牌的SIFT特征并匹配

# 代码5-14 检测车牌的SIFT特征并匹配 import cv2img1 cv2.imread(../data/plate.jpg) img2 cv2.imread(../data/car.jpg)sift cv2.SIFT_create() # 利用sift.detectAndCompute()函数找到特征点&#xff0c;计算描述符&#xff1b; kp1, des1 sift.detectAndCompute(img1, …

Unity Sentis首份教程来啦,利用AI模型创建先进功能

Unity 推出的 Sentis&#xff0c;赋予开发者将 AI 模型导入游戏和应用程序中的能力。现在&#xff0c;Sentis 已进入预发布的开放测试阶段&#xff0c;用户可以在所有类型的项目中实现物体识别、语音识别和智能 NPC 等复杂功能。 这些 AI 模型一旦通过 ONNX 文件标准导入&…

地图自定义省市区合并展示数据整合

需求一&#xff1a;将省级地图下的两个市合并成一个区域&#xff0c;中间的分割线隐藏。 1、访问下方地址&#xff0c;搜索并下载省级地图json文件。 地址&#xff1a;https://datav.aliyun.com/portal/school/atlas/area_selector 2、切换到边界生成器&#xff0c;上传刚刚下…

基于Java+SpringBoot+Vue3+Uniapp前后端分离考试学习一体机设计与实现企业级2.01版本(视频讲解,已发布上线)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【经验分享】gemini-pro和gemini-pro-vision使用体验

Gemini Gemini已经对开发者开放了Gemini Pro的使用权限&#xff0c;目前对大家都是免费的&#xff0c;每分钟限制60条&#xff0c;至少这比起CloseAI的每个账户5刀限速1min3条要香的多&#xff0c;目前已于第一时间进行了体验 一句话总结&#xff0c;google很大方&#xff0c;但…

web服务器之——搭建两个基于域名访问的网站

目录 要求&#xff1a; 一、准备工作&#xff1a;web服务器搭建 第一步&#xff1a;挂载 第二步&#xff1a;编辑配置文件 第三步&#xff1a;安装软件包 第四步&#xff1a;启动httpd 查看配置文件&#xff1a; 第五步&#xff1a;设置防火墙状态&#xff1a; 重启服务…

虹科技术 | IO-Link Wireless如何赋能工厂车间迈向无线自动化?

大规模定制、卓越运营和商业智能正在从根本上改变制造业&#xff0c;为了在竞争中立于不败之地&#xff0c;制造商需要更加灵活、通用、可扩展和具有成本效益的机器和生产线。随着制造商向工业 4.0 迈进&#xff0c;更好的适应性、更高的吞吐量和更短的停机时间是他们的共同要求…