TAB标签美化 - SVG作为mask

news2025/1/17 1:16:58

今天觉得V3的标签不是很好看,忽然想起来之前看过Vue Admin Beautiful Pro的样式挺好的,顺手研究了一把。发现Vue Admin Beautiful是采用PNG+mask css来解决的。于是乎打算把V3的标签页做点小美化,但是迁移过程发生些小插曲,在此记录一下。

1)像素化变形问题

VABPro采用的是PNG作为背景,这个图片

之前没用过mask的css,看了下mask说明,是将黑色的部分作为混合颜色的保留部位,透明作为穿透部分。而为了保证铺满TAB的背景,使用了mask-size这个属性进行了拉伸。

由于PNG本身不是矢量,拉伸后出现了变形,边界模糊的问题,效果不好(忘截图片了)。于是想起来用SVG来做背景,打开AI描摹再修改了下,得到了SVG。

2)SVG无法拉伸的问题

仿照VABPro的方式,将SVG编码为BASE64,发现能够显示,但是无法拉伸变形。本以为该问题无解,找遍google快放弃的时候,忽然有人提到了在svg添加preserveAspectRatio="none"放弃比例限制。试了下,还真可以,于是乎得到了这个SVG数据:

<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" viewBox="0 0 191 34"><path d="M0,34c7.37-2,9-4,9-11.36,0-4.15-.06-8.3,0-12.45C9,5.64,13.49,0,21,0H170c7.45,0,12.13,5.77,12.06,10.59-.06,3.82-.07,7.66-.06,11.49,0,8,1.24,9.65,9,11.92"/></svg>

BASE64编码后,真的能够拉伸了,这下比PNG看起来舒服多了,顺便把VAB的比例重新调了一下。

3)改编v3-admin-vite的tab头部,修改下TagsView/index.vue里的样式部分:

<style lang="scss" scoped>
.tags-view-container {
  height: var(--v3-tagsview-height);
  width: 100%;
  background-color: var(--v3-header-bg-color);
  box-shadow: 0 0 3px 0 #00000010;
  .tags-view-wrapper {
    .tags-view-item {
      display: inline-block;
      position: relative;
      cursor: pointer;
      height: 26px;
      line-height: 26px;
      //border: 1px solid var(--v3-tagsview-tag-border-color);
      //border-radius: var(--v3-tagsview-tag-border-radius);
      color: var(--v3-tagsview-tag-text-color);
      background-color: var(--v3-tagsview-tag-bg-color);
      padding: 0 20px; // Edit by Jim
      font-size: 12px;
      // margin-left: 5px;
      // margin-top: 4px;
      &:first-of-type {
        margin-left: 5px;
      }
      &:last-of-type {
        margin-right: 5px;
      }

      height: 34px;
      line-height: 34px;
      &.active {
        background-color: var(--v3-tagsview-tag-active-bg-color);
        color: var(--v3-tagsview-tag-active-text-color);
        // ---- add by Jim ----
        mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHZpZXdCb3g9IjAgMCAxOTEgMzQiPjxwYXRoIGQ9Ik0wLDM0YzcuMzctMiw5LTQsOS0xMS4zNiwwLTQuMTUtLjA2LTguMywwLTEyLjQ1QzksNS42NCwxMy40OSwwLDIxLDBIMTcwYzcuNDUsMCwxMi4xMyw1Ljc3LDEyLjA2LDEwLjU5LS4wNiwzLjgyLS4wNyw3LjY2LS4wNiwxMS40OSwwLDgsMS4yNCw5LjY1LDksMTEuOTIiLz48L3N2Zz4=);
        -webkit-mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHZpZXdCb3g9IjAgMCAxOTEgMzQiPjxwYXRoIGQ9Ik0wLDM0YzcuMzctMiw5LTQsOS0xMS4zNiwwLTQuMTUtLjA2LTguMywwLTEyLjQ1QzksNS42NCwxMy40OSwwLDIxLDBIMTcwYzcuNDUsMCwxMi4xMyw1Ljc3LDEyLjA2LDEwLjU5LS4wNiwzLjgyLS4wNyw3LjY2LS4wNiwxMS40OSwwLDgsMS4yNCw5LjY1LDksMTEuOTIiLz48L3N2Zz4=);
        mask-size: 100% 100%;
        -webkit-mask-size: 100% 100%;
        z-index: 1;

        &::before {
          content: '';
          background-color: var(--v3-tagsview-tag-active-before-color);
          display: inline-block;
          width: 8px;
          height: 8px;
          border-radius: 50%;
          position: relative;
          margin-right: 5px; // Modified by Jim
        }
      }
      &:not(.active) {
        // add by Jim
        background-color: var(--el-menu-border-color) !important;
        border-top-left-radius: 3px;
        border-top-right-radius: 3px;
        border-left: none;
        border-right: none;
        margin: 0 -10px;
        opacity: 0.95;
      }

      .el-icon {
        margin: 0 2px;
        vertical-align: middle;
        border-radius: 50%;
        &:hover {
          background-color: var(--v3-tagsview-tag-icon-hover-bg-color);
          color: var(--v3-tagsview-tag-icon-hover-color);
        }
      }
    }
  }
  .contextmenu {
    margin: 0;
    background-color: #fff;
    z-index: 3000;
    position: absolute;
    list-style-type: none;
    padding: 5px 0;
    border-radius: 4px;
    font-size: 12px;
    font-weight: 400;
    color: #333;
    box-shadow: 2px 2px 3px 0 #00000030;
    li {
      margin: 0;
      padding: 7px 16px;
      cursor: pointer;
      &:hover {
        background-color: #eee;
      }
    }
  }
}
</style>

