视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
详解.vue文件中style标签的几个标识符
2020-11-27 22:11:26 责编:小采
文档

  • vue-laoder会解析组件, 提取语言块. 在需要的时候, 经过其他的loader处理, 最后组装成一个commonjs模块.
  • 其实就是export default出来一个对象 然后呢, 上面的<template>, 挂载在 这个对象的template属性上
  • 之前, 直接import引近来一些样式文件也是可行的, 但当时并未思考这些标识如何实现.
  • <style>可以有module和scoped属性, 来将样式封装到组件中. 具有不同封装模式的多个<style>标签, 可以在一个组件中混合使用
  • 默认情况下, style-loader会提取内容, 并通过<style>标签, 加入到文档的<head>中. 也可以通过配置webpack形成单个.css文件.
  • $style配合<module>如何工作

    参考: https://vue-loader-v14.vuejs.org/zh-cn/features/css-modules.html

    <style>中使用一个module属性, 可以形成名为$style的计算属性从而在节点中动态绑定样式.

    <span :class="$style.text">
     ...
    </span>

    形成的计算属性可以绑定:class的object/array语法.

  • 在html中 class绑定的事一个object语法.
  • 如果在data上面的isRed这个属性是true的话, 就会添加上red这个属性名
  • 从而形成了一个属性控制
  • <span :class="{[$style.red] : isRed}">
     测试
    </span>
    <script>
     data() {
     return {
     entries: [],
     isRed: true,
     };
     },
    </script>
    <style module>
     .red {
     color: red;
     }
    </style>
  • 可以在js中通过console.log(this.$style.red)进行访问
  • 可以使用module=''来更改$style这个名称
  • <div :class="aaa.root">
    </div>
    <style lang="less" module="aaa">
    </style>

    scoped的作用域是如何的

    <style></style>标签有scoped属性的时候, 他的css样式只作用在当前作用域

    使用了scoped之后, 父组件的样式不会再深入到自组件.

  • 不过子组件的根节点同时受到 父组件有作用域的CSS 和 子组件有作用域的影响
  • 但是有一点: 如果我们在子组件上面添加了一个类样式 就能向下一层层的进行修改
  • 深度作用选择器: >>> 或者是 /deep/

  • 已验证: 在less下面不起作用
  • 已验证: 在普通的css下才起作用.
  • 据网上说, stylus起作用, scss不起作用, 并未验证
  • v-html动态生成的样式不受作用域内样式影响, 但我想应该加个类样式名称,可以解决.(未验证)

    css的作用域的渲染方式, 远不如class的渲染速度

    递归组件中, 小心使用CSS样式.

    element中样式的混入方式 (todo)

  • 通过打包进行样式的使用, 故使用方式在build的文件夹中
  • 样式目录为: element/packages/theme-chalk/src/menu.scss, 以方便后期的具体查看
  • 解决过程

    使用scopedSlots解决

    我擦哦, 再次测试后, 发现添加scopedSlots并没有什么卵用, 和什么都不写是他妈一个样子啊.. 我说怎么, 怎么查了半天, 也没人用.
    还被这玩意所拯救, 也真是够了..
    当时还骄傲了半天, 还以为是发现了新天地, 也真是6了.

    添加scoped之后, 在子组件上面添加类样式名, 发现并没有卵用

    错误依旧: 只是在表面层上的有一些data-v的注入

    没有找到需要注入到里面的条件, 发现自己前面大部分的判断都是错误的.

    解决方案一:scoped方案

  • 将无法进行样式覆盖的部分拿出来
  • 使用原生的css样式, 添加scoped
  • 使用 >>> 语法糖进行样式的注入
  • <style scoped>
    
    .main_nav .el-menu .el-submenu >>> .el-submenu__title {
     background-color: red;
    }
    </style>

    解决方案二: module方案

  • 使用module进行属性的选择
  • 然后是用:global()进行这个属性下面的全部选择
  • 进而选中这个没有在作用域下面但是可以选择到的元素
  • 个人始终认为这种选择方案, 可以做到css作用域的区分, 但是, 并不灵活
  • 具体的以后再分析
  • <style lang="less" module="aaa">
    .red {
     .item {
     :global(.el-submenu__title) {
     background: red;
     }
     }
    }
    </style>

    总结

  • .vue文件中的<style></style>只有modulescoped, 没有其他取巧方案
  • module形成一个代表属性的计算属性, 默认名称为$style, 其中的:global()可以进行这个区域下面的所有元素的选择.
  • scoped形成的作用域, 可以通过>>>来进行子组件的样式覆盖, 带只要原生的css支持.
  • 下载本文
    显示全文
    专题