Css预编语言及区别详解


Posted in HTML / CSS onApril 25, 2021

一、是什么

Css预编语言及区别详解

Css 作为一门标记性语言,语法相对简单,对使用者的要求较低,但同时也带来一些问题

需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 Css 编写经验而很难写出组织良好且易于维护的  Css 代码

Css 预处理器便是针对上述问题的解决方案

预处理语言

扩充了 Css 语言,增加了诸如变量、混合(mixin)、函数等功能,让  Css 更易维护、方便

本质上,预处理是 Css 的超集

包含一套自定义的语法及一个解析器,根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 Css 文件

二、有哪些

Css 预编译语言在前端里面有三大优秀的预编处理器,分别是:

  • sass
  • less
  • stylus

sass

2007 年诞生,最早也是最成熟的 Css 预处理器,拥有 Ruby 社区的支持和  Compass 这一最强大的  Css 框架,目前受  LESS 影响,已经进化到了全面兼容  Css 的  Scss

文件后缀名为 .sass 与 scss ,可以严格按照 sass 的缩进方式省去大括号和分号

less

2009年出现,受 SASS 的影响较大,但又使用  Css 的语法,让大部分开发者和设计师更容易上手,在  Ruby 社区之外支持者远超过  SASS

其缺点是比起 SASS 来,可编程功能不够,不过优点是简单和兼容  Css ,反过来也影响了  SASS 演变到了 Scss 的时代

stylus

Stylus 是一个 Css 的预处理框架,2010 年产生,来自  Node.js 社区,主要用来给  Node 项目进行  Css 预处理支持

所以 Stylus 是一种新型语言,可以创建健壮的、动态的、富有表现力的 Css 。比较年轻,其本质上做的事情与 SASS/LESS 等类似

三、区别

虽然各种预处理器功能强大,但使用最多的,还是以下特性:

  • 变量(variables)
  • 作用域(scope)
  • 代码混合( mixins)
  • 嵌套(nested rules)
  • 代码模块化(Modules)

因此,下面就展开这些方面的区别

基本使用

less和scss

.box {
  display: block;
}

sass
 

.box
  display: block

stylus

.box
  display: block

嵌套

三者的嵌套语法都是一致的,甚至连引用父级选择器的标记 & 也相同

区别只是 Sass 和 Stylus 可以用没有大括号的方式书写

less

.a {
  &.b {
    color: red;
  }
}

变量

变量无疑为 Css 增加了一种有效的复用方式,减少了原来在 Css 中无法避免的重复「硬编码」

less 声明的变量必须以 @ 开头,后面紧跟变量名和变量值,而且变量名和变量值需要使用冒号 : 分隔开

@red: #c00;

strong {
  color: @red;
}

sass 声明的变量跟 less 十分的相似,只是变量名前面使用 @ 开头

$red: #c00;

strong {
  color: $red;
}

stylus 声明的变量没有任何的限定,可以使用 $ 开头,结尾的分号 ; 可有可无,但变量与变量值之间需要使用 =

在 stylus 中我们不建议使用 @ 符号开头声明变量

red = #c00

strong
  color: red

作用域

Css 预编译器把变量赋予作用域,也就是存在生命周期。就像  js 一样,它会先从局部作用域查找变量,依次向上级作用域查找

sass 中不存在全局变量

$color: black;
.scoped {
  $bg: blue;
  $color: white;
  color: $color;
  background-color:$bg;
}
.unscoped {
  color:$color;
}

编译后

.scoped {
  color:white;/*是白色*/
  background-color:blue;
}
.unscoped {
  color:white;/*白色(无全局变量概念)*/
}

所以,在 sass 中最好不要定义相同的变量名

less 与 stylus 的作用域跟 javascript 十分的相似,首先会查找局部定义的变量,如果没有找到,会像冒泡一样,一级一级往下查找,直到根为止

