【Vue3】scoped 和样式穿透

我们使用很多 vue 的组件库(element-plus、vant),在修改样式的时候需要进行其他操作才能成功更改样式,此时就用到了样式穿透。

而不能正常更改样式的原因就是 scoped 标记。

scoped 的渲染规则:

js 复制代码
<template>
  <main>
    <el-input
      placeholder="请输入"
      class="ipt"
    ></el-input>
  </main>
</template>

<script setup lang="ts">

</script>

<style scoped lang="less">
.ipt {
  width: 300px;
  margin: 100px 400px;
}

</style>
  1. 给 HTML 的 DOM 节点增加一个不重复的 data 属性,表示它的唯一值。

  2. 编译后的生成的 css 语句,在每句 css 选择器的末尾加一个当前组件的 data 属性选择器来私有化样式。

  3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的 data 属性。

    此时 App 组件里面包含了 el-input 组件。

这时我们给 input 框加一个背景样式:

css 复制代码
.ipt {
  width: 300px;
  margin: 100px 400px;
  .el-input__inner {
   background: tomato; 
  }
}

此时 scoped 的第二条和第三条之间的矛盾就出现了。

.el-input__inner 里面并没有 data-v-7a7a37b1 属性,导致背景样式失效。

样式穿透解决这个问题:

  1. 如果是 Vue2:

    css 复制代码
    .ipt {
      width: 300px;
      margin: 100px 400px;
      /deep/ .el-input__inner {
       background: tomato; 
      }
    }
  2. 如果是 Vue3:

    css 复制代码
    .ipt {
      width: 300px;
      margin: 100px 400px;
      :deep(.el-input__inner) {
        background: tomato;
      }
    }

问题解决!

相关推荐
+VX:Fegn089513 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
半个落月13 小时前
LangChain.js Agent Memory 实战(下):用 Milvus 构建可检索的长期记忆
javascript·langchain
半个落月13 小时前
LangChain.js Agent Memory 实战(上):从内存对话、文件持久化到截断与摘要
javascript·langchain
Nicander14 小时前
我给 Excalidraw 做了一个本地工作区:DrawSpace
前端·开源
linux_cfan16 小时前
17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast
前端·javascript·音视频
计算机魔术师16 小时前
烧掉2780亿美元还不够?OpenAI的资本豪赌让人头皮发麻
前端
IT_陈寒17 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
卡布鲁17 小时前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
碳基修炼18 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
步行cgn18 小时前
Spring p 命名空间注入详解
java·前端·spring