看了下,效果不错。在Chrome、Firefox、Edge下能很好兼容,IE11就免了,连登录都进不去:

在默认主题下工作良好

黑色可能要稍微调整一下

在深蓝主题下,由于默认背景色半透明,问题稍多一点

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

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

相关文章

蓝桥杯嵌入式(G431)备赛笔记——按键模块设计

cubeMX配置: 原理图 引脚配置为上拉模式 定时器 使用定时器3(通用定时器,使用外部晶振,内部时钟),分频系数为80(从0开始则为80-1),则每1s 1m次,定时评率为为10000,对应1s 1m/10000次,频率为10ms每次 一定记得开启NVIC使能中断 编写中断回调函数 void HAL_TIM_Per…

windows程序设计课程作业-1

目录 1、作业内容 2、主要思路 (1)写接口 (2)写类具体实现接口 (3)声明委托 (4)创建实例 (5)实例化委托 3、难点分析 1&#xff09;想明白接口的作用 2&#xff09;委托的作用 4、实现代码 5、运行结果 1、作业内容 使用 C# 编码&#xff08;涉及类、接口、委托等关…

Android Studio学习10——资源res的使用

一、String,StringArray的使用 一次修改&#xff0c;多出生效 String StringArray 二、color的使用 颜色代码对应表 和上面的相似用法 三、Dimen(尺寸)的使用 用的少&#xff0c;一般直接写尺寸 四、如何写一个drawable作为背景 五、如何写一个可以改变的drawable(按钮按下…

