CSS3 真的会替代 SCSS 吗


Posted in HTML / CSS onMarch 09, 2021

当谈及设置网页样式的时候,我们可以选择在项目中使用纯 CSS 或是 SCSS(除了其它处理器之外)。SCSS 是 CSS 的超集。大多数的开发者都认为,受益于高级的功能和清晰的语法,SCSS 使用起来比 CSS 更加方便。

在这篇文章中我想要带着大家一起探索 SCSS 的功能以及 CSS 这些年来在功能上的提升。此外,我还会评估是否可以在实际项目中用 CSS 替代 SCSS。

CSS 当前的功能

CSS 自诞生以来已经取得了很大的进展。近些年来 CSS 的发展也降低了在动画领域使用 JavaScript 的必要性。现代浏览器甚至使用了 GPU 去提升这些 CSS 动画的性能。我们现在甚至只需要稍微学习一下,就可以使用 CSS 构建复杂的响应式网格布局。

如今 CSS 有了许多新的功能,但本文只会重点提及一些在现代 Web 应用中常用的新功能。

  • 在任何 Web 应用的构建中,最主要的一部分就是页面的布局。我们当中的大多数人这些年都依赖于诸如 Bootstrap 这样的 CSS 框架,但 CSS 如今已经提供了 Grid(网格)、Subgrid(子网格)、Flexbox(弹性盒)等新功能去原生地构建布局。虽说 Flexbox 在开发者当中广受欢迎,但 Grid 布局也正迎头赶上。
  • 灵活的文字排版
  • Transition 和 Transform 的强大能力让我们不再需要使用 JavaScript 去制作动画
  • 自定义属性或变量

 SCSS 的功能

SCSS 支持使用变量 —— 避免冗杂的代码

我们其实可以在我们的样式表中重用一堆的颜色 color 或其他元素定义(例如字体 font )。为了做到在统一的一个地方声明这些可重用的东西,SCSS 为我们提供了变量功能,让我们能够用一个变量名表示某个颜色,并在项目的其它地方使用该变量名,而不是重写一遍颜色值。

例如下面这个例子:

$black: #000000;
$primary-font: 'Ubuntu', 'Helvetica', sans-serif;
$unit: 1rem;

body {
    color: $black;
    font-family: $primary-font;
    padding: #{$unit * 2};
}

CSS 也支持变量和自定义属性,以下就是 CSS 中的自定义属性:

--black: #000000;
--width: 800px;
--primaryFont: 'Ubuntu', 'Helvetica', sans-serif;

body {
    width: var(--width);
    color: var(--black);
    font-family: var(--primaryFont);
}

但是在运行时 CSS 自定义属性比 SCSS 变量更耗时。

这是因为浏览器会在运行时去处理这些属性。而 SCSS 则相反,它在预处理阶段会被转化为 CSS,并去处理变量。因此,SCSS 中变量的使用和代码的重用相比 CSS 而言有着更好的性能。

SCSS 允许嵌套的语法 —— 更简洁的源代码

假如有下面这样的 CSS 代码块:

.header {
    padding: 1rem;
    border-bottom: 1px solid grey;
}

.header .nav {
    list-style: none;
}

.header .nav li {
    display: inline-flex;
}

.header .nav li a {
    display: flex;
    padding: 0.5rem;
    color: red;
}

上述的代码看起来很混乱,为了给子元素添加样式,不得不重复声明同一个父元素。

但如果使用 SCSS 的嵌套语法,我们可以编写更简洁的代码。上述的代码如果用 SCSS 编写,是这样的:

.header {
    padding: 1rem;
    border-bottom: 1px solid grey;

    .nav {
        list-style: none;

        li {
            display: inline-flex;

            a {
                display: flex;
                padding: 0.5rem;
                color: red;
            }
        }
    }
}

因此,与传统的 CSS 相比,使用 SCSS 设计组件似乎更加优雅而简洁。

@extend 功能 —— 避免重复同样的样式!

在 SCSS 中,我们可以使用 @extend 在不同的选择器中共享相同的属性。带有占位符的 @extend 的使用方法如下所示:

%unstyled-list {
    list-style: none;
    margin: 0;
    padding: 0;
}

%unstyled-list 是一个可以避免重复编写代码的语法糖,我们可以在不同的地方使用这个列表样式模版,例如说:

.search-results {
    @extend %unstyled-list;
}

.advertisements {
    @extend %unstyled-list;
}

.dashboard {
    @extend %unstyled-list;
}

同样,我们可以在所有引入了这个定义的样式表中重用它。

SCSS 中还有很多例如 函数 、 混入 、 循环 的功能,能让我们的前端开发更加高效。

我应该从 SCSS 切换到 CSS 吗?

在上文中我们探索了 CSS 现有提供的功能以及 SCSS 的功能。但是,如果将 CSS 与 SCSS 进行比较,我们会发现还有一些必要的功能无法在 CSS 中使用。

  • 随着 Web 应用的不断发展,样式表会变得越发复杂和庞大。CSS 的嵌套功能将大幅度地提高代码的可读性,让我们在开发此类项目的时候得心应手。但是,截止撰写本文的时间,CSS 尚未支持该功能。
  • CSS 无法处理流控制规则。 SCSS 内置提供了诸如 @if@else@eachfor@while 的流控制规则。作为程序员,我发现这个功能对于定义样式来说是非常有用的。这也让我们可以编写更少更简洁的代码。
  • 此外,SCSS 还支持数字运算符的标准集,而在 CSS 中我们必须使用 calc() 函数才能完成数值运算。SCSS 的数值运算还能在其兼容的单位之间进行自动转换。

但是, calc() 这个 CSS 函数几乎没有限制,例如除法中除数必须是数字,或是对于乘法运算至少有一个参数是数字。

  • 另一个重要方面是样式重用,这是 SCSS 的”杀手锏“。在这个方面,SCSS 提供了许多功能,例如内置模块、映射、循环和变量。

因此我认为,即使 CSS 已经诞生了很多新功能,SCSS 仍然是更好的选择。你可以在下面的评论区中谈谈你的想法。

到此这篇关于CSS3 真的会替代 SCSS 吗的文章就介绍到这了,更多相关CSS3 会替代 SCSS 吗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

HTML / CSS 相关文章推荐
CSS3——齿轮转动关键代码
May 02 HTML / CSS
css3圆角边框和边框阴影示例
May 05 HTML / CSS
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
Nov 11 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
Jan 24 HTML / CSS
html5的websockets全双工通信详解学习示例
Feb 26 HTML / CSS
使用html5 canvas创建太空游戏的示例
May 08 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
Jun 16 HTML / CSS
html5简介_动力节点Java学院整理
Jul 07 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
Jun 01 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 HTML / CSS
CSS3 天气图标动画效果
Apr 06 HTML / CSS
HTML中的表格元素介绍
Feb 28 HTML / CSS
css3实现书本翻页效果的示例代码
Mar 08 #HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
Mar 08 #HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
Mar 05 #HTML / CSS
详解利用css3的var()实现运行时改变scss的变量值
Mar 02 #HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
Mar 01 #HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
Feb 24 #HTML / CSS
CSS3中的弹性布局em运用入门详解 1em等于多少像素
Feb 08 #HTML / CSS
You might like
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
js初始化验证实例详解
2016/11/26 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Python爬取某平台短视频的方法
2021/02/08 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
小学教师自我鉴定
2013/11/07 职场文书
电子商务应届生自我鉴定
2014/01/13 职场文书
5.1手机促销活动
2014/01/17 职场文书
食品安全责任书范本
2015/05/09 职场文书
python套接字socket通信
2022/04/01 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android