组件库的封装之旅(入门scss)

简介: 这几天在封装组件库,今天和大家一起使用scss,学习一些scss的基础语法。先来看一下scss的优势SCSS (Sass) 有以下几个主要优势:- 可维护性:SCSS 允许使用变量、嵌套、混合、继承等特性,从而使样式表变得更加清晰、可读性增强。- 更高效:SCSS 允许使用函数、循环等高级特性,使得样式定义更加高效。- 更易扩展:SCSS 提供了组件化和模块化的技巧,可以更方便地扩展和维护代码。- 更简单:SCSS 的语法比 CSS 更简洁易懂,允许编写更加简洁的样式表。- 兼容性:SCSS 可以完全兼容 CSS,可以无缝地使用再来看一下scss和其他对比| | S

这几天在封装组件库,今天和大家一起使用scss,学习一些scss的基础语法。

先来看一下scss的优势

SCSS (Sass) 有以下几个主要优势:

  • 可维护性:SCSS 允许使用变量、嵌套、混合、继承等特性,从而使样式表变得更加清晰、可读性增强。
  • 更高效:SCSS 允许使用函数、循环等高级特性,使得样式定义更加高效。
  • 更易扩展:SCSS 提供了组件化和模块化的技巧,可以更方便地扩展和维护代码。
  • 更简单:SCSS 的语法比 CSS 更简洁易懂,允许编写更加简洁的样式表。
  • 兼容性:SCSS 可以完全兼容 CSS,可以无缝地使用

再来看一下scss和其他对比

Scss/Less Atomic CSS css-in-js
完全支持样式覆盖 需要使用className支持
支持rem布局 大部分库支持
可读性 稍弱
上手成本 较低
是否支持SSR 天然支持 天然支持 需要额外支持
是否支持流式渲染 天然支持 天然支持 需要额外支持
支持postcss 有自己的插件生态

看到scss这么多优势,接下来就让我们开启一段scss学习之旅吧!!!!

对原生css的支持

首先scss完全兼容css,可以使用css3在内的所有css语法进行书写

变量

scss中可以定义变量。常使用 $变量名:值 的形式来定义变量。并且支持变量的运算。

看下下面的例子

<style scoped lang="scss">
    $Len:100px;
    .class_A {
        width: $Len;
        height: 0.6 * $Len;
        
    }
</style>

效果如下:

image.png

更优雅的scss写法

scss中的层级更清晰,更优雅,代码的可读性更高

看下面这个例子

.contain ul {
    border:1px solid black;
    list-style:none;
}

.contain ul:after {
    display:block;
    clear:both;
}

.contain ul li {
    float:left;
}

.contain ul li > a {
    display:inline-block;
    padding:6px 12px;
}

上面的css是一个列表横向排布的例子,但是如果用scss重构

就会是下面的样子

/*scss*/
.contain ul {
    border:1px solid black;
    list-style:none;
    
    li {
        float:left;
    }
    
    li>a {
        display:inline-block;
        padding:6px 12px;
    }
}

.contain ul:after {
    display:block;
    content:"";
    clear:both;
}

&的作用

在scss中,我们可以使用&来选择当前元素的父元素

请看下面的代码

<template>
<div class="class_A">

</div>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss">
$Len:100px;
.class_A {
  width: $Len;
  height: 0.6 * $Len;
  background-color: #646cff;
  &:hover {
    background-color: darkorange;
  }
}
</style>

我们定义了一个div,然后类名是class_A,我们为class_A添加鼠标移动过后颜色改变的特效时,可以通过&来直接选中他。

鼠标移动前后如下

image.png

image.png

结合这些,我们可以对原生css的组合选择器进行简化书写,具体大家可以思考一下。

比如这样

div >{ 
    a {
        color: red;
    }
}

函数式编写scss

scss提供了函数式编写的方案,想象一下下面的场景,我们需要定义三个方块,分别是红色,蓝色,和黄色,大小并不相同,同时每个方块鼠标移过后都会有一个暗淡的效果,我们应该如何去书写呢?

先来看一下原生的css

<template>
  <div class="class_A">

  </div>
  <div class="class_B">

  </div>
  <div class="class_C">

  </div>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss">
.class_A {
  margin: 10px;
  width: 100px;
  height: 60px;
  background-color: red;
}
.class_A:hover {
  opacity: 0.6;
  transition: all 0.6s;
}

.class_B {
  margin: 10px;
  width: 80px;
  height: 48px;
  background-color: blue;
}
.class_B:hover {
  opacity: 0.6;
  transition: all 0.6s;
}

.class_C {
  margin: 10px;
  width: 60px;
  height: 36px;
  background-color: yellow;
}
.class_C:hover {
  opacity: 0.6;
  transition: all 0.6s;
}
</style>

