Vue学习记录之六(组件实战及BEM框架了解)
一、BEM
BEM是一种前端开发中常用的命名约定,主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。
- Block(块):独立的功能性页面组件,可以是一个简单的按钮,一个复杂的导航条,或者任何其他独立的UI部分。块的名称是唯一的,且通常是名词,比如menu、button等。
- Element(元素):块的组成部分,具体表现为块内部的某个部分。元素的命名是在块的名称后加上两个下划线__,然后是元素的名称,比如menu__item、button__icon等。
- Modifier(修饰符):用于定义块或元素的不同状态或外观。修饰符的命名是在块或元素的名称后加上两个破折号–,然后是修饰符的名称,比如button–large、menu__item–active等。
通过这种命名方式,可以使代码具有更好的可读性和可维护性,并且不同组件之间不会发生命名冲突。例如:
<div class="menu"><ul class="menu__list"><li class="menu__item menu__item--active">Home</li><li class="menu__item">About</li></ul>
</div>
在这个例子中:
menu 是块(Block),表示一个菜单。
menu__list 是元素(Element),表示菜单中的列表。
menu__item 是元素(Element),表示列表项。
menu__item - - active 是修饰符(Modifier),表示列表项的活动状态。
使用BEM的好处包括:
可读性强:通过明确的命名规则,代码变得更加容易理解。
可维护性高:模块化的结构使得代码更容易维护和更新。
避免命名冲突:由于每个类名都包含了块的名称,避免了全局命名空间的冲突。
二、sass
(Syntactically Awesome Style Sheets)是CSS的扩展,提供了更强大的功能。使用的时候先进行安装。
pnpm i sass
1、变量: 定义变量使用 $变量名
$primary-color: #3498db;
2、嵌套:
.nav {ul {list-style: none;}li {display: inline-block;}
}
3、混合(Mixins): 使用@mixin
定义和使用混合宏
定义混合宏(mixin):使用 @mixin 指令来定义一组样式。
包含混合宏(mixin):使用 @include 指令来将这些样式应用到某个选择器中。
@mixin border-radius($radius) {border-radius: $radius;
}
.box {@include border-radius(10px);
}
4、继承(Extend):
.button {padding: 10px;background: $primary-color;
}.primary-button {@extend .button;color: white;
}
5、运算:
.container {width: 100% - 20px;
}
6、条件语句:
@if $theme == dark {background: black;
} @else {background: white;
}
7、循环:
@for $i from 1 to 3 {.item-#{$i} {width: 100px * $i;}
}
8、插值语法
用于动态生成类名、ID或其他属性值,通常通过#{$variable}的方式实现。以下是一些插值语法的常见用法:
//动态生成类名
$color: red;
.text-#{$color} {color: $color;
}
这段代码生成的类名是 .text-red。
--------------------------------------
//动态生成属性值
$size: 16px;
.box {width: #{$size * 2};
}
这段代码生成的样式为 width: 32px;。
---------------------------------------
//与其他字符串结合
$prefix: "btn-";
.#{$prefix}primary {background-color: blue;
}
这段代码生成的类名是 .btn-primary。
-------------------------------------------
// 在选择器中使用插值
$state: "active";
.button-#{$state} {color: green;
}
这段代码生成的类名是 .button-active。
这些语法使得Sass更加灵活,易于管理和维护样式表。 @content 相当于一个占位符,也可以理解为slot(插槽)
- #{} 用于插入任何类型的值(如属性、选择器名等),不特定于类。
- .#{} 主要用于生成类选择器,确保插入的内容以.开头,形成有效的类选择器。
所以,如果你需要插入的内容是类名,就使用.#{};如果是属性名或者其他类型的选择器,则直接使用#{}。
三、使用
1、在src 目录下建立一个bem.scss 文件。
$namespcae: 'xm' !default;
$block-sel:"-" !default;
$elem-sel:"__" !default;
$mod-sel:"--" !default;//1、定义block
@mixin b($block){//如 class="xm-block" 即: .xm-block{}$B: #{$namespcae + $block-sel + $block};//命名完了以后,我们初始化下.#{$B}{//相当于占位符或者插槽@content;}
}
//2、定义element 如 .xm-block__inner{} 类型的。
@mixin e($e){$selector: &; //&符号读取到父级的类名(它代表父选择器),即: .xm-block/*#{$selector + $elem-sel + $e}{@content;}*///但是我们一般希望编译出去不要在增加这么一个父级的类型//如 .xm-block .xm-block__inner{},这里需要跳出嵌套,// 使用 @at-root进行包裹,然后就变成了独立的.xm-block__inner{}。@at-root{#{$selector + $elem-sel + $e}{@content;}}
}
//3、modify
@mixin m($m){$selector: &; @at-root{#{$selector + $mod-sel + $m}{@content;}}
}
2、写完规则,要在全局使用,还需要进行配置。 在vite.config.ts 中进行配置。
css:{preprocessorOptions:{scss:{additionalData:`@import "./src/deom.scss";`}}}
3、配置完了以后就可以使用了。在App.vue中使用
注意 结构,以块为单位,块内的元素,和修饰符要写在自己的块内。
<template><div><div class="xm-test">我是块<div class="xm-test__inner">我是元素</div><div class="xm-test--success">我是修饰符</div></div></div>
</template>
<script setup lang='ts'>
import A from './components/A.vue';
</script>
<style lang="scss">
@include b(test){color: red;@include e(inner){color: green;}@include m(success){color: orangered;}
}
</style>
如果不使用@at-root包裹,那么编译以后就会变成下面的格式:
四、实战
一、使用vite+vue3 构成程序框架。
二、清除默认样式
在根目录下的index.html中加入
<style>*{padding: 0;margin: 0;}html,body{height: 100%;overflow: hidden;}
在我们的scss文件中在加入一个混合项:bfc
$namespcae: 'xm' !default;
$block-sel:"-" !default;
$elem-sel:"__" !default;
$mod-sel:"--" !default;@mixin bfc{height: 100%;overflow: hidden;
}@mixin b($block){$B: #{$namespcae + $block-sel + $block};.#{$B}{@content;}
}
@mixin e($e){$selector: &; @at-root{#{$selector + $elem-sel + $e}{@content;}}
}
@mixin m($m){$selector: &; @at-root{#{$selector + $mod-sel + $m}{@content;}}
}
然后app.vue 的style中加入:
<style lang="scss">#app{@include bfc;}
</style>
新增目录结构
Layout/index.vue 代码如下:
<template><div class="xm-box"><div><Menu></Menu></div><div class="xm-box__right"><Header></Header><Content></Content></div></div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
import Menu from './Menu/index.vue'
import Header from './Header/index.vue'
import Content from './Content/index.vue'
</script>
<style scoped lang="scss">
@include b(box){@include bfc;display: flex;@include e(right){display: flex; //默认的是一行排列flex-direction: column; //纵向排列flex: 1 //左右拉满,也就是100%显示}
}
</style>
Layout/Content/index.vue 代码如下:
<template><div class="xm-content"><div class="xm-content__items" v-for="item in 100">{{ item }}</div></div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
</script>
<style scoped lang="scss">
@include b(content){flex: 1; //向下也拉满了overflow: auto; //自适应高度@include e(items){padding: 10px;margin: 10px;border: 1px solid #ccc;border-radius: 4px;}
}
</style>
Layout/Header/index.vue 代码如下:
<template><div class="xm-header">Header</div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
</script>
<style scoped lang="scss">
@include b(header){height:50px;border-bottom: 1px solid #ccc;
}
</style>
Layout/Menu/index.vue 代码如下:
<template><div class="xm-menu">Menu</div>
</template>
<script setup lang='ts'>
import { ref,reactive } from 'vue'
</script>
<style scoped lang="scss">
@include b(menu){height: 100%;min-width: 200px;border-right: 1px solid #ccc;
}
</style>
相关文章:

Vue学习记录之六(组件实战及BEM框架了解)
一、BEM BEM是一种前端开发中常用的命名约定,主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block(块):独立的功能性页面组件,可以是一个简单的按钮,一个复杂的导航条&…...

为什么会出现电话机器人?语音电话机器人的出现起到了什么作用?
电话机器人的出现是科技发展与市场需求相结合的产物,它们的广泛应用反映了现代社会对效率、成本和服务质量的不断追求。以下是电话机器人出现的几个主要原因。 1. 市场需求的变化 随着经济的发展和消费模式的转变,客户对服务的期望不断提高。他们希望能…...

【CSS Tricks】深入聊聊前端编写css的方法论
目录 引言BEM 规范OOCSS 规范结构与样式分离容器与内容分离 SMACSS 规范ITCSS 规范设置层工具层通用层元素层对象层组件层微调层由此分层后的项目代码结构也会相应做修改,主要有两种形式:文件夹形式文件名形式引用方式按照层级顺序引用 ACSS 规范总结 引…...

多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测(Matlab)
多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测 目录 多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 …...

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)
前言 学习可以不局限于传统的书籍和课堂,各种生活的元素也都可以做为我们的学习对象,本文将利用 VSCode 页面上的各种英文元素来做英语的积累,如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的,借此做英语积累再合适不过&a…...
Java高级Day50-连接池
132.数据库连接池 传统获取Connection问题分析 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码。需要数据库连接的时候,就向数据库请求一个&a…...
软件设计-开闭原则
开闭原则是一种重要的设计思想,它为软件系统的可扩展性和可维护性提供了有力的支持。 一、开闭原则的原理 开闭原则(Open-Closed Principle, OCP)是指软件实体(类、模块、函数等)应当对扩展开放,对修改关…...
Angular面试题八
一、请解释Angular中的AOT编译是什么,并简述其优势。 Angular中的AOT编译,全称为Ahead-of-Time(预先编译),是一种在构建过程中将Angular应用程序的模板和组件编译成本地机器代码(通常是JavaScript代码&…...
【Kubernetes】常见面试题汇总(三十六)
目录 88. Pod 启动失败如何解决以及常见的原因有哪些? 89.简述 K8s 中 label 的几种应用场景。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题…...

深入解析SGD、Momentum与Nesterov:优化算法的对比与应用
目录 1. 梯度下降算法2. BGD、SGD、MBGD3. momentum与dampening3.1 另一种形式的momentum3.1.1 学习率固定3.1.2 学习率不固定 4. nesterov4.1 PyTorch中的Nesterov4.2 Polyak与Nesterov的比较 Ref 1. 梯度下降算法 先考虑一元情形。假设待更新的参数为 θ \theta θ…...

Vue2实现主内容滚动到指定位置时,侧边导航栏也跟随选中变化
需求背景: PC端项目需要实现一个有侧边导航栏,可点击跳转至对应内容区域,类似锚点导航, 同时主内容区域上下滚动时,可实现左侧导航栏选中样式能实时跟随变动的效果。 了解了一下,Element Plus 组件库 和 …...

dev containers plugins for vscode构建虚拟开发环境
0. 需求说明 自用笔记本构建一套开发环境,用docker 虚拟插件 dev containers,实现开发环境的构建,我想构建一套LLMs的环境,由于环境配置太多,不想污染本地环境,所以选择隔离技术 1. 环境准备 vscodedocker 2. 步骤…...

C++ | Leetcode C++题解之第433题最小基因变化
题目: 题解: class Solution { public:int minMutation(string start, string end, vector<string>& bank) {int m start.size();int n bank.size();vector<vector<int>> adj(n);int endIndex -1;for (int i 0; i < n; i)…...

Qt窗口——QMenuBar
文章目录 QMenuBar示例演示给菜单栏设置快捷键给菜单项设置快捷键添加子菜单添加分割线添加图标 QMenuBar Qt中采用QMenuBar来创建菜单栏,一个主窗口,只允许有一个菜单栏,位于主窗口的顶部、主窗口标题栏下面;一个菜单栏里面有多…...
python网站创建001:内容概览
内容概览: 1. Python环境搭建(Python解释器、Pycharm、环境变量等) 2. 基础语法(条件、循环、输入输出、编码等) 3. 数据类型型(整型、布尔型、字符串、列表、字典、元组、集合等) 4. 函数&…...
代码随想录第22天|
class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index s.size() - 1; // 饼干数组的下标int result 0;for (int i g.size() - 1; i > 0; i--) { // 遍历…...
WPF-基础-02 DispatcherObject类
public abstract class DispatcherObject {protected DispatcherObject();public Dispatcher Dispatcher { get; }public bool CheckAccess();public void VerifyAccess(); }WPF中使用Dispatcher更新界面 xaml<Grid><TextBlock x:Name"tbkShow" Horizontal…...

STM32与51单片机的区别:是否应该直接学习STM32?
STM32与51单片机的区别:是否应该直接学习STM32? 在单片机的世界里,STM32和51单片机都是非常重要的角色。对于初学者来说,是否可以直接跳过51单片机,直接学习STM32,这个问题一直存在争议。让我们深入探讨这…...
【网络底层原理】I/O多路复用技术select、poll和epoll详解与比较
引言 在现代网络编程中,I/O多路复用技术是实现高性能服务器的关键。本文将详细介绍select、poll和epoll这三种技术,并比较它们的工作原理、优势与限制。 1. select 工作原理 select技术使用三个集合(读、写、异常)来跟踪需要监…...

【JavaScript】LeetCode:51-55
文章目录 51 验证二叉搜索树52 二叉搜索树中第k小的元素53 二叉树的右视图54 二叉树展开为链表55 从前序与中序遍历序列构造二叉树 51 验证二叉搜索树 递归对二叉搜索树进行中序遍历,输出节点的值是单调递增的。方法1:对二叉树进行中序遍历,将…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...