@color: black;
.scoped {
  @bg: blue;
  @color: white;
  color: @color;
  background-color:@bg;
}
.unscoped {
  color:@color;
}

编译后:

.scoped {
  color:white;/*白色(调用了局部变量)*/
  background-color:blue;
}
.unscoped {
  color:black;/*黑色(调用了全局变量)*/
}

混入

混入(mixin)应该说是预处理器最精髓的功能之一了,简单点来说, Mixins 可以将一部分样式抽出,作为单独定义的模块,被很多选择器重复使用

可以在 Mixins 中定义变量或者默认参数

在 less 中,混合的用法是指将定义好的 ClassA 中引入另一个已经定义的 Class ,也能够传递参数,参数变量为 @ 声明

.alert {
  font-weight: 700;
}

.highlight(@color: red) {
  font-size: 1.2em;
  color: @color;
}

.heads-up {
  .alert;
  .highlight(red);
}

编译后

.alert {
  font-weight: 700;
}
.heads-up {
  font-weight: 700;
  font-size: 1.2em;
  color: red;
}

Sass 声明 mixins 时需要使用 @mixinn ,后面紧跟 mixin 的名,也可以设置参数,参数名为变量 $ 声明的形式

@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
}

.page-title {
  @include large-text;
  padding: 4px;
  margin-top: 10px;
}

stylus 中的混合和前两款 Css 预处理器语言的混合略有不同,他可以不使用任何符号,就是直接声明 Mixins 名,然后在定义参数和默认值之间用等号(=)来连接

error(borderWidth= 2px) {
  border: borderWidth solid #F00;
  color: #F00;
}
.generic-error {
  padding: 20px;
  margin: 4px;
  error(); /* 调用error mixins */
}
.login-error {
  left: 12px;
  position: absolute;
  top: 20px;
  error(5px); /* 调用error mixins,并将参数$borderWidth的值指定为5px */
}

代码模块化

模块化就是将 Css 代码分成一个个模块

scss 、 less 、 stylus 三者的使用方法都如下所示

@import './common';
@import './github-markdown';
@import './mixin';
@import './variables';

参考文献

https://mp.weixin.qq.com/s/HUEnnJKJDTp8Vlvu2NfUzA

到此这篇关于Css预编语言及区别详解的文章就介绍到这了,更多相关Css预编语言内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS3 Columns分列式布局方法简介
May 03 HTML / CSS
css3中新增的样式使用示例附效果图
Aug 19 HTML / CSS
css3实现画半圆弧线的示例代码
Nov 06 HTML / CSS
浅谈css3中的渐进增强和优雅降级
Dec 01 HTML / CSS
css3动画 小球滚动 js控制动画暂停
Nov 29 HTML / CSS
html5 sessionStorage会话存储_动力节点Java学院整理
Jul 06 HTML / CSS
HTML5实现QQ聊天气泡效果
Jun 26 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
Jun 21 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
Mar 15 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
Dec 06 HTML / CSS
奇妙的 CSS shapes(CSS图形)
Apr 05 HTML / CSS
CSS link与@import的区别和用法解析
May 07 HTML / CSS
用position:sticky完美解决小程序吸顶问题的实现方法
Apr 24 #HTML / CSS
position:sticky 粘性定位的几种巧妙应用详解
六种css3实现的边框过渡效果
Apr 22 #HTML / CSS
HTML+CSS+JS实现图片的瀑布流布局的示例代码
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
CSS预处理框架——Stylus
Apr 21 #HTML / CSS
You might like
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php读取远程gzip压缩网页的方法
2014/12/29 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
Python二分查找详解
2015/09/13 Python
python实现八大排序算法(1)
2017/09/14 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
国培计划培训感言
2014/03/11 职场文书
校企合作协议书
2014/04/16 职场文书
和谐社区口号
2014/06/19 职场文书
学用政策心得体会
2014/09/10 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
优秀高中学生评语
2014/12/30 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers