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

标题图片

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)使用 >

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

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

相关文章

C++学习day--12 循环的应用,暴力破解密码和输出动图

第 1 节 职场修炼&#xff1a;程序员到底能干多久 现状&#xff1a; 很多程序员&#xff0c;过了 30 岁&#xff0c;纷纷转行。 原因&#xff1a; 1 &#xff09;薪资过万后&#xff0c;很难进一步提升 2 &#xff09;可替代性高&#xff0c;在新人面前&#xff0c;没有…

SolVES模型在生态系统服务社会价值评估中的运用

SolVES模型&#xff08;Social Values for Ecosystem Services&#xff09;全称为生态系统服务社会价值模型&#xff0c;是由美国地质勘探局和美国科罗拉多州立大学联合开发的一款地理信息系统应用程序&#xff0c;开发该模型的目的主要是对生态系统服务功能中的社会价值进行空…

全面了解Java连接MySQL的基础知识,快速实现数据交互

全面了解Java连接MySQL的基础知识&#xff0c;快速实现数据交互 1. 数据库的重要性2. MySQL数据库简介2.1 MySQL数据库的基本概念2.2 MySQL的基本组成部分包括服务器、客户端和存储引擎。2.3 安装MySQL数据库2.3.1安装MySQL数据库2.3.2 下载MySQL安装程序2.3.3 运行MySQL安装程…

帽子设计作品——蒸汽朋克的乌托邦,机械配件的幻想世界!

蒸汽朋克是由蒸汽steam和朋克punk两个词组成&#xff0c; 蒸汽代表着以蒸汽机作为动力的大型机械&#xff0c;而朋克则代表一种反抗、叛逆的精神。 蒸汽朋克的作品通常以蒸汽时代为背景&#xff0c;通过如新能源、新机械、新材料、新交通工具等新技术&#xff0c;使画面充满想…

理解深度可分离卷积

1、常规卷积 常规卷积中&#xff0c;连接的上一层一般具有多个通道&#xff08;这里假设为n个通道&#xff09;&#xff0c;因此在做卷积时&#xff0c;一个滤波器&#xff08;filter&#xff09;必须具有n个卷积核&#xff08;kernel&#xff09;来与之对应。一个滤波器完成一…

PMP课堂模拟题目及解析(第13期)

121. 项目经理、团队成员以及若干干系人共同参与一次风险研讨会。已经根据风险管理计划生成并提供一份风险报告。若要为各个项目风险进行优先级排序&#xff0c;现在必须执行哪一项分析&#xff1f; A. 定量风险分析 B. 根本原因分析 C. 偏差分析 D. 定性风险分析 122. …

带你手撕链式二叉树—【C语言】

前言&#xff1a; 普通二叉树的增删查改没有意义&#xff1f;那我们为什么要先学习普通二叉树呢&#xff1f; 给出以下两点理由&#xff1a; 1.为后面学习更加复杂的二叉树打基础。&#xff08;搜索二叉树、ALV树、红黑树、B树系列—多叉平衡搜索树&#xff09; 2.有很多二叉树…

Linux安装MongoDB数据库并内网穿透在外远程访问

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 转发自CSDN cpolarlisa的文章&#xff1a;Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透…

亚马逊开放个人卖家验证入口?亚马逊卖家验证到底怎么搞?

亚马逊卖家账户的安全对于所有卖家来说都非常重要。如果卖家想要在亚马逊上长期稳定地发展&#xff0c;赚取更多的钱并推出更多热卖产品&#xff0c;就必须确保他们的亚马逊卖家账户安全&#xff0c;特别是一直存在的亚马逊账户验证问题。 近期&#xff0c;根据亚马逊官方披露的…

开发敏捷高效 | 云原生应用开发与运维新范式

5 月 18 日&#xff0c;腾讯云举办了 Techo Day 腾讯技术开放日&#xff0c;以「开箱吧&#xff01;腾讯云」为栏目&#xff0c;对外发布和升级了腾讯自研的一系列云原生产品和工具。其中&#xff0c;腾讯云开发者产品中心总经理刘毅围绕“开发敏捷高效”这一话题&#xff0c;分…

