Vue学习记录之六(组件实战及BEM框架了解)

news2024/11/15 17:51:51

一、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>

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

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

相关文章

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

功耗中30分钟下载场景对平均电流标准的影响评估

下载场景的测试数据: 测试结论:相同场景下,有应用下载安装跟没应用下载安装,平均电流相差90-140mA左右 查看数据:下载场景的平均增量电流 (227+279) / 2 - 136 = 117 mA 理论的量化数据影响 根据当前的测试数据:静置待机平均电流 136 mA,下载场景平均电流增量 117mA, …

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

电气自动化入门05:三相异步电动机的正反转点动控制电路

视频链接&#xff1a;3.2 电工知识&#xff1a;三相异步电动机的正反转点动控制电路_1_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.断路器及其选型 1.1断路器定义、分类、表示符号 1.2.断路器功能、…

Vision Transform—用于大规模图像分类的Transformers架构

VIT — 用于大规模图像识别的 Transformer 论文题目&#xff1a;AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码&#xff1a;https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer&#xff08;ViT&…

虚拟机vaware中cpu设置跑满大核

首先&#xff0c;大核速度快&#xff0c;并且在资源紧张时大核优先&#xff0c;小核甚至是闲着围观大核跑满。其次&#xff0c;遇到经常切换操作虚拟机和win11的使用场景&#xff0c;切换核心本身也会造成一点卡顿&#xff0c;降低虚拟机里操作流畅度。另外&#xff0c;13代在你…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用&#xff0c;防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

vue part 10

vue-resource 在vue1.0时代讲的比较多&#xff0c;是vue.插件库&#xff0c; import vueResource from vue-resourceVue.use(vueResource) 在vc和vm中会多出如下F12代码即&#xff0c;$http:() 他的用法和返回值和axios一模一样&#xff0c;但是不常维护了 插槽 默认插槽 …

11年计算机考研408-数据结构

设执行了k次。 解析&#xff1a; d要第一个出&#xff0c;那么abc先入栈&#xff0c;d入栈然后再出栈&#xff0c;这前面是一个固定的流程&#xff0c;后面就很灵活了&#xff0c;可以ecba&#xff0c;ceba&#xff0c;cbea&#xff0c;cbae。 答案是4个序列。 解析&#xff1a…

解决redis缓存击穿问题之布隆过滤器

布隆过滤器 1. 什么是布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是一个空间效率很高的数据结构&#xff0c;用于判断一个元素是否在一个集合中。布隆过滤器的核心思想是利用位数组和一系列随机映射函数&#xff08;哈希函数&#xff09;来快速判断某个元素是…

基于SpringBoot+Vue+MySQL的网上租赁系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当前共享经济蓬勃发展的背景下&#xff0c;网上租赁系统作为连接租赁双方的重要平台&#xff0c;正逐步改变着人们的消费观念和生活方式。通过构建一个基于SpringBoot、Vue.js与MySQL的网上租赁系统&#xff0c;我们旨在为用户…

LangChain 和 Elasticsearch 加速构建 AI 检索代理

作者&#xff1a;来自 Elastic Joe McElroy, Aditya Tripathi, Serena Chou Elastic 和 LangChain 很高兴地宣布发布新的 LangGraph 检索代理模板&#xff0c;旨在简化需要代理使用 Elasticsearch 进行代理检索的生成式人工智能 (GenAI) 代理应用程序的开发。此模板预先配置为使…

基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask

研究背景 癌症作为全球范围内最主要的死亡原因之一&#xff0c;已成为当代医学研究和公共健康的重大挑战。据世界卫生组织&#xff08;WHO&#xff09;的统计&#xff0c;癌症每年导致全球数百万人的死亡。随着人口老龄化、环境污染和生活方式的改变&#xff0c;癌症的发病率逐…

Pytorch学习---基于经典网络架构ResNet训练花卉图像分类模型

基于经典网络架构训练图像分类模型 导包 import copy import json import time import torch from torch import nn import torch.optim as optim import torchvision import os from torchvision import transforms, models, datasets import numpy as np import matplotlib.…

【使用Hey对vllm接口压测】模型并发能力

使用Hey对vllm进行模型并发压测 docker run --rm --networkknowledge_network \registry.cn-shanghai.aliyuncs.com/zhph-server/hey:latest \-n 200 -c 200 -m POST -H "Content-Type: application/json" \-H "Authorization: xxx" \-d {"model"…

【类型黑市】指针

大家好我是#Y清墨&#xff0c;今天我要介绍的是指针。 意义 指针就是存放内存地址的变量。 分类 因为变量本身是分类型的&#xff0c;我们学过的变量类型有 int, long long, char, double, string, 甚至还有结构体变量。 同样&#xff0c;指针也分类型&#xff0c;如果指针指向…

云韧性,现代云服务不可或缺的组成部分

韧性&#xff0c;一个物理学概念&#xff0c;表示材料在变形或者破裂过程中吸收能量的能力。韧性越好&#xff0c;则发生脆性断裂的可能性越小。 如今&#xff0c;韧性也延伸到企业特质、产品特征等之中&#xff0c;用于形容企业、产品乃至服务的优劣。同样&#xff0c;随着云…

3. Internet 协议的安全性

3. Internet 协议的安全性 (1) 常用网络协议的功能、使用的端口及安全性 HTTP协议 功能:用于从服务器传输超文本到本地浏览器。端口:默认是80端口。安全性:不提供数据加密,存在数据泄露和中间人攻击风险。使用HTTPS协议(443端口)可以增强安全性。FTP协议 功能:实现文件的…

电脑录课软件哪个好用,提高教学效率?电脑微课录屏软件推荐

在当今这个数字化时代&#xff0c;教育领域也迎来了翻天覆地的变化。随着远程教学和在线学习的普及&#xff0c;教师们开始寻求更高效、更便捷的教学工具来提升教学质量和学生的学习体验。电脑录课软件&#xff0c;作为现代教育技术的重要组成部分&#xff0c;能够帮助教师轻松…