【el-switch更改高、宽、颜色样式】深入浅出element ui的switch同页面存在多个更改样式互不影响

news2025/1/10 19:30:46

1.技术:

“vue”: “^2.6.14”,
“element-ui”: “^2.15.6”,

2.需求:

同一个页面存在多个switch组件时,
需要更改各自的高度、宽度、选择颜色、非选中颜色等样式
并且样式隔离互不影响!

3.效果图:

在这里插入图片描述

4.重要代码index.vue页面:

<template>
    <div :id="id">
      <el-switch
        :ref="'mySwitch_' + id"
        v-model="element.data.value"
        @change="handelChange"
      ></el-switch>
    </div>
  </template>
  
  <script>
  
  export default {
    props: {
    //element就是下面element数据结构data里面对象
      element: {
        type: Object,
      },
      //id来自低代码平台,每个组件都有各自唯一的id
      id: {
        type: String,
      },
    },
    data() {
      return {
      };
    },
    watch: {
    //使用watch,因为目前低代码平台性能问题,导致数据与视图不一致,不得已使用深度监听
      "element.data": {
        handler(val, oldVal) {
          this.load();
        },
        deep: true,//因为低代码平台里数据结构层级深,所以加了deep深度监听
      },
    },
    methods: {
    //初始化绑定swtich组件的唯一dom元素id和新增style唯一的id,增加样式隔离
      load_init() {
        this.$nextTick(() => {
          const switchComponent = this.$refs["mySwitch_" + this.id];
  
          // 为每个 .switch__core 元素动态生成唯一的 id
          const switchCoreElement =
            switchComponent.$el.querySelector(".el-switch__core");
          switchCoreElement.id = `el-switch-core-${this.id}`;
  		 //为每个组件绑定唯一的style样式,增加样式隔离,强行覆盖原生样式
          const styleId = `style-el-switch-core-${this.id}`;
          let existingStyle = document.getElementById(styleId);
  
          if (!existingStyle) {
            const style = document.createElement("style");
            style.id = styleId;
            style.innerHTML = "";
            document.head.appendChild(style);
          }
        });
      },
      //根据上面新增的样式隔离,进行查询更改,以此覆盖原生的组件样式
      load() {
        this.$nextTick(() => {
          const switchComponent = document.getElementById(
            `el-switch-core-${this.id}`
          );
          if (switchComponent) {
            // 更新各个 switch 组件的样式
            switchComponent.style.height = this.element.data.switcheight + "px";
            switchComponent.style.width = this.element.data.switcWidth + "px";
            switchComponent.style.borderRadius =
              this.element.data.switcheight / 2 + "px";
  
            if (this.element.data.value) {
              switchComponent.style.background = this.element.data.openColor;
              switchComponent.style.borderColor = this.element.data.openColor;
            } else {
              switchComponent.style.background = this.element.data.closeColor;
              switchComponent.style.borderColor = this.element.data.closeColor;
            }
  
            const existingStyle = document.getElementById(
              `style-el-switch-core-${this.id}`
            );
            if (existingStyle) {
              existingStyle.innerHTML = `
            #el-switch-core-${this.id}:after {
              height: ${this.element.data.switcheight}px;
              width: ${this.element.data.switcheight}px;
              content: "";
              position: absolute;
              top: -1px;
              left: 1px;
              border-radius: 100%;
              -webkit-transition: all .3s;
              transition: all .3s;
              background-color: ${this.element.data.circleColor};
            }
            .el-switch.is-checked #el-switch-core-${this.id}:after {
              left: 100%;
              margin-left: -${this.element.data.switcheight}px;
            }
          `;
            }
          }
        });
      },
    },
    created() {
	    //初始化绑定swtich组件的唯一dom元素id和新增style唯一的id,增加样式隔离
        this.load_init();
        //根据上面新增的样式隔离,进行查询更改,以此覆盖原生的组件样式
        this.load();
    },
   
  };
  </script>
  

5.element数据结构:

let list = [
    {
        data: {
            value: false,
            openColor: "#409EFF",
            closeColor: "#DCDFE6",
            switcheight: 22,
            switcWidth: 40,
            circleColor:"#FFFFFF"
        }
    }
]


export default list;

6.深度解析原理

6.1.根据ref找到class为el-switch__core的dom元素,并且赋值唯一的id

在这里插入图片描述

6.2.因为::after伪类不能直接修改,只能通过新增的style节点样式,来覆盖原生组件的样式;(新增的style增加唯一id进行组件样式隔离)

在这里插入图片描述

6.3.深入style样式,在控制台==》元素==》html节点==》head节点==>style节点
在这里插入图片描述

7.总结

element-ui框架的switch组件,实际就是input+span元素实现的,
其中switch的圆球是通过span的::after伪类绝对定位上去的,
通过“transition: all .3s”实现动画效果
在这里插入图片描述

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

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

相关文章

C++动态规划(背包问题)

目录 一&#xff1a;动态规划是什么 二.动态规划的运用 &#xff08;1&#xff09;.用动态规划解决重复子问题 &#xff08;2&#xff09;.动态规划使用的条件与流程 Ⅰ.动态规划的使用条件&#xff1a; Ⅱ.动态规划的使用流程 &#xff08;3&#xff09;.背包问题 三.…

IO进程(学习)2024.8.22

信号 信号函数 信号处理函数 #include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 功能&#xff1a;信号处理函数 参数&#xff1a;signum&#xff1a;要处理的信号 handler&#xff1a;信号处理方式 SIG…

基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于矢量控制器的PMSM永磁同步电机速度控制系统simulink建模与仿真&#xff0c;仿真输出电机转速跟踪曲线&#xff0c;PID控制器输出曲线以及Te输出曲线。 2.系统仿真结果 &…