单体项目偶遇并发漏洞!短短一夜时间竟让老板蒸发197.83元

事先声明&#xff1a;以下故事基于真实事件而改编&#xff0c;如有雷同&#xff0c;纯属巧合~ 眼下这位正襟危坐的男子&#xff0c;名为小竹&#xff0c;他正是本次事件的主人公&#xff0c;也即将成为熊猫集团的被告&#xff0c;嗯&#xff1f;这究竟怎么一回事&#xff1f;欲…

手写简单的RPC框架(一)

一、RPC简介 1、什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用协议&#xff0c;一种通过网络从远程计算机上请求服务&#xff0c;而不需要了解底层网络技术的协议。RPC它假定某些协议的存在&#xff0c;例如TPC/UDP等&#xff0c;为通信程序之间携…

PMP考试应该要如何备考?如何短期通过PMP?

我从新考纲考完下来&#xff0c;3A通过了考试&#xff0c;最开始也被折磨过一段时间&#xff0c;但是后面还是找到了方法&#xff0c;也算有点经验&#xff0c;给大家分享一下吧。 程序猿应该是考PMP里面人最多的&#xff0c;毕竟有一个30大坎&#xff0c;大部分人还是考虑转型…

什么是网络编程

目录 一、什么是网络编程&#xff1f; 二、协议 1.用户数据报协议(User Datagram Protocol) 2.TCP协议 TCP三次握手过程 三、实例 1.UDP通信程序 实现步骤 TCP接收数据 四、TCP协议和UDP协议的区别和联系 一、什么是网络编程&#xff1f; 1.在网络通信协议下&#xf…

一图看懂!RK3568与RK3399怎么选?

▎简介 RK3568和RK3399都是Rockchip公司的处理器&#xff0c;具有不同的特点和适用场景。以下是它们的主要区别和应用场景。 ▎RK3568 RK3568是新一代的高性能处理器&#xff0c;采用了22nm工艺&#xff0c;具有更高的性能和更低的功耗。它支持4K视频解码和编码&#xff0c;支持…

电脑如何查找重复文件?轻松揪出它!

电脑如何查找重复文件&#xff1f;小编每天要接触各种文档、图片等资料&#xff0c;很多时候下载了一些图片后&#xff0c;我根本记不住&#xff0c;下次看到不错的图片&#xff0c;我又会下载下来&#xff0c;结果就是和之前下载的图片是一样的内容。下载的重复文件多了&#…

人员定位及轨迹管理技术原理及应用领域

人员定位及轨迹管理的实现涉及多种技术和设备。例如&#xff0c;在GPS定位方面&#xff0c;使用卫星系统可以提供全球范围内的准确定位信息。然而&#xff0c;GPS在室内环境下的信号覆盖可能存在限制&#xff0c;因此在室内定位应用中&#xff0c;常常采用无线传感器网络&#…

第一行代码 第十一章 基于位置的服务

第11章 基于位置的服务 在本章中&#xff0c;我们将要学习一些全新的Android技术&#xff0c;这些技术有别于传统的PC或Web领域的应用技术&#xff0c;是只有在移动设备上才能实现的。 基于位置的服务&#xff08;Location Based Service&#xff09;。由于移动设备相比于电脑…

案例分享 | 纽扣电池石墨片厚度及缺陷检测

石墨片是一种导热散热材料&#xff0c;质轻柔软&#xff0c;能够轻松贴合在各种热源点&#xff0c;在新能源、航天、3C电子等领域应用广泛。 汽车钥匙中的纽扣电池也需要使用石墨片&#xff0c;石墨片会有统一的厚度标准&#xff0c;装配过程中表面不可避免地会出现裂纹、划痕…

Maven学习笔记(上)22版

1. 概述部分 1. 什么是 Maven&#xff1f; 为什么要学习Maven&#xff1f; 管理规模庞大的 jar 包&#xff0c;需要专门工具。脱离 IDE 环境执行构建操作&#xff0c;需要专门工具。 1、构建 Java 项目开发过程中&#xff0c;构建指的是使用『原材料生产产品』的过程。 原…