面试问到SASS高级语法在项目中的应用该如何回答?仿element-ui的使用方式。

亲身经历

sass基本语法想必大家都能掌握,但本身我们的项目复杂度不够高,小型公司又没有自己的前端规范,基本上想怎么写就怎么写。导致我们长时间做一些低级的 dirty work。那些高级语法更是从未用到。

本文主旨在于例举一些较为常用语法,以及本人在项目中的使用,意在与各位初级工程师互相交流学习,大佬就请绕道吧。

BEM规范

太长不看版本:BEM就是 element-ui 所使用的css 命名规范。本文例子也是仿照element实现的相关功能。

在这里贴出一篇BEM的基本介绍文章 编写模块化CSS:BEM

在这里贴出一篇文章,关于BEM规范的常见问题已经给出了很棒的解决方案。
关于BEM规范的十个常见问题

代码示例

本文中所使用框架为 vue2 + sass

43C8CEA0-B7FC-4d20-AC60-6DCF5973ECB4.png

需求如图所示,生成一个头部导航。(抱歉只截个header,公司项目,需要小小保密)

html结构
<template>
  <header class="t-header">
    <!-- t 的含义是top,代表页面顶部header   其实就是el-header  我们写的是自己的组件,所以不需要el作为标识。-->
    <!-- 页面内其他容器可能也包含header,为了不与其他容器混淆,增加自己独有标识t -->
    <div class="t-header__container">
      <div v-for="(item) in sublist" :key="item.name" class="t-header__item">
        {{ item.name }}
      </div>
    </div>
  </header>
</template>
export default {
  name: 'Index',
  data() {
    return {
      sublist: [
        { name: '首页', path: 'home' },
        { name: '赛事引言', path: 'describe' },
        { name: '赛程安排', path: 'plan' },
        { name: '奖项设置', path: 'reward' },
        { name: '组织单位', path: 'unit' },
        { name: '联系方式', path: 'rank' },
      ],
    }
  },

sass语法 (正文开始)

设计思路:

  • 利用sass变量,提前定义命名空间和mixin文件。利用sass特性,使用传参的方式生成我们想要的class类名。
  • 在组件内部使用mixin 语法。
  • 其实颜色和背景图等变量可以在声明文件中定义。但是由于项目着实太小,且共用部分不多,于是便定义在组件内部。

定义命名空间变量

// BEM 代码块 元素 修饰符
// el-button__header 按钮模块的 头部代码
// el-button--info  按钮模块的info状态样式
// is-distable 禁用状态的代码
$namespace:'el';//修饰命名空间 本例中没有使用到
$state-prefix:'is-';// 修饰状态
$modifier-separator:'--';// 修饰类型
$element-separator:'__';// 划分空间分隔符

定义mixin

@import "./var";// 引入定义的变量

@mixin b($namespace,$block) {
  // 重新定义一个变量B,  值是b函数传入的前缀和名字
  // global 声明全局变量
  $B: $namespace+'-'+$block !global;
  // # 取表达式里面的值,放在#号的位置。编译完成就是.el-btn
  .#{$B}{
    //放入原有样式
    @content
  }
}
// 使用方法示例:真正使用时,并不会在这个文件中使用,这个文件专门生成mixin。
// include 就是调用mixin的意思。假如mixin相当于js的函数,include就是调用函数。
@include b(t, header) {
    background: #fff
}
// 会编译为
.t-header{
    background: #fff
}

-------------------------------分割线---------------------------------

// .z-button.is-dissabled
@mixin when($state) {
  // @at-root声明在根下,跳出所有父级选择器
  @at-root {
    // &将父选择器取出来,放到&符号的位置
    &.#{$state-prefix + $state}{
      @content;
    }
  }
}

// 使用方法示例:真正使用时,并不会在这个文件中使用,这个文件专门生成mixin。
@include b(t, header) {
    @include when(active) {
        color:#fff
    }
}
// 会编译为
.t-header.is-active{
    color: #fff
}
-------------------------------分割线---------------------------------


// &--primary ==> .el-button--primary
@mixin m($modifier) {
  @at-root {
    #{ & + $modifier-separator + $modifier }{
      @content;
    }
  }
}
// 使用方法示例:真正使用时,并不会在这个文件中使用,这个文件专门生成mixin。
@include b(t, header) {
    @include m(primary) {
        color:#fff
    }
}
// 会编译为
.t-header--primary{
    color: #fff
}
-------------------------------分割线---------------------------------



@mixin e($element){
  @at-root{
    &{
      #{"." + $B + $element-separator + $element}{
        @content
      }
    }
  }
}

// 使用方法示例:真正使用时,并不会在这个文件中使用,这个文件专门生成mixin。
@include b(t, header) {
    @include e(primary) {
        color:#fff
    }
}
// 会编译为
.t-header{
    .t-header__item{
        color: #fff
    }
}

header 组件中如何使用mixin来书写自己的样式?

// 将各种颜色定义在css开头,当下次定制化项目来临时,直接更改颜色和图片即可。
// 不需要在css中逐一寻找
$front-color-default: #fff;
$front-color-active: #000;
$front-color-hover: #000;
$header-bg: rgba(0, 122, 224, .7);
$header-bg-active: #fff;
$header-bg-hover: #fff;

// t-header
@include b(t, header) {
  background: $header-bg;
  font-size: 16px;
  font-weight: 700;
  height: 60px;
  line-height: 60px;
  position: fixed;
  width: 100%;
  left: 0;
  top: 0;
  z-index: 999;
  cursor: pointer;

  // t-header__container
  @include e(container) {
    float: right;
  }
  // t-header__item
  @include e(item) {
    color: $front-color-default;
    width: 150px;
    text-align: center;
    float: left;
    &:hover{
      transition: .3s;
      background: $header-bg-hover;
      color: $front-color-hover;
    }

    // 激活状态的样式 is-active
    @include when(active) {
      color: $header-bg-active;
    }
  }
}

具体可以查看我的github:https://github.com/TimmyYagami/BEM

总结:以上就是sass几种语法在项目中的应用方式啦!我只是一个在内卷中苦苦挣扎的大专生——天铭,希望和大家共同努力,只要我们足够努力,我们的老板就能早日过上自己想要的日子!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容