kafka的一个有趣问题(BUG)

这是我的第104篇原创文章 问题由来 在使用kafka时&#xff0c;创建topic&#xff0c;对某个topic进行扩分区的操作&#xff0c;想必大家肯定都使用过。尤其是集群进行扩容时&#xff0c;对流量较大的topic进行扩分区操作。一般而言&#xff0c;期望的效果是&#xff1a;新扩的分…

AI在医学领域:HYDEN一种针对医学图像和报告的跨模态表示学习方法

近年来&#xff0c;跨模态文本-图像表示学习在诸多领域取得了显著的突破&#xff0c;尤其是在零样本学习和图像-文本检索等任务上。这一成果的取得很大程度上归功于大量弱监督的图像-文本配对数据的利用&#xff0c;这些数据有效地增强了视觉-语言表示学习的能力。在医学成像领…

如何保证每次生成的都同一张人脸?AI绘画Stable Diffusion的Reference only插件人物一致性教程

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…

Linux宝塔面板使用教程 - Centos/Alibaba Cloud Linux,解放命令实现可视化

使用前注意事项&#xff1a;为了您的正常使用&#xff0c;请确保使用全新或纯净的系统安装宝塔面板&#xff0c;不支持已部署项目/环境的系统安装 1.安装命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh &&…

Godot《躲避小兵》实战之创建游戏主场景

游戏主场景 现在是时候将我们所做的一切整合到一个可玩的游戏场景中了。 创建新场景并添加一个 Node节点&#xff0c;命名为 Main。&#xff08;我们之所以使用 Node 而不是 Node2D&#xff0c;是因为这个节点会作为处理游戏逻辑的容器使用。本身是不需要 2D 功能的。&#x…

ZooKeeper 的3种部署模式

ZooKeeper 的3种部署模式 1. 单机模式&#xff08;Standalone Mode&#xff09;2. 伪集群模式&#xff08;Pseudo-Cluster Mode&#xff09;3. 集群模式&#xff08;Cluster Mode&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496;…

[000-01-011].第2节:持久层方案的对比

我的后端学习大纲 MyBatis学习大纲 1.持久层解决方案&#xff1a; 1.1.面试1&#xff1a;请说一说持久层解决方案有哪些&#xff1f;&#xff1f;&#xff1f; 1.jdbc JDBC为访问不同的数据库提供了一种统一的途径&#xff0c;为开发者屏蔽了一些细节问题。Java程序员使用JDB…

Vodafone 推出了与 Wi-Fi 竞争的基于树莓派私人5G技术

随着全球5G网络的逐步推出&#xff0c;在其过程中遇到了可预见的起起伏伏&#xff0c;并且蜂窝技术也开始进入另一个无线技术 Wi-Fi &#xff0c;并且已经占据的市场。私有5G网络&#xff08;即个人或公司建立自己的全设施蜂窝网络&#xff09;如今正在寻找曾经属于Wi-Fi的唯一…

Unity低延迟播放RTSP视频流

Unity播放RTSP视频流这个功能在好几个项目中用到&#xff0c;虽然有一些现成的插件&#xff08;VLC for unity、UMP&#xff09;可以使用&#xff0c;但是延迟高&#xff08;300毫秒以上&#xff09;的问题一直没法解决。 最近终于下定决心来解决这个问题&#xff0c;经过几天…

基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【微服务部署】Linux部署微服务启动报ORA-01005

问题背景&#xff1a; Linux机器部署springboot微服务&#xff0c;部署完成后发现无法启动&#xff0c;后台报ORA-01005错误。 解决方案&#xff1a; 1.检查当前服务器是否已安装oracle客户端 命令行执行sqlplus username/passwd实例名&#xff0c;如果执行成功&#xff0c;说…

【Canvas与艺术】十边曲线形光阑

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>十边曲线型光阑</title><style type"text/css"&g…

机器学习-识别手写数字

机器学习可以首先构建一个神经网络&#xff0c;用于识别手写数字。通过训练数据&#xff0c;优化神经网络的参数。再利用测试数据来测试训练完成后的神经网络的准确度。本次需要下载的库有tensorflow和matplotlib&#xff0c;keras和mnist数据集一般都被集成在tensorflow中了。…

C/C++语言基础--指针三大专题详解3,完结篇(包括指针做函数参数,函数指针,回调函数,左右法则分析复杂指针等)

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 指针是C/C的灵魂&#xff0c;和内存地址相关联&#xff0c;运行的时候速度快&#xff0c;但是同时也有很多细节和规范要注意的&#xff0c;毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解&#xff0c;本…

LabVIEW多显示器环境下主显示器识别与管理

该程序使用 LabVIEW 图形化编程语言&#xff0c;涉及多显示器环境中主显示器的识别与信息提取。图像显示了两个不同的方法来获取主显示器的信息。 第一部分&#xff1a;方法一——基于显示器位置的主显示器识别 1. 当前监视器识别&#xff1a; 使用“FP.Monitor”属性节点获取…

在AES加密中,设主密钥为“2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C”,试计算迭代第1轮使用的轮密钥。

题解: 1.分析: 第一轮使用的轮密钥是W[4]、W[5]、W[6]、W[7] w[i](4≤i≤43)求法: (1)i不为4的倍数 w[i] = w[i-1] ⊕w[i-4] (2)为4的倍数 w[i]=SubWord(RotWord(w[i-1]))⊕w[i-4]⊕Rcon[i/4] 解释: ①RotWord:将w[i-1]的4个字节循环上移一个字节 ②SubWo…

JVM的类是如何运行的

本文就是讲解 如何将.class文件转换为机器码