快速修改antd vue单个组件的默认样式

目录
  • 一、想要修改组件的默认样式
  • 二、类名scoped的限制 你是否会有这样的疑惑
  • 三、使用/deep/、 >>>时

Ant Design Vue地址:https://www.antdv.com/docs/vue/introduce-cn/

刚接触Ant Design Vue的童鞋们可能会有这样的问题,不就是修改默认的组件样式吗,为什么一会生效,一会又不生效。希望看完这个文章,会给你一些收获~

一、想要修改组件的默认样式

首先你需要知道组件是渲染在哪里的 这个组件是渲染在当前页面内部,还是脱离vue根节点单独渲染?(根节点默认id=“app”)

这个问题的答案很容易得到,打开文章顶部的antdv官方文档,任意选中组件,F12打开调试,观察Elements,例如:

1、不难看出,button是渲染在当前页面内部的,包裹在"#app"的容器里。这样的组件还有很多,比如input、radio等等。再看下面这张图:

2、dropdown组件则是一部分渲染在#app内,一部分渲染在"#app"的外面且与"#app"同级。这样的组件也有很多,比如select、drawer等等

3、dropdown等,我们发现它们的共同点:这些组件都是“触发型”组件,都是由用户hover、click等手动激活后,进行了动态渲染的

确定了这一点之后有什么用呢?

第二类组件,class类名设置的仅仅是#app内部元素,而渲染在#app之外的那部分节点,需要单独设置类名,比如 tooltip,我们设置overlayClassName="overlay-class"来测试:

我们发现类名已经设置好了。这一条解决了 没有对应到自己的父级类会造成的样式不生效 的问题

不同组件设置的属性名称不完全相同,使用时去查阅文档就可以了

二、类名scoped的限制 你是否会有这样的疑惑

为什么有的需要设置 >>> 或者 /deep/ 来重写深层样式,有的却不需要?

开发时,我们会根据需要设置每个页面、组件css 的 scoped属性,众所周知,这个属性是为了限制css只被当前vue文件所使用,那它是如何实现这个限制的呢?

我们任意打开一个scoped的页面,打开调试

我们可以发现,这个页面的几乎所有节点,都有了一个共同的“标识”

我们在elements中打开对应scoped的css文件,看下实际书写和渲染出来的对应关系:

.override {
  padding: 100px 100px 200px 100px;
}
/* 按钮 */
.test-button {
  background: pink;
  border: 0;
}
.ant-btn-primary {
  background: #ccc;
  border: 0;
}
/* 面包屑 */
.container >>> .ant-breadcrumb-separator {
  margin: 10px;
}
.container /deep/ .ant-breadcrumb-separator {
  margin: 30px;
}

发现css也被编译成了具有标识的! 重要的是,设置在/deep/ 和 >>> 后面的类,在编译之后,是没有这个标识的!

发现了这一点之后,我们不需要去管是什么页面,用的什么组件,只需要打开Elements面板,观察你要写的节点class,有没有这个“标识”。

  • 如果有的话,正常写css,类名就会被编译成有“标识”的;
  • 如果没有的话,需要设置在/deep/、>>>之后,编译后就会拿掉这个标识

三、使用/deep/、 >>>时

parentClass所在的节点是不带“标识”的怎么办?

根据前面的总结,设置scoped后,此时的 parentClass 是被编译成带“标识”的, sonClass是不带“标识”的。

.parentClass >>> .sonClass
.parentClass /deep/ .sonClass

那实际使用时,如果parentClass所在的节点本身是不带 “标识” 的怎么办?

例如:

antd vue的组件,渲染在#app外部,已经按照第一条给了自定义的类名wrapClassName,但是这个wrapClassName我们仍然无法使用,因为它所在的div并没有这个“标识”(极少数情况会出现)

这时我们拿出了终极武器,

<div ref="wrap">
  <a-modal
    v-model="visible"
    title="Basic Modal"
    @ok="handleOk"
    class="test"
    :getContainer="() => this.$refs.wrap"
   >
    <p>Some contents...</p>
    <p>Some contents...</p>
    <p>Some contents...</p>
  </a-modal>
</div>

通过设置组件的 getContainer属性(有的组件是 getPopupContainer ),我们将原本渲染在#app外部的节点,手动挂载到了#app内部,之后再通过第二条的规则去设置就可以啦~

也可以不指定ref,直接设置 :getContainer="triggerNode => triggerNode.parentNode"默认找到#app内部的父节点

以上三点:

  • 第一点解决了没有父级类的问题(单独通过属性设置)
  • 第二点解决了scoped造成的没有对应到父级类的问题(根据节点“标识”情况使用 >>> 或 /deep/)
  • 第三点解决了没有父级类可以设置的问题(手动更改渲染规则)

