< ElementUi组件库: el-progress 进度条Bug及样式调整 >

news2024/9/28 11:25:01

标题图片

ElementUi组件库: el-progress 进度条Bug及样式调整

  • 👉 前言
  • 👉 一、实现原理
    • > 修改 el-progress 进度条样式 及 渐变进度条样式
  • 👉 二、案例代码(前言效果图案例)
    • > HTML代码
    • > CSS代码
  • 👉 三、效果演示
  • 往期内容 💨


👉 前言

在 Vue + elementUi 开发中,在使用 Progress 进度条时,往往会因为需求原型太过花里胡哨而烦恼(原本的样式并不能满足需求)。

为什么呢? 因为这个组件elementUi并没有提供过多的自定义属性及插槽,对的,插槽也没有,不能自定义进度条文本样式。即使在elementUi 的文档里面写了属性,但是实际使用并未生效(怀疑是bug)。

Tips: 基于 elementUi来说,好像elementUi - Plus升级了,修复了bug,也增加了对应的属性、开放了插槽!

所以,在这个时候,我们就需要用到样式覆盖来对 Progress 进度条 进行个性化样式设置了! 首先,给小伙伴们看看,经过定义样式后,使用进度条实现的样式!

效果图

接下来,进入主题!

👉 一、实现原理

> 修改 el-progress 进度条样式 及 渐变进度条样式

我们可以通过 /deep/、>>>、v-deep 来对 elementUI 中给 el-progress 定义的原样式进行深度覆盖。

在这里插入图片描述
并且我们可以通过控制台看见,进度条是由svg标签渲染出来的,如果需要更改进度条样式,可以通过修改原先svg标签的渲染路径即可,若只需要单色,可以直接在elementUi提供的属性 或者 自行进行样式覆盖!

具体内容如下:

> HTML

<div class="progressName"> 
    <el-progress :width="60" :hidden="60" type="circle" :percentage="50"></el-progress> 
</div>
<!-- 定义修改svg --> 
<div style="width:0px; height: 0px;"> 
    <svg width="100%" height="100%"> 
        <defs> 
            <linearGradient id="write" x1="0%" y1="0%" x2="100%" y2="0%"> 
                <stop offset="0%" style="stop-color:#0299E2" stop-opacity="0.8"></stop> // offset 设置起始 stop-color 设置起始位置的颜色 
                <stop offset="100%" style="stop-color:#02E4DC" stop-opacity="1"></stop> // offset 设置起始 stop-color 设置起始位置的颜色 
            </linearGradient> 
        </defs> 
    </svg> 
</div>

> CSS

