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

news2024/11/16 13:29:13

前言

  • 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>

编译结果:

在这里插入图片描述

页面展示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

驱动 day4

通过字符设备驱动分步注册方式编写LED灯的驱动&#xff0c;应用程序使用ioctl函数编写硬件控制 mycdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #inc…

【中文竞技场】大模型深度体验与测评

简介&#xff1a;本次&#xff0c;我深入体验了中文竞技场中的大语言模型&#xff0c;尝试了写作创作、代码编写和中文游戏三个领域&#xff0c;以下是我详细的评测报告。 一、开篇 在科技日新月异的今天&#xff0c;中文竞技场提供了一系列大模型供我们体验。涉及的领域包括写…

HLS实现FIR低通滤波器+System Generator仿真

硬件&#xff1a;ZYNQ7010 软件&#xff1a;MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4 1、MATLAB设计低通滤波器 FPGA系统时钟 50MHz&#xff0c;也是采样频率。用 MATLAB 生成 1MHz 和 10MHz 的正弦波叠加的信号&#xff0c;并量化为 14bit 整数。把…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面日期格式化 后端收藏ControllerServicemapper 评论ControllerServiceMapper 商品Controller 阅读Service 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除 【商品详情】 【评论】 界面实现 工具js 该工…

即拼七人拼团模式怎么玩?如何留存消费者?

如今&#xff0c;流量稀缺&#xff0c;任何流量都需要付出一定的成本&#xff0c;商家做私域亦是如此。我们能做的就是降低预算&#xff0c;探索属于自己的方法。如何进行私域引流&#xff1f; 现阶段&#xff0c;新消费品牌提升品牌力的关键就在于构建品牌与消费者之间的信任关…

大家gobigger连接后不能调亮度(亮度不能保存)解决办法

关于gobigger连接后不能调亮度&#xff0c;会不会感觉是gobigger很爽的一点&#xff1f;其实不是&#xff0c;可以通过以下方法解决。如果解决你的问题给记得点赞&#xff0c;感谢支持。 现象&#xff1a; 数据线连接后&#xff0c;用滚轮调节亮度到最高点&#xff0c;当时是很…

JavaWeb+JSP+SQL server学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

需求分析 本系统主要是针对各个高校的学生学籍进行管理&#xff0c;系统满足以下几点要求&#xff1a; 系统安全性。由于此系统中的操作都是由用户操作的&#xff0c;所以对于用户的权限设置比较严格。对于数据库&#xff0c;设置了不同用户的权限&#xff0c;不同权限进入不…

前端下载文件的几种方式使用Blob下载文件

前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求&#xff0c;一般后端会提供下载的方式有两种&#xff1a; 1.直接返回文件的网络地址&#xff08;一般用在静态文件上&#xff0c;比如图片以及各种音视频资源等&#xff09; 2.返回文件流&#xff08;…

UE5.2 LyraDemo源码阅读笔记(五)输入系统

Lyra里使用了增强输入系统&#xff0c;首先知道增强输入系统里的三个类型配置。 一、Input Actions (IA)&#xff1a; 输入操作带来的变量&#xff0c;与玩家的输入组件绑定&#xff0c;回调里驱动玩家行为。 二、InputMappingContext&#xff08;IMC&#xff09;&#xff1a…

批量删除文件名中特定文字的方法

怎么批量删除文件名中特定文字&#xff1f;作为一个上班族&#xff0c;在电脑上进行批量文件名称的修改是一个非常常见的事情。如果你有大量的图片、视频、音乐和其他文件&#xff0c;希望批量删除文件名中的特定文字&#xff0c;那么不妨看看下面的介绍&#xff0c;并尝试使用…

制定设备维护管理计划时需要考虑的不同维护策略

在现代企业运营中&#xff0c;保障关键资产的稳定运行对于实现高效生产和客户满意度至关重要。然而&#xff0c;如何制定适合企业的设备维护管理计划却是一个需要深入思考和策划的重要问题。不同类型的维护策略可以满足不同的运营需求和预算限制。在本文中&#xff0c;我们将探…

142亿亿次/秒?长安汽车与百度达成战略合作,推动智能低碳出行

8月17日&#xff0c;重庆长安汽车股份有限公司与百度正式达成战略合作协议&#xff0c;双方将在多个领域展开深度合作&#xff0c;包括云计算、人工智能、大数据和物联网。这一合作旨在推动长安汽车向智能低碳的出行科技公司转型。 据悉&#xff0c;双方还共同建立了长安汽车智…

时序数据库influxdb笔记

官方资料 https://docs.influxdata.com/influxdb/v2.7/install/?tLinux https://www.influxdata.com/influxdb/ 安装 1、linux平台下 1&#xff09;下载 2&#xff09;解压 3&#xff09;添加账户&#xff08; adduser influx&#xff09; 4&#xff09;设置目录权限 5…

NodeJs导出PDF

&#xff08;优于别人&#xff0c;并不高贵&#xff0c;真正的高贵应该是优于过去的自己。——海明威&#xff09; 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…

忘记LockSupport怎么用了?那我们举个有趣的小例子,永远记住它!

概述 LockSupport是一个非常方便实用的线程阻塞工具&#xff0c;它可以在线程内任意位置让线程阻塞。和Thread.suspend()相比&#xff0c;它弥补了由于resume()在前发生&#xff0c;导致线程无法继续执行的情况。和Object.wait()方法相比&#xff0c;它不需要先获得某个对象的…

用easyui DataGrid编辑树形资料

easyui显示编辑树形资料有TreeGrid元件&#xff0c;但是这个元件的vue版本和react版本没有分页功能。virtual scroll功能也表现不佳。 我用DataGrid来处理。要解决的问题点&#xff1a; &#xff08;1&#xff09;如何显示成树形。即&#xff0c;子节点如何有缩进。 先计算好…

精准无误的公文材料:感谢爱校对软件

在公文处理的过程中&#xff0c;无论是机构还是企业&#xff0c;我们都追求精准无误的结果。在这个信息化、智能化不断发展的时代&#xff0c;爱校对软件以其卓越的性能和优质的服务&#xff0c;赢得了大家的广泛好评。 首先&#xff0c;爱校对软件采用了最新的自然语言处理和…

深入了解msfconsole功能详解

一、前言 正如上篇文章所述&#xff0c;刚开始接触msf&#xff0c;单纯是为了分析某些漏洞&#xff0c;然后在msf中查找相应漏洞软件版本&#xff0c;系统版本的exp便于漏洞分析&#xff0c;同时进行偶尔的exp修改&#xff0c;这就是初期对于msf的使用&#xff0c;以至于我认为…