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

这篇具有很好参考价值的文章主要介绍了基于 BEM 规范实现简单的全局 scss。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 该文章是在学习 小满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>

编译结果:

基于 BEM 规范实现简单的全局 scss,CSS,Vue3,scss,BEM,Vue3,vite

页面展示:

基于 BEM 规范实现简单的全局 scss,CSS,Vue3,scss,BEM,Vue3,vite文章来源地址https://www.toymoban.com/news/detail-660833.html

到了这里,关于基于 BEM 规范实现简单的全局 scss的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于 Vue3 和 WebSocket 实现的简单网页聊天应用

    一个基于Vue3和WebSocket的简易网络聊天室项目,包括服务端和客户端部分。 项目地址 websocket-chat 下面是项目的主要组成部分和功能: 项目结构 功能特性 私聊功能:用户可以选择联系人进行一对一私聊,发送即时消息。 群聊功能:用户可以加入群组,与群组成员进行群聊。

    2024年02月03日
    浏览(55)
  • 记录--Vue3基于Grid布局简单实现一个瀑布流组件

    在学习Grid布局之时,我发现其是CSS中的一种强大的布局方案,它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,在刷某书和某宝首页时,我们发现其展示方式就是一种瀑布流,是一种流行的网站页面布局,视觉表现为参差不齐的多栏布局,随着页

    2024年02月05日
    浏览(66)
  • Vue项目自动注入less、sass、scss、stylus全局变量

    一、Vue2项目 官方文档:CSS 相关 | Vue CLI 二、Vue3项目 2024-4-9

    2024年04月15日
    浏览(58)
  • Vue3中引入scss

    2024年02月11日
    浏览(51)
  • vue3 一个基于pinia简单易懂的系统权限管理实现方案,vue-router动态路由异步问题解决

    作为项目经验稀少的vue开发者来说,在关键技术点上的经验不多,我希望通过我的思想和实践,把好的东西分享在这里,目的是进一步促进技术交流。项目即将完成,权限是最后的收尾工作,好的权限实现方案,可以让我们没有后顾之忧,也可以提升项目的运行速度。 在开发

    2023年04月08日
    浏览(57)
  • vue3和vite项目在scss中因为本地图片,不用加~

    看了很多文章说要加~,真的好坑哦,我的加了~反而出不来了: 304 Not Modified 所以需要去掉~: 直接引入就好:

    2024年01月25日
    浏览(59)
  • 【VUE】ElementPlus之动态主题色调切换(Vue3 + Element Plus+Scss + Pinia)

    关于ElementPlus的基础主题色自定义可以参阅《【VUE】ElementPlus之自定义主题样式和命名空间》 有了上面基础的了解,我们知道 ElementPlus 的主题色调是基于 CSS3变量 特性进行全局控制的, 那么接下来我们也基于 CSS3变量 来实现主题色调的 动态切换 效果; 主要控制的色调类型有

    2024年02月08日
    浏览(42)
  • Vue3+Vite+TS项目集成ESlint +Prettier实现代码规范检查和代码格式化

    我在这里直接是通过vite提供的默认模板来创建一个vue3 + ts的项目。这里可以cmd,然后npm -v来查看版本。 这样一个vue3 + ts的项目就创建好了,使用vscode打开该项目,然后执行 yarn 安装依赖 依赖安装完成后,执行   yarn dev  启动项目就可以在浏览器中正常访问了。   初始化

    2024年01月24日
    浏览(89)
  • Vue3+Vite+Pinia+Naive项目搭建之二:scss 的安装和使用

    前言 如果对 vue3 的语法不熟悉的,可以移步 Vue3.0 基础入门,快速入门。 github 开源库:Vue3-Vite-Pinia-Naive-Js gitee   开源库:Vue3-Vite-Pinia-Naive-Js 1. 安装依赖  2. 新增 src/assets/style/reset.scss 页面样式初始化 3. 新增 src/assets/style/common.scss 共用样式 4. 新增 src/assets/style/utils.scss 工

    2024年02月12日
    浏览(57)
  • Vue项目如何配置、切换主题颜色(mixin + scss方式,简单高效)

    但图多 基本样式: 红色主题: 蓝色主题: 看到这里,是不是有人已经开始安耐不住了 ?😏 一. 首先,引入scss依赖(node-sass, sass-loader) 二.项目样式文件目录介绍 1.此处我将项目中的公共样式文件放到了 src/style目录下,其中 index.scss是以供全局使用的一些基本样式,在main

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包