// 此处使用的是scss语法
.progressName {
	// 这里可以用
	/deep/ {
	  .el-progress {
	    margin: 0 6px;
	    position: relative;
	    // 修改进度条文字提示颜色
	    .el-progress__text {}
	  }
	  // 设置渐变进度条,通过重新定义svg标签的url
	  svg>path:nth-child(2) {
	  	// #write 此处的id就是定义的svg标签id 做替换即可 
	    stroke: url(#write); 
	  }
	  // 修改进度条背景色
	  .el-progress path:first-child {
	    // stroke: #e1e1e1; 
	  }
	  // 进度条的图形样式,控制翻转
	  .el-progress-circle {
	    transform: rotateY(180deg);
	  }
	}
}

👉 二、案例代码(前言效果图案例)

> HTML代码

<el-card
 class="item"
 v-for="(item, index) in viewOption"
 :key="index"
>
  <div slot="header" class="clearfix">
    <div class="titleBox">
      <img :src="headerIconSrc" />
      <span class="title">
        {{ item.name || '指标名称' }}
      </span>
      <el-popover
        placement="bottom-start"
        width="220"
        trigger="click">
        <strong>用途:</strong>{{ item.purpose || '暂无用途' }}
        <i class="el-icon-question" slot="reference"></i>
        <!-- <el-button slot="reference">hover 激活</el-button> -->
      </el-popover>
    </div>
    <strong>总体权重:{{ item.allWeight || 0 }}</strong>
  </div>
  <div
    class="viewInfo"
  >
    <div
      class="progressView"
      :style="{ width: progressWidth + 'px', height: progressWidth + 'px', }"
      @click="viewInfoClick(item.name)"
    >
      <el-progress
        type="circle"
        color="#8080bf"
        :width="progressWidth"
        :percentage="item.zbVal || 0"
        :stroke-width="progressWidth/10"
        :show-text="false"
      ></el-progress>
      <div class="formatText">
        <p class="label">{{ item.zbName }}</p>
        <p class="value">{{ item.zbVal || 0 }}%</p>
      </div>
    </div>
    <el-divider direction="vertical"></el-divider>
    <div class="Info">
      <div
        class="textItem"
        v-for="(item_1, index_1) in item.detailList"
        :key="index_1"
      >
        <img :src="viewIconSrc" />
        <span class="text">{{ item_1.name }}(权重:{{ item_1.value || 0 }} )</span>
      </div>
    </div>
  </div>
</el-card>

<!-- 定义svg,用于环形进度渐变 -->
<div style="width:0px; height: 0px;"> 
  <svg width="100%" height="100%"> 
    <defs> 
      <linearGradient id="write" x1="0%" y1="0%" x2="100%" y2="0%"> 
        <stop offset="0%" style="stop-color:#02E4DC" stop-opacity="0.9"></stop> // offset 设置起始 stop-color 设置起始位置的颜色 
        <stop offset="100%" style="stop-color:#0271e2" stop-opacity="0.7"></stop> // offset 设置起始 stop-color 设置起始位置的颜色 
      </linearGradient> 
    </defs> 
  </svg> 
</div>

// el-progress是不能动态调整大小的,这里通过获取可视窗口大小,配置需要的进度条大小(这里用于测量单位,包括内部文本圈圈大小)
progressWidth: window.innerWidth / 3 / 2 - 100

> CSS代码

.item {
  width: calc(100% / 3 - 12px);
  height: calc(50% - 12px);
  border-radius: 5px;
  margin: auto;
  .clearfix {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    strong {
      font-size: 13px;
      color: #4298F3;
    }
    .titleBox {
      width: auto;
      max-width: calc(100% - 85px);
      display: flex;
      align-items: center;
      img {
        width: 30px;
        height: 28px;
        margin-right: 5px;
      }
      .title {
        display: inline-block;
        width: auto;
        max-width: calc(100% - 39px);
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        font-size: 14.5px;
        font-weight: 700;
      }
      .el-icon-question {
        font-size: 15px;
        margin: 3px 0 0 5px;
        cursor: pointer;
        color: #4298F3;
      }
    }
    
    &::after, &::before {
      display: none;
      content: "";
      clear: both
    }
  }
  
  .viewInfo {
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: space-around;
    .progressView {
      cursor: pointer;
      position: relative;
      .formatText {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(calc(-50% + 6px), -50%);
        width: calc(64%);
        height: calc(64%);
        display: flex;
        align-items: center;
        justify-content: center;
        align-content: center;
        flex-wrap: wrap;
        text-align: center;
        font-weight: bold;
        border-radius: 50%;
        -webkit-box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.18);
        box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.18);
        .label {
          width: 100%;
          font-size: clamp(12px, 1.1vw, 18px);
          font-weight: bold;
          margin-bottom: 10px;
        }
        .value {
          width: 100%;
          font-size: clamp(14px, 1.8vw, 24px);
          font-weight: bold;
          color: #083BB5 ;
        }
      }
    }
    .Info {
      width: 50%;
      .textItem {
        width: 100%;
        margin-bottom: 15px;
        display: flex;
        align-items: center;
        img {
          width: 30px;
          height: 28px;
          margin-right: 5px;
        }
        .text {
          width: calc(100% - 35px);
          font-size: 13px;
          color: #666;
          font-weight: 600;
        }
      }
    }
    /deep/ {
      .el-divider--vertical {
        width: 1px;
        height: calc(100% - 40px);
        background-color: #ddd;
        box-shadow: -4.5px 0 12px 3px rgba(0,0,0, .1);
      }
      .el-progress {
        margin: 0 6px;
        position: relative;
        // 修改进度条文字提示颜色
        .el-progress__text {}
      }
      svg>path:nth-child(2) { 
        stroke: url(#write); // #write 此处的id就是定义的svg标签id 做替换即可 
      }
      .el-progress path:first-child { // 修改进度条背景色
        // stroke: #e1e1e1; 
      }
      .el-progress-circle {
        transform: rotateY(180deg);
      }
    }
  }
  /deep/ {
    .el-card__header {
      width: 100%;
      padding: 10px;
    }
    .el-card__body {
      padding: 10px;
      height: calc(100% - 64.8px);
    }
  }
}