前两条操作的是类名样式,第三条操作的是节点,小编觉得能通过前两条解决的,尽量就不用第三条了(盲猜会影响性能吧)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解基于Vue cli开发修改外部组件Vant默认样式

    前言 在引入外部组件的时候,想要修改默认样式,可以通过class修改,但一般会有权重不够等各种原因,官网其实列出了一套主题定制的方案,通过覆盖配置文件来修改样式,官网地址:主题定制 提示:以下是本篇文章正文内容,下面案例可供参考 一.Less 因为Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,可以通过替换样式变量即可定制你自己需要的主题. 给你的项目配置less: npm install less --save-dev npm install less-loader --s

  • vue里面父组件修改子组件样式的方法

    在使用 vue 的开发中,我们有时会引用外部组件,包括 UI 组件(ElementUI.iview). 当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素. 但是在父组件中添加 scoped 之后,父组件的样式将不会渗透到子组件中,所以在父组件中书写子组件的样式是无效果的. 一.去掉 scoped 在父组件的 <style> 中去掉 scoped 后,父组件中可以书写子组件的样式,但是你会担心这样会污染全局样式. [因为我们知道正确使用全局样式

  • vue中element-ui组件默认css样式修改的四种方式

    目录 前言 1.使用全局统一覆盖 2.在.vue文件中修改 3.修改组件的style样式 4. 参考element-ui官方文档的api 疑问 总结 前言 修改element-ui组件的默认样式一直是一个老生长谈的话题,在做完公司的一整个项目后,我总结了以下4种修改element-ui默认样式的方法. 1.使用全局统一覆盖 针对一些通用的.样式固定的组件,可以全局处理,其方法是新建一个css或者scss文件,覆盖element原有的class 你可以在src/styles目录下新建一个eleme

  • vue如何使用vant组件的field组件disabled修改默认样式

    目录 使用vant组件的field组件disabled修改默认样式 vue+vant修改样式 1.当<style>没有scoped时 2.有scoped时 使用vant组件的field组件disabled修改默认样式 由于vue开发时会在style加上scoped避免全局污染,所以正常开发时直接修改外部组件(vant)的样式时会不生效,我们把scoped删除后会发现样式是可以生效的. 但是scoped是肯定不能不要的. 所以我们可以用 /deep/(深度)来修改样式 举例 —— 修改vant

  • 快速修改antd vue单个组件的默认样式

    目录 一.想要修改组件的默认样式 二.类名scoped的限制 你是否会有这样的疑惑 三.使用/deep/. >>>时 Ant Design Vue地址:https://www.antdv.com/docs/vue/introduce-cn/ 刚接触Ant Design Vue的童鞋们可能会有这样的问题,不就是修改默认的组件样式吗,为什么一会生效,一会又不生效.希望看完这个文章,会给你一些收获~ 一.想要修改组件的默认样式 首先你需要知道组件是渲染在哪里的 这个组件是渲染在当前页面内部,还

  • vue单个组件实现无限层级多选菜单功能

    wTree.vue  原理:每一个多选框都是一个节点,每个节点就是一个wTree组件,有父级(顶级level为0),有子级(底层list[]是空的),组件之间状态传递是通过组件通信传递,对于外部数据checkList数组的修改是通过store实现的.初始化从底层状态传递到上层,一层一层传递.改变状态,不同状态改变,修改checklist数组.大概就这个思路,下面是代码: <template> <div> <div > <span v-for="o in

  • 浅谈vue中改elementUI默认样式引发的static与assets的区别

    首先从这说起 vue项目中的elementUI的默认样式怎么改 由于elementUI的样式太单调,比如这个slider滑块 elementUI中的API是没办法改变这个slider的颜色的,可是老板喜欢很黄,非要用yellow色.

  • elementui的默认样式修改方法

    今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效果图 以上这篇elementui的默认样式修改方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: 浅谈vue中改elementUI默认样式引发的static与assets的区别 浅谈vue中改elementUI默

  • React UI组件库之快速实现antd的按需引入和自定义主题

    目录 React UI组件库 流行的开源React UI组件库 antd的基本使用 antd样式按需引入 antd自定义主题 总结 React UI组件库 流行的开源React UI组件库 material-ui(国外) ant-design(国内蚂蚁金服) antd的基本使用 antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品. 安装antd组件库: npm install antd --save yarn add antd 默认按需引入

  • 解决vue加scoped后就无法修改vant的UI组件的样式问题

    有时候UI组件提供的默认的样式不能满足项目的需要,就需要我们对它的样式进行修改,但是发现加了scoped后修改的样式不起作用. 解决方法: 使用深度选择器,将scoped样式中的选择器"深入",即影响子组件 <style scoped> .a >>> .b { /* ... */ } </style> 以上的代码会编译成: .a[data-v-f3f3eg9] .b { /* ... */ } 注意:如果你使用了Less或Sass等预处理器,可

  • 浅谈vue中子组件传值的默认值情况

    当父组件中的content值没有传入时,子组件利用default属性设置默认值,此情况时,页面会显示default value. 当传入content的值时,default属性的默认值不生效,界面显示为: 补充知识:Vue父组件向子组件传值遇到的BUG 当子组件中含有props属性,使用ref对其中的prop属性赋值时报错 Avoid mutating a prop directly since the value will be overwritten whenever the parent

  • Vue修改mint-ui默认样式的方法

    在使用vue框架开发时,饿了么的mint-ui框架是个不错的选择,但是有时候我们需要修改它的默认样式,方法如下: 1.在src/assets/css目录下新建scss文件,my-mint.scss,内容如下: /* 覆盖mint-ui的primary颜色,改为自己UI的主题色 */ $color-primary: #05AFAF; .mint-header { background-color: $color-primary; } .mint-button:not(.is-disabled):a

随机推荐