前言

本项目需要使用 SCSS 来编写页面样式。

Sass (Syntactically Awesome Stylesheets)是一个 css 预处理器,而 SCSS 是 Sass 的一种语法格式,它完全兼容 CSS,同时扩展了 CSS 的功能,使得样式编写更加高效、灵活和模块化。

对于初学者,SCSS 是完全和 CSS 兼容的,这意味着几乎为零的学习曲线。SCSS 语法即是:它只是加了一些功能的 CSS。当你和没经验的开发者一起工作时这很重要:他们可以很快开始编码而不需要首先去学习 Sass。

此外,SCSS 还是 易于阅读 的,因为它是有语义的,而不是用符号表示。当你读到 @mixin,你就会知道这是一个 mixin 声明;当你看到 @include ,你就是在引用一个 mixin。他并没有用任何缩写,当你大声读出来时所有的都很明了。

还有,现在几乎所有 Sass 的工具,插件和 demo 都是基于 SCSS 语法来开发的。随着时间过去,SCSS 会变成大家首选的选择。比如,你现在很难找到一个 Sass 缩进语法的高亮插件,通常都只有 SCSS 的可以用。

本文以编写 404 页面为例,介绍 SCSS 的使用。

关于 SCSS

SCSS 相比起 CSS 的优势

  • 模块化:通过变量、嵌套和导入(@import@use)组织样式文件。
  • 可维护性:减少重复代码,便于维护和修改。
  • 兼容性:SCSS 文件可以完全兼容 CSS 文件,允许渐进式过渡。
  • 功能强大:支持逻辑判断(@if)、循环(@for)、和函数(@function)等功能。

相关资源

SCSS 的主要功能

变量(Variables)

可以使用变量存储颜色、字体大小等值,方便复用和管理。

// SCSS
$primary-color: #3498db;
$font-size: 16px; body {
color: $primary-color;
font-size: $font-size;
}

转译后的 CSS:

body {
color: #3498db;
font-size: 16px;
}

嵌套(Nesting)

SCSS 支持嵌套语法,使样式层级结构更清晰,与 HTML 结构更接近。

// SCSS
nav {
ul {
margin: 0;
li {
display: inline-block;
a {
text-decoration: none;
color: $primary-color;
}
}
}
}

转译后的 CSS:

nav ul {
margin: 0;
}
nav ul li {
display: inline-block;
}
nav ul li a {
text-decoration: none;
color: #3498db;
}

混合(Mixins)

类似于函数,可以定义一段通用样式,并在多个地方调用。

// SCSS
@mixin flex-center {
display: flex;
justify-content: center;
align-items: center;
} .container {
@include flex-center;
height: 100vh;
}

转译后的 CSS:

.container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

继承(Inheritance)

使用 @extend 来复用已有的样式。

// SCSS
.btn {
padding: 10px 20px;
border-radius: 5px;
} .btn-primary {
@extend .btn;
background-color: $primary-color;
color: white;
}

转译后的 CSS:

.btn {
padding: 10px 20px;
border-radius: 5px;
}
.btn-primary {
padding: 10px 20px;
border-radius: 5px;
background-color: #3498db;
color: white;
}

运算(Operations)

SCSS 支持基本的数学运算,例如加减乘除。

// SCSS
$base-padding: 10px; .box {
padding: $base-padding * 2;
margin: $base-padding / 2;
}

转译后的 CSS:

.box {
padding: 20px;
margin: 5px;
}

安装

多年来 node-sass 一直是 JavaScript 社区里的主流选择,它实际上只是 libsass 在 node 环境下的一个 wrapper, 编译 sass 文件的实际工作是 libsass 完成的。

在使用 node-sass 过程中遇到的很多问题实际上也是 libsass 引发的,libsass 是用 C/C++ 实现的,常见的问题是,在安装 node-sass 的过程中经常会出现安装失败的情况,又或者切换了 Node.js 版本发现 node-sass 需要重新安装才能用,如果你在 docker 中安装 node-sass 还会遇到由于缺少各种依赖导致 node-sass build 失败的情况,又或者在国内由于网络原因导致 node-sass 需要的二进制文件下载不下来而 build 失败。

现在,sass 官方已经使用 dart-sass 作为 sass 的主要实现:

Dart Sass is the primary implementation of Sass, which means it gets new features before any other implementation. It’s fast, easy to install, and it compiles to pure JavaScript which makes it easy to integrate into modern web development workflows.

所以安装命令如下:

yarn add sass --dev
yarn add sass-loader@7.1.0 --dev

注意 Vue2 使用的 webpack 版本是 3.6.0,所以这里的 sass-loader 必须使用 7.1.0 版本

(我被 TypeError: this.getOptions is not a function 这个报错折腾了大半天才搞定)

配置

编辑 build/webpack.base.conf.js 文件下 module 里的 rules 标签,添加以下配置

{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
}

使用方法

有 Webpack 的用法

本项目是基于 Vue 的 SPA(单页应用),编写代码之后经过 webpack 打包成 HTML、CSS、JavaScript,前面的步骤也配置好了 SASS,可以直接在 .vue 文件里写 SCSS。

在页面代码 style 标签中把 lang 设置成 scss 即可。

<style scoped lang="scss">

</style>

这里我改了一下 src/views/404.vue 页面