案例较为粗浅,仅供参考!

👉 三、效果演示

效果图


往期内容 💨

🔥 < elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >

🔥 < element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >

🔥 < 每日闲谈:你真的了解 “ ChatGPT ” 嘛 ? >

🔥 < 每日算法 - JavaScript解析:搜索旋转排序数组 >

🔥 < CSS小技巧:类似photoShop的混合模式(mix-blend-mode / background-blend-mode)使用 >

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

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

相关文章

详细解读Diffuser DreamBooth代码

Diffusion Models专栏文章汇总:入门与实战 前言:之前的博客《如何定制属于自己的stable diffusion?Dreambooth原理详解和代码实战》详细解读了dreambooth,不过那篇博客的代码讲解部分主要基于mmagic,不过瘾。这篇博客讲解一下diffuser的drembooth的部分。 目录 参数详解…

C#,码海拾贝(24)——求解“复系数方程组”的“全选主元高斯-约当消去法”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> …

Ansible从入门到精通【一】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 专栏名称&#xff1a;Ansible从入门到精通 立志成为ansible大佬 Ansible初识 ansible基于Python开发&#…

关闭linux kernel内核的启动log在控制台的输出

要关闭Linux内核的启动日志&#xff0c;你可以通过以下方法之一进行操作&#xff1a; 1. 通过引导加载器配置&#xff1a; 打开引导加载器的配置文件&#xff0c;如GRUB的配置文件 /boot/grub/grub.cfg。 在内核的启动行&#xff08;以 “linux” 或 “kernel” 开头&#xf…

MyBatisPlus快速入门(二)MyBatisPlus快速入门体验

一、初始化数据库&#xff08;基于 HeidiSQL&#xff09;1.1 创建数据库1.2创建数据表1.3 初始化数据 二、初始化项目&#xff08;基于Spring Boot&#xff09;2.1 创建项目2.2 新增依赖2.3 数据库配置2.4 配置 MyBatis Plus2.5 创建实体类2.6 创建Mapper层接口2.7 创建Server层…

怎么用迅捷PDF转换器在线修改图片大小

大家在生活和工作中会遇到图片的大小尺寸不合适的情况&#xff0c;尤其是一些公用的照片&#xff0c;都会有固定的尺寸要求。或者是一些同学想要考研考公考编之类的&#xff0c;也需要严格按照规定来修改图片。那么怎么才能快速修改图片大小呢&#xff1f; 推荐大家使用迅捷PD…

OpenVINO 2022.3实战四:POT API 实现 YOLOv5 模型 INT8 量化

OpenVINO 2022.3实战四&#xff1a;POT API 实现 YOLOv5 模型 INT8 量化 将预训练的 YOLOv5m Pytorch 模型转换为 OpenVINO™ FP32 Intermediate Representation (IR) 模型。下一步&#xff0c;通过 OpenVINO™ Post-Training Optimization Tool (POT) API 来定义客制化DataLo…

Linux之文件权限类命令

文件权限类命令 文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全线&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定&#xff0c;在…

白嫖免费版gpt与wetab插件的使用

