如何写出高质量的scss、less...

BEM(Block Element Modifier)是一种CSS命名规范,旨在解决命名冲突和提高代码可读性,适用于组件化开发。通过块、元素和修饰符的划分,实现清晰的代码结构。在SCSS中,可以利用混入(mixin)和&符号简化代码,如创建日历组件的样式。此外,文章展示了如何通过mixin创建通用的字体样式混合,以减少重复代码。
摘要由CSDN通过智能技术生成

scss + BEM

BEM 解决了什么问题

  • 语义化的标签易于阅读,更优雅。
  • 解决了命名冲突
  • 适合组件化开发、协同开发

概念

Bem 是块(block)、元素(element)、修饰符(modifier)的简写,由 Yandex 团队提出的一种前端 CSS, 命名方法论。class名可以获得更多的描述和更加清晰的结构;使代码易于阅读理解,方便协同开发

  • Block块:代表的是包裹我的容器。可理解为组件最外层元素
  • Element元素:代表的是我是谁 ,组件的后代元素
  • Modifier修饰符:代表的是我处于什么状态。

命名规则

  • -中弧线连接单词,可以是块元素也可以是子元素
  • __ 双下划线 连接块与块的子元素 (其实单下划线也是可以的,但由于命名习惯中单下划线有时候也作为单词连接符,造成混淆,所以使用双下划线更为稳妥)
  • – 双中划线 描述一个块或者块的子元素的一种状态
  • is is-关键字结合使用时,指示模块特定的状态类;一般用于js控制样式时,css命名用is-开头 例如 is-open、is-disabled
  1. 如果你想写个日历组件?
    .calendar
  2. 如果你想在日历组件中加个按钮?
    .calendar__btn
  3. 如果想在按钮上加个主要状态?
    .calendar__btn--main

查看element-ui 中BEM 定义

/* BEM
 -------------------------- */
@mixin b($block) {
    
  $B: $namespace+'-'+$block !global;

  .#{$B} {
    @content;
  }
}


@mixin e($element) {
  $E: $element !global;
  $selector: &;
  $currentSelector: "";
  @each $unit in $element {
    $currentSelector: #{$currentSelector + "." + $B + $element-separator + $unit + ","};
  }

  @if hitAllSpecialNestRule($selector) {
    @at-root {
      #{$selector} {
        #{$currentSelector} {
          @content;
        }
      }
    }
  } @else {
    @at-root {
      #{$currentSelector} {
        @content;
      }
    }
  }
}

@mixin m($modifier) {
  $selector: &;
  $currentSelector: "";
  @each $unit in $modifier {
    $currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","};
  }

  @at-root {
    #{$currentSelector} {
      @content;
    }
  }
}

解析BEM

$namespace = 'my'
//编译前
@include b(calendar) {
  border-radius: 4px;

  @include e(footer) {
    //传入单个
    padding: 20px;
  }

  @include m(primary) {
    background: #409eff;
  }
}

//编译后
.my-calendar {
  border-radius: 4px;
}

.my-calendar__footer {
  padding: 20px;
}

.my-calendar--primary {
  background: #409eff;
}

由此可以理解BEM 是按照指定的规则去拼接元素,达到统一代码分格,简便代码的作用

如何简化scss 代码

使用& 符号简化

  1. 源代码
.my-calendar {
  border-radius: 4px;
}

.my-calendar__footer {
  padding: 20px;
}

.my-calendar--primary {
  background: #409eff;
}
  1. 简化后的代码(&)
.my-calendar {
  border-radius: 4px;
  	&__footer {
  		padding: 20px;
	}
	&--primary {
  		background: #409eff;
	}
}

使用mixin 简化代码

需求:根据UI,大量文案每行文案都不同

  1. 源代码
.my-calendar__title {
	font-size: 18px
	font-weight: 500
	color: red
	line-height: 18px
}

.my-calendar__content {
	font-size: 20px
	font-weight: 400
	color: red
	line-height: 20px
}
.my-calendar__footer {
	font-size: 30px
	font-weight: 400
	color: blue
	line-height: 20px
}
  1. 简化后代码

@mixin fontStyle($s, $w, $c, $lh) {
  font-size: $s
  font-weight: $w
  color: $c
  line-height: $lh
}
.my-calendar__title {
	@include fontStyle(18px, 500, red, 18px)
}

.my-calendar__content {
	@include fontStyle(20px, 400, red, 20px)
}
.my-calendar__footer {
	@include fontStyle(30px, 400, blue, 20px)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜丶陌颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值