<template>
<div class="site-wrapper site-page--not-found">
<div class="site-content__wrapper">
<div class="site-content">
<h2 class="not-found-title">404</h2>
<p class="not-found-desc">抱歉!您访问的页面<em>失联</em>啦 ...</p>
<el-button @click="$router.go(-1)">返回上一页</el-button>
<el-button type="primary" class="not-found-btn-gohome" @click="$router.push('/')">进入首页</el-button>
</div>
</div>
</div>
</template>

样式代码如下

.site-wrapper.site-page--not-found {
position: absolute;
top: 60px;
right: 0;
bottom: 0;
left: 0;
overflow: hidden; .site-content__wrapper {
padding: 0;
margin: 0;
background-color: #fff;
} .site-content {
position: fixed;
top: 15%;
left: 50%;
z-index: 2;
padding: 30px;
text-align: center;
transform: translate(-50%, 0);
} .not-found-title {
margin: 20px 0 15px;
font-size: 8em;
font-weight: 500;
color: rgb(55, 71, 79);
} .not-found-desc {
margin: 0 0 30px;
font-size: 26px;
text-transform: uppercase;
color: rgb(118, 131, 143); > em {
font-style: normal;
color: #ee8145;
}
} .not-found-btn-gohome {
margin-left: 30px;
}
}

改完之后的页面效果

不错,可以收工了~

没有 Webpack 的用法

如果想单独使用 SCSS,可以直接调用 SASS 编译:

sass styles.scss styles.css

然后在 HTML 里引入

<link rel="stylesheet" href="styles.css">

参考资料

StarBlog博客Vue前端开发笔记:(2)SASS与SCSS的更多相关文章

  1. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  2. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  3. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  4. Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转改

    Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v ...

  5. 极客Web前端开发资源大荟萃

    前端开发已经成为当前炙手可热的技术之中的一个.本周我们除了给大家带技术相关资讯,另一些技术人员经常使用的站点.希望大家不要错过我们本周的内容.原文来自:极客标签 为神马说敲代码是非常艰难的 程序猿 做 ...

  6. SpringBoot技术栈搭建个人博客【前台开发/项目总结】

    前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...

  7. 前端开发笔记(1)html基础

    HTML介绍 HTML是HyperTextMarkupLanguage超文本标记语言的缩写 HTML是标记语意的语言 编辑器 任何纯文本编辑器都能够编辑html,比如记事本,editplus,note ...

  8. web前端开发笔记(2)

    一.什么是作用域. 所有变量都存在于一个执行环境中(也称作用域),这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量.总结: 执行环境有全局执行环境和函数执行环境. 每次进入一个新执 ...

  9. web前端开发笔记(1)

     一.HTML标签书写有哪些规范? 页面编码. 文档声明. 关键字与描述. 行内元素不能包含块级元素. a标签不能嵌套a标签. 标签名和属性必须用小写字母书写,属性必须加引号,标签必须闭合,单标签页必 ...

  10. 极客Web前端开发资源大荟萃#001

    每周极客都将总结本周最精彩的素材提供给大家,希望可以带给你更多地灵感和帮助!极客#GB课程库#现已上线,无论你是初级.中级.还是正在进修的高级前端工程师.这里都将帮助你得到更多更高效的学习.原文:极客 ...

随机推荐

  1. RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验

    RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验 1.RAGflow简介 最近更新: 2024-09-13 增加知识库问答搜索模式. 20 ...

  2. QT6框架也能开发Web浏览器应用程序:QT6框架如何编译运行测试WebAssembly应用程序?

    QT6框架也能开发Web浏览器应用程序:QT6框架如何编译运行测试WebAssembly应用程序? 简介 本文将介绍如何使用QT6框架开发Web浏览器应用程序,并介绍具体的编译运行测试WebAssem ...

  3. 用PowerDesigner创建Oracle模型转为mysql模型

    一.首先打开PowerDesigner 1.File(位置:左上角)–>New Model–>Physical Date Model(物理数据模型) (1)DBMS选择MySQL5.0(版 ...

  4. Linux_动态库与静态库(其一)

    1.动态库和静态库的定义 动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾. 静态库(.a):静态库是将一组 ...

  5. OOOPS:零样本实现360度开放全景分割,已开源 | ECCV'24

    全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息.然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制.为了解决这个问题,论文定义 ...

  6. 使用 vuex 和 本地存储实现永久性token存在 并且在请求拦截统一添加headers token 避免重复代码

    在 vuex 仓库中设置state的token值:从本地中取值: 登录的时候调用唯一可以修改state数据的mutations方法设置token : export default new Vuex.S ...

  7. 蜘点云原生之 KubeSphere 落地实践过程

    作者:池晓东,蜘点商业网络服务有限公司技术总监,从事软件开发设计 10 多年,喜欢研究各类新技术,分享技术. 来源:本文由 11 月 25 日广州站 meetup 中讲师池晓东整理,整理于该活动中池老 ...

  8. 关于git的安装

    window平台下面: 步骤一: 首先去官网下载安装包: 官方链接:https://git-scm.com/download/win 至于选择32位还是64为的,各位就见仁见智了(根据自己的系统). ...

  9. C++刷题小知识点

    数据结构定义 struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int ...

  10. Rust的Reborrow机制

    最近,在使用Rust时遇到了Reborrow的概念,记录下来以备以后参考. 1. 起因 起因准备对数据进行Min-Max标准化处理,也就是将一系列数据映射到一个新的范围. 首先,需要遍历数据,找出其中 ...