目录 网址 如何使用 wetab 介绍wetab 怎么获得这个插件 使用效果 网址 1. wetab网站 : chatgpt (免费&#xff0c;不需要账号&#xff0c;不需要翻墙) 2. gpt镜像网站&#xff1a;https://chatbot.theb.ai/#/chat/1002 &#xff08;免费&#xff0c;不需要账号&#xff0…

learn C++ NO.6——类和对象(4)

1.再谈构造函数 1.1.构造函数体赋值 在创建类的对象时&#xff0c;编译器回去调用类的构造函数&#xff0c;来各个成员变量一个合适的值。 class Date { public:Date(int year,int month,int day){_year year;_month month;_day day;}private:int _year;int _month;int _…

Neepu2023-部分Reserve复现

目录 Base IKUN检查器 dnSpy junk code Cheat Engine工具使用&#xff1a; 奇怪的ELF mov混淆问题&#xff1a; Xor Base 打开附件&#xff0c;可以看到主函数 先是给出一个物理题&#xff0c;要求输入答案&#xff0c;这个无关紧要&#xff0c;接着要求输入一串字符&…

MyBatis-Plus 可视化代码生成器来啦,生产力直接拉满

在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码还有一…

被Chatgpt碾压的打工人与大学生,准备反击!

最近一段时间&#xff0c;chatgpt可谓如火如荼&#xff0c;它的出现引发各行各业的震动&#xff0c;有人利用它实现了一夜暴富&#xff0c;有企业将它纳进人才招聘的技能要求中&#xff0c;国内各大厂商也纷纷下场推出自家的AI大模型&#xff0c;从第一代到GPT-4&#xff0c;所…

基于html+css的图片展示92

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

用好 kafka,你不得不知的那些工具

前言 工欲善其事&#xff0c;必先利其器。本文主要分享一下消息中间件 kafka 安装部署的过程&#xff0c;以及我平时在工作中针对 kafka 用的一些客户端工具和监控工具。 kafka 部署架构 一个 kafka 集群由多个kafka broker组成&#xff0c;每个broker将自己的元数据信息注册…

【ROS2】install micro_ros

本文参考b站up&#xff1a;“照祥同学”的教程来的&#xff0c;中间一些细节的操作谨以此文作为补充&#xff0c;或者说是我在按照教程走的时候遇到的问题记录。视频链接&#xff1a;第二节&#xff1a;安装micro_ros 的 Arduino 开发环境_哔哩哔哩_bilibili 1. 安装和配置ros…

集权安全 | 域渗透中的 DCSync技术分析

DCSync是AD域渗透中常用的凭据窃取手段&#xff0c;默认情况下&#xff0c;域内不同DC每隔15分钟会进行一次数据同步&#xff0c;当一个DC从另外一个DC同步数据时&#xff0c;发起请求的一方会通过目录复制协议&#xff08;MS- DRSR&#xff09;来对另外一台域控中的域用户密码…

一分钟图情论文:《面向学科建设的我国文献资源保障评价研究综述》

一分钟图情论文&#xff1a;《面向学科建设的我国文献资源保障评价研究综述》 高质量的文献资源保障工作不仅能够提供完备的环境、满足用户的信息需求&#xff0c;在高校中&#xff0c;还可以发挥促进教学资源优化和科研成果产出、增强科技基础能力等作用。华中师范大学的夏立…

『树莓派云台机器人』01. 使用手机控制树莓派云台机器人

目录 1. 检查是否已经开机&#xff0c;连接机器人wifi2. 安装树莓派控制app应用&#xff0c;直连模式连接机器人3. 机器人功能实现总结 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 欢迎关注 『树莓派云台机器人』 博客&#xff0c;持续更新中 动手组装等步骤请…

halcon 安装21.05版本 小坑记录

&#xff08;注意&#xff1a;都可以设置语言&#xff09; 1.选择扩展安装 影响安装进度显示 可以后续单独安装 Visual Studio变量检查扩展 2.破解相关 主程序dll路径 路径: C:\Users******\AppData\Local\Programs\MVTec\HALCON-21.05-Progress\bin\x64-win64 Visual St…