基于 BEM 规范实现简单的全局 scss

2023-11-03

  • 该文章是在学习 小满vue3 课程的随堂记录
  • 示例均采用 <script setup>,且包含 typescript 的基础用法

前言

  • BEM 是 css 常用的命名规范
  • BEM :block(块)element(元素)modify(修饰符)
  • namespace-block__elementnamespace-block---modify 格式为例(namespace 一般是 ui 库的前缀,如 element-ui 的 el 前缀)
  • scss 的使用请参考 scss中文网

一、创建全局 scss文件

在 src 下新建文件 bem.scss,用到 scss 的一些知识:

  • 父子选择器 直接 嵌套使用
  • 变量声明 $
  • 插值 使用:#{变量名}
  • @mixin 定义混入,@include 使用混入
  • @at-root 跳出嵌套
$namespace: "xm" !default; // 命名空间
$block-sel: "-" !default; // block 用 - 连接
$element-sel: "__" !default; // element 用 __ 连接
$modify-sel: "--" !default; // modify 用 -- 连接。      如 xm-page__button--primary

// 生成 block 的规范类,如 .xm-block{}
@mixin b($block) {
  $B: #{$namespace + $block-sel + $block};
  .#{$B} {
    // 这里类似于 插槽的功能,把对应的样式填进来
    @content;
  }
}

// 生成 element 的规范类,如 .xm-block__inner{}
@mixin e($el) {
  // 首先,要先获取父级的类名,使用 &,对应的就是 .xm-block
  $selector: &;

  // 拼接出来是 .xm-block__inner{}
  // 但编译出来的 会是  .xm-block .xm-block__inner{}
  // #{$selector + $element-sel + $el} {
  //   @content;
  // }

  // 如果不想要父级名称,只需要 .xm-block__inner{},则使用 @at-root
  @at-root {
    #{$selector + $element-sel + $el} {
      @content;
    }
  }
}

// 生成 modify 的规范类,如 .xm-block__inner--primary{}
@mixin m($mod) {
  $selector: &;

  @at-root {
    #{$selector + $modify-sel + $mod} {
      @content;
    }
  }
}

二、配置为全局使用

注意,这里直接在 App.vue 的 style 中引入是会报错的,必须在 vite.config.ts 中配置

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  // 配置 css
  css: {
    // 配置 预处理器
    preprocessorOptions: {
      // 配置 scss
      scss: {
        // 配置 附加数据
        additionalData: `@import './src/bem.scss';`,
      },
    },
  },
});

三、组件中使用

  • 普通嵌套,编译后会 加上父级前缀
  • 注意 & 的用法,直接使用不会多父级前缀,但使用 bem.scss 这里会多一层,所以 bem.scss中 使用 @at-root 跳出了嵌套
<div class="blue">
    哈哈哈
    <div class="blue-name">笑笑</div>
  </div>
  <div class="xm-test">
    B
    <div class="xm-test__inner">E</div>
    <div class="xm-test--success">M</div>
  </div>
</div>
<style lang="scss" scoped>
// blue-name 这样写编译出来的 是 .blue .blue-name {}
.blue {
  font-size: 30px;
  .blue-name {
    font-size: 40px;
  }
}

// blue-name 这样写编译出来的是 .blue-name {}
.blue {
  font-size: 30px;
  &-name {
    font-size: 40px;
  }
}

// 书写时必须保持对应的嵌套关系,否则无效
@include b(test) {
  color: red;
  font-size: 40px;
  @include e(inner) {
    color: blue;
    font-size: 30px;
  }
  @include m(success) {
    color: green;
    font-size: 16px;
  }
}
</style>

编译结果:

在这里插入图片描述

