组件样式

@Style
Introduction
父组件中,为只有一个根节点的子组件指定样式类 class 时,这个 class 会直接 叠加 到子组件的根节点上 - 属性透传 Fallthrough Attributes
同样特点的属性还有 style、id 以及 v-on 等
更多样式信息,请访问 css features
每一个子组件都使用一个根节点,且使用同组件名的类,便于父组件布局
样式属性透传
样式合并 - class and style Merging
子组件 - 具有唯一根节点,且指定样式类 title
<div class="title">recommend</div>
父组件 - 引入并使用子组件,同时指定样式类 green
<Title class="green"></Title>
最终渲染 - 同时带有样式类 title 和 green;且 green 在 title 后 - merged with the class and style values that are inherited from the parent
<div class="title green">recommend</div>
为什么 green 在 title 后?
事件属性透传
属性透传同样适用事件 - same rule applies to v-on
子组件 - 指定一个事件 say88
<div class="title" @click="say88">recommend</div>
父组件 - 透传一个事件 sayHi;事件触发时,先执行子组件的事件处理函数,再执行父组件的事件处理函数
子组件的任何元素都会触发透传的事件 sayHi
<Title @click="sayHi"></Title>
[] 分析几种情况下,fn、doTitle 和 doFa 的触发情况
情况1:子组件传递一个普通属性和一个方法属性;父组件透传一个事件 doFa
<div class="title">
  <h3 @click="doTitle">{{ props.title }}</h3>
  <span @click="fn">></span>
</div>
<Title :fn="toCoupon" @click="doFa"></Title>
情况2:子组件使用事件修饰符 stop
<div class="title">
  <h3 @click.stop="doTitle">{{ props.title }}</h3>
  <span @click="fn">></span>
</div>
<Title :fn="toCoupon" @click="doFa"></Title>
情况3:父组件使用事件修饰符 self
<div class="title">
  <h3 @click="doTitle">{{ props.title }}</h3>
  <span @click="fn">></span>
</div>
<Title :fn="toCoupon" @click.self="doFa"></Title>
作用域 scoped
为 <style> 指定 scoped 时,它的 CSS 只会影响当前组件的元素
父组件的样式将不会 渗透 到子组件中 - 组件封装的特性
不过,子组件的根节点会同时被父组件的作用域样式和子组件的作用域样式影响。便于:让父组件可以从布局的角度出发,调整其子组件根元素的样式
更多作用域详细信息,请参考 类 classAPI - 单文件组件 CSS 功能
最佳体验:为组件的根节点指定与组件同名的样式类,很容易保证组件类的唯一性,且便于父组件布局
[] 版权组件结构
<template>
    <div class="copyright">
        <span class="txt">copyright @ 2024-2026</span>
        <slot></slot>
        <span class="txt">glpla.github.io</span>
    </div>
</template>
<style scoped>
</style>
父组件指定样式,如标签选择器 span 或类选择器 .txt,甚至带上子组件根节点类,都不会影响子组件内元素的样式
span {
    font-weight: 600;
}

.txt {
    color: #f40;
}

.copyright .txt {
  color: #f40;
}
但是。但是。。但是。。。父组件能影响到子组件根节点
.copyright {
    background-color: #000;
}
特殊选择器
一般情况下,不建议父组件修改子组件的内部 - 破坏子组件的封装
特殊情况下,多见于UI框架的定制中,如 Vant;具体使用请参考官方文档
深度选择器 :deep(selector)
父组件如果想深入调整子组件内部元素的样式|影响到子组件,包括子组件的插槽元素,应使用伪类 :deep(selector)
父组件使用深度选择器设置子组件内元素样式 - 父组件使用插槽,知道传递了什么元素,使用了什么选择器
:deep(img) {
    width: 30px;
    height: 30px;
}
全局选择器 :global(selector)
使用 :global(selector) 将样式提权到全局|扩大作用域
理论上可以在父组件或子组件中指定;但是应尽量 避免
建议 - 全局类写到单独的样式文件中并全局引入
:global(.warn) {
    color: red;
}
以上选择器请仅在必要时使用,否则应寻求其它方法
还有一个样式穿透 >>>;注意当前框架是否支持
Drill
[] 标题组件 Title.vue 的粘性定位
[] 主导航 AppNav.vue 的固定定位
Summary & Homework
Summary
组件样式透传

. 全局样式选择器 :global()

. 深度样式选择器 :deep()

组件事件透传
Homework
[] 返回顶部 BackToTop.vue 的固定定位