python爬虫———post请求方式(第十四天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

【Qt 学习笔记】如何在Qt中打印日志 | qDebug的使用 | Assistant的使用

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 如何在Qt中打印日志 | qDebug的使用 文章编号&#xff1a;Qt 学习笔记…

全文更新:什么是Power Path?充电时是充电器供电还是电池供电?

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 昨天的文章误删了一部分&#xff0c;很多同学留言想看全文&#xff0c;现补充、更新如下&#xff1a; 前段时间&#xff0c;交流群里有位同学…

【群智能算法改进】一种改进的鹦鹉优化算法 鹦鹉优化器 IPO算法【Matlab代码#73】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始鹦鹉优化算法PO2. 改进后的IPO算法2.1 自适应切换因子2.2 混合柯西和高斯变异 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始鹦鹉优化算法PO 鹦鹉优化算法…

由王雅贤带你深入《DBWGLX vs Ethan_Wang》

vs是versus。 &#xff08;百度收录我DBWG&#x1f64f;&#x1f64f;&#x1f64f;&#xff09; 算来篇自传吧。像自我介绍和简历我是完全没写过喵~ 2024年4月6日12:44:53書 本命王雅贤&#xff0c;DBWGLX我的微信号&#xff0c;至于什么意思&#xff0c;吊臂王锅的意思&am…

ARM FVP平台的terminal窗口大小如何设置

当启动ARM FVP平台时&#xff0c;terminal窗口太小怎么办&#xff1f;看起来非常累眼睛&#xff0c;本博客来解决这个问题。 首先看下ARM FVP平台对Host主机的需求&#xff1a; 通过上图可知&#xff0c;UART默认使用的是xterm。因此&#xff0c;我们需要修改xterm的默认字体设…

sql语句如何在MySQL中执行?

我们先来对MySQL的基础结构进行分析 一、 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图&#xff0c;从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。 简单来说 MySQL 主要分为 Server 层和存储引擎层&#xff1a; Server…

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度&#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据&#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件&#xff0c;都是内存文件。内存大小&#xff0c;一般 是GB为单位。 现在都操作…

【Pt】马灯贴图绘制过程 04-玻璃脏迹

目录 效果 步骤 一、透明玻璃 二、烟熏痕迹 三、粗糙 四、浮尘 效果 步骤 一、透明玻璃 1. 打开纹理集设置&#xff0c;着色器链接选择“新的着色器链接” 在着色器设置中可以看到此时名称为“Main shader &#xff08;Copy&#xff09;” 这里修改名称为“玻璃” 在…

【加密周报】比特币“强烈看涨”信号来了!巨鲸们正疯狂囤积稳定币!SEC呼吁公众对以太币ETF提供意见!

在过去一周里&#xff0c;比特币价格经历了一段下跌&#xff0c;并在随后出现了一些反弹迹象。与此同时&#xff0c;链上数据显示&#xff0c;巨鲸们在囤积稳定币&#xff0c;预示着“强烈的看涨情绪”。以太坊方面&#xff0c;美国证券交易委员会&#xff08;SEC&#xff09;已…

异常练习题

第一题&#xff1a;分析题 package chapter09_exception_teacher.src.com.atguigu05.exer.exer2;/*** 输出结果&#xff1a;* 进入方法A* 用A方法的finally* 制造异常* 进入方法B* 调用B方法的finally** author shkstart* create 0:57*/ public class ReturnExceptionDemo {sta…

【算法题】树节点的第 K 个祖先

题目&#xff1a; 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。 实现…

算法 ST表

思想&#xff08;本质为dp&#xff09;&#xff1a; 题目AcWing1270. 数列区间最大值&#xff1a; 1270. 数列区间最大值 - AcWing题库 输入一串数字&#xff0c;给你 M 个询问&#xff0c;每次询问就给你两个数字 X,Y要求你说出 X到 Y这段区间内的最大数。 输入格式 第一…

Java数据结构队列

队列(Queue) 概念 队列的使用 注意&#xff1a;Queue是个接口&#xff0c;在实例化时必须实例化LinkedList的对象&#xff0c;因为LinkedList实现了Queue接口。 import java.util.LinkedList; import java.util.Queue;public class Test {public static void main(String[]…

初识二叉树和二叉树的基本操作

目录 一、树 1.什么是树 2. 与树相关的概念 二、二叉树 1.什么是二叉树 2.二叉树特点 3.满二叉树与完全二叉树 4.二叉树性质 相关题目&#xff1a; 5.二叉树的存储 6.二叉树的遍历和基本操作 二叉树的遍历 二叉树的基本操作 一、树 1.什么是树 子树是不相交的;…

windows server 2019-DHCP服务器搭建

一、DHCP的原理&#xff1a; 1&#xff0c;获得ip的过程 客户机发送请求给所有DHCP服务器 DHCP服务器收到请求后发送响应包给客户机 客户机收到响应包&#xff08;第一个到达的&#xff09;后&#xff0c;检验响应包里面的ip能不能用&#xff08;使用ping的方式&#xff0c…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…