页面展示:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 BEM 规范实现简单的全局 scss 的相关文章

  • 可以将position:absolute元素设为粘性吗?

    In CSS position sticky使元素能够显示position static行为 即 它采用文档流中的默认位置 直到到达某个滚动位置 然后采用position fixed行为 那么 这是否意味着我们不能使用position st
  • 理解 z-index:该元素如何出现在其父级同级元素的前面?

    为什么当我删除时红色 div 位于绿色 div 前面z index from wrapperRed 感觉像z index是沿着链条向上继承的 如果我改变z index将绿色 div 更改为 6 即使删除第一句中描述的行后 它仍保留在红色 d
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • Sass:@use 出错,未定义变量

    我正在使用 Sass 并且想要使用 use关键字而不是 import 因为 import有很多问题 另外只有dart sass支持这个功能 我将node sass改为dart sass 然而 问题出现了 我原来的代码 import carb
  • 滚动时的 CSS 背景模糊

    我有固定的背景图像 滚动时我希望图像变得模糊 我知道如何在 css 中进行模糊 但在特定的滚动位置进行 这是一个例子 https medium com good music f160ba9e6c52 https medium com goo
  • 两列表:一列尽可能小,另一列占据其余部分

    我在 div 中有一个 to columns 表 div table tbody tr td class action a a td td class content p Bigger text variable size p td tr
  • CSS 到底如何计算相对尺寸

    我想更好地理解某些 CSS 行为 这与具体问题无关 我只是在调试网站时遇到的 让我们在固定位置的 div 中放置一个全宽图像 div img style width 100 src https via placeholder com 150
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • 如何检测一个或多个 JS/CSS 库加载失败(例如 CDN)?

    Premise 我找到了这两个答案 但我不明白如何将它系统地应用于许多库 检测并记录外部 JavaScript 或 CSS 资源加载失败的情况 https stackoverflow com questions 5683824 detect
  • IE 11 中的 CSS Display Flex 无法正常工作,图像会溢出

    我正在使用 CSSdisplay flex 以某种方式显示它们 在 Chrome 中 它看起来很完美 很漂亮 但在 IE 中 图像超出了我放置它们的元素 https jsfiddle net m42k7Lk5 8 https jsfiddl
  • 先按行再按列布局 div

    我有一个容器div and 3 div里面如下 div div 1 div div 2 div div 3 div div 不知道每一个的内容div内部 但它们的高度和宽度是可变的 集装箱的高度由最高的决定div inside 我想展示这些
  • 在表格上使用上下文样式将点边框应用于特定单元格

    我以前有过问了一个问题 https stackoverflow com questions 6326266 issue with applying dotted border to cells in table design在这个问题上 你
  • 使用 css 简单地将对象居中,无需修改

    我想使用 CSS 将对象居中 而不需要任何技巧 这可能吗 如何实现 我已经尝试过了 但是我的 p 标签消失了 centered position fixed top 50 left 50 有多种方法可以使元素居中 但这取决于您的元素是什么以
  • 将图像作为框架放置在 iframe 周围?

    我有一个网站尝试以移动格式显示 但在宽屏幕上 我确信 iframe 是正确的选择 我正在尝试将 iframe 加载到 iPhone 的图像中 你可以看一个例子here http webfro gs south tour iframe tes
  • 删除子元素上的 CSS 过滤器

    我的 CSS 代码有问题 正如您所看到的 我在 li 元素上有过滤器 但它覆盖了其他元素 我需要使其他两个元素没有过滤器 有没有可能这样做 main width 300px height 300px background color blu
  • 最大宽度调整以适应文本?

    不是最好的标题 但无论如何 我有一个元素max width和一些文字 如果文本长度超过一行所能容纳的长度 我会得到以下结果 My text here hello everyone 换句话说 它占据了完整的最大宽度 但由于单词向下移动 右侧有
  • Firefox 不会在使用 jQuery AJAX 加载的内容上呈现 CSS 样式

    我有一个网站 允许用户对书籍和文章发表评论 主表单有一个搜索输入 用于查找相关书籍或文章 来源 我使用 jQuery 根据输入的搜索词从外部站点动态加载新源 然后还使用 AJAX 返回列表中的源 我有两个问题 现在 在用户输入四个字符后 j
  • 图像背景不透明度不影响边框

    如何设置背景不透明度而不影响边框线不透明度 我找到的解决方案没有帮助 div class selected img src assets img image product 1 thumbnail jpg alt product 1 thu
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理