三种方块不同大小,颜色,同时鼠标移动会有一个特效

image.png

接下来让我们用scss做一个重构

在此之前让我们来先介绍一下scss函数的用法

我们通过@mixin声明一个函数,然后通过@include来使用

@mixin fun($w) {
      // 定义了一个函数fun,接受一个参数
}

好了,我们正式开始重构我们的代码

<template>
  <div class="class_A">

  </div>
  <div class="class_B">

  </div>
  <div class="class_C">

  </div>
</template>

<script setup lang="ts"></script>

<style scoped lang="scss">
@mixin fun($w,$h,$bg) {
  margin: 10px;
  width: $w;
  height: $h;
  background-color: $bg;
  &:hover {
    opacity: 0.6;
    transition: all 0.6s;
  }
}
.class_A {
  @include fun(100px,60px,red);
}
.class_B {
  @include fun(80px,48px,blue);
}
.class_C {
  @include fun(60px,36px,yellow);
}
</style>

同样的效果,更少的代码,更优雅的写法,更简洁的代码风格,更高的可读性和可维护性。

image.png

而在很多耦合度更高的情况下,这种写法能更大的提升代码的可维护性和可读性。

@each , @if , @else if , @else的学习

在@each变量的定义,其中包含的每个项目的列表中的值。

而其他的三个很明显是流程判断的指令,话不多说,我们继续使用上面的代码重构我们的需求。

先分析下我们的class,有A,B,C三种不同的状态。所以我们开始操作,请相信我这是最后一遍重构了。

<template>
  <div class="class_A">

  </div>
  <div class="class_B">

  </div>
  <div class="class_C">

  </div>
</template>

<script setup lang="ts"></script>

<style lang="scss">
@mixin fun($w,$h,$bg) {
  margin: 10px;
  width: $w;
  height: $h;
  background-color: $bg;
  &:hover {
    opacity: 0.6;
    transition: all 0.6s;
  }
}
@each $state in  A , B , C  {
  .class_#{$state} {
    @if(#{$state} == A) {
      @include fun(100px,60px,red);
    }
    @else if(#{$state} == B) {
      @include fun(80px,48px,blue);
    }
    @else {
      @include fun(60px,36px,yellow);
    }
  }
}
</style>

好耶,还是一样的。不过代码高级,优雅了太多啦。

image.png

面向对象

最后再说说scss中的继承的问题,我们可以向面向对象一样去继承。

我们通过@extend来继承一个类,这个类可以是css中的class,也可以是我们定义的基类。

基类的定义:

%base-class {
    //...
}

然后我们可以定义一个类来继承这个基类

.class_1 {
    @extend %base-class;
    // 也可以再写点,或者改基类的一些属性
}

我们甚至可以再定义一个类去继承class_1,这也是完全可以的。


.class_1--child {
    @extend .class_1;
    // 继续写点也行,改点基类属性也行
}

最后

入门scss之后,我们以后就正式开始组件的封装了。

相关文章
|
前端开发 JavaScript
Vue中使用纯CSS实现全屏网格加渐变色背景布局
Vue中使用纯CSS实现全屏网格加渐变色背景布局
488 0
|
域名解析 网络协议 测试技术
[插件使用] SwitchHosts自动更新Github Hosts文件
[插件使用] SwitchHosts自动更新Github Hosts文件
3495 0
|
Windows
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
2460 0
windows 技术篇 - uispy 工具获取和使用,windows窗口属性快捷查看工具
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
element el-table 设置fixed导致行错乱问题
文章讨论了在使用Element UI的`el-table`组件时,设置固定列(`fixed`)导致行错乱的问题,并提供了解决方案。问题产生的原因是当表格底部有滚动条而固定列底部没有滚动条时,行无法对齐。解决办法是在表格中设置`padding-bottom`的内边距与滚动条高度相等,确保固定列和非固定列的行能够对齐。
3867 0
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
907 155
|
JavaScript 测试技术 持续交付
在vue中封装第三方组件的标准
在Vue.js项目中,第三方组件库虽能提升开发效率与用户体验,但直接使用可能导致代码结构混乱和样式冲突。为此,本文介绍如何优雅封装第三方组件,包括封装的目的、准备步骤、具体实现方法及处理样式冲突的策略。通过创建专门的封装组件、设计简洁的接口以及有效地管理样式,不仅能统一应用风格,还能显著提高代码的可维护性和可复用性。此外,还提供了封装Element UI Button组件的具体示例,帮助开发者更好地理解封装流程。
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
295 0
|
前端开发 JavaScript 搜索推荐
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
307 1
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
|
存储 SQL 数据库
influxdb 连续查询使用总结
influxdb 连续查询使用总结
769 0