随机推荐

  • python flask自定义404错误页面

    在用浏览器访问url的时候 如果url不正确会报404错误 默认的404错误太枯燥了 这里我讲述一下如何将404错误页面修改为好看的404页面 1 首先 创建一个我们希望当出现404错误时展示的html页面 这里我随便写一个页面内容不多定义
  • Linux_centos7_文件与目录管理_指令与文件搜寻_(4)_(bird_bro)

    kingarthur localhost pwd home kingarthur Desktop Documents Downloads Music Pictures Public README README 1 README 2 READ
  • 漫话拥塞控制:BBRv3 来啦

    周一 2023 07 31 临近午夜刚准备睡觉 收到 bbr dev 一封邮件 贴出 IETF CCWG 大会链接 IETF117 CCWG 20230725 2200 以及 bbr3 幻灯片 BBRv3 Algorithm Bug Fix
  • android开发三大框架!Android架构师教你如何突破瓶颈,Android篇

    安卓开发大军浩浩荡荡 经过近十年的发展 Android技术优化日异月新 如今Android 11 0 已经发布 Android系统性能也已经非常流畅 可以在体验上完全媲美iOS 但是 到了各大厂商手里 改源码 自定义系统 使得Android
  • c语言 静态函数和普通函数的区别是什么,类函数和普通函数区别 成员函数和普通函数的所有区别...

    1 成员函数和普通函数的所有区别 区别很大 1 成员函数是面向对象的概念 所谓的成员函数 是指一个函数作为类的成员 公有成员 私有成员或者保护成员 2 普通函数一般有两种传递方式 按类型传递和按值传递 也就是传指针和传返回值两种情况 成员函
  • linux----使用rm -rf 删除大文件后磁盘空间并未释放的解决办法

    原文链接 linux 使用rm rf 删除大文件后磁盘空间并未释放的解决办法 1 问题 当发现linux系统中存在大文件 磁盘空间快满了后 一般会使用rm rf xxx 将大文件删除 但是删除后通过df h 发现磁盘空间并未释放 2 解决办
  • React中实现流程图(第三方库)

    React简单实现可拖拽流程图 下载第三方库 react flow yarn add react flow 准备两个文件 1 index tsx 组件入口 2 mock js 测试数据 index tsx文件代码 index js impo
  • Java 根据经纬度 角度 距离求另一个点坐标

    度换成弧度 param Float d 度 return Float 弧度 private static double rad double d return d Math PI 180 0 弧度换成度 param Float x 弧度 r
  • file_include(攻防世界)

    使用php filter 发现不行 猜测应该被过滤了 继续尝试 发现read base64 encode等关键字符被过滤了 了解到php中有两种转换器 发现string被过滤 只能使用convert了 convert 过滤器支持conver
  • Android异常:android.os.NetworkOnMainThreadException

    Android 4 1项目 使用新浪微博分享时报 android os NetworkOnMainThreadException 网上搜索后知道是因为版本问题 在4 0之后在主线程里面执行Http请求都会报这个错 也许是怕Http请求时间太
  • ReferenceError: fetch is not defined

    在使用fetch时 报错fetch is not find 根据https stackoverflow com questions 48433783 referenceerror fetch is not defined的回答 通过安装 使
  • 开源介绍

    一 什么是开源 开源 Open Source 开放源码 被非赢利软件组织 美国的Open Source Initiative协会 注册为认证标记 并对其进行了正式的定义 用于描述那些源码可以被公众使用的软件 并且此软件的使用 修改和发行也不
  • HDU - 1024 Max Sum Plus Plus(区间dp)

    区间dp 题意 在n个数里选出连续的m组数使其和最大 思路 dp i j 表示分i个组时前j个数的最大值 所以有递推方程dp i j max dp i 1 k w j dp i j 1 w j 其中k取1 2 3 j 1 把第j个数当做新的
  • 目标检测(三)损失函数

    目标检测 三 损失函数 开始 一 匹配策略 二 损失函数 三 Hard negative mining 总结 开始 内容参考 Datawhale Task03 化劲儿 损失函数设计 一 匹配策略 我们要想让其预测类别和目标框信息 我们先要知
  • 如何使用multipart/form-data格式上传文件

    有时 在网络编程过程中需要向服务器上传文件 Multipart form data是上传文件的一种方式 Multipart form data其实就是浏览器用表单上传文件的方式 最常见的情境是 在写邮件时 向邮件后添加附件 附件通常使用表单
  • Django安装操作教程

    一 环境准备 确保已安装好python和pycharm工具 二 django安装并配置环境变量 方法一 cmd中命令安装 pip install i https pypi douban com simple django 或 指定相应的dj
  • tr字符使用

    当我们把文件从Windows传到Linux环境时候 常常在每一行的末尾 会出现一些 M的字符 而这些字符会影响文件的正常读写和执行 要去掉这些 M 字符 有很多种办法 比如直接dox2unix 也可以使用一些命令去处理 比如 删除Windo
  • 406. Queue Reconstruction by Height

    class Solution public vector
  • c++学习笔记二十——派生类的构造函数,复制构造函数和析构函数

    在讲派生类的构造和析构函数时候我们先介绍类的兼容性 类的兼容性 类的兼容性是指在需要基类对象的任何地方都可以使用派生类来替代 通过继承 派生类得到了除了基类构造函数 复制函数中的所有成员 这样公有派生类实际具备了基类所有的功能 凡是基类所能
  • 基于 BEM 规范实现简单的全局 scss

    该文章是在学习 小满vue3 课程的随堂记录 示例均采用