CSS预编译器
零.CSS预编译器
CSS预处理器是指对生成CSS前的某一语法的处理。CSS预处理器用一种专门的编程语言,进行Web页面样式设计,然后再编译成正常的CSS文件,供项目使用
CSS预处理器为CSS增加一些编程的特性,如增加了规则、变量、混入、选择器、继承等等特性,无需考虑游览器的兼容性问题
有助于更好地组织管理样式文件,以及更高效地开发项目
下面介绍主流的CSS预编译器三剑客:
一. CSS预编译器三剑客(Sass、Less、Stylus)
Sass:Sass包括两套语法。最开始的语法叫做"缩进语法",使用缩进来区分代码块,并且用回车将不同规则分隔开(不使用{}和;)。
而新的语法叫做“SCSS”,使用和CSS类似的块语法,使用大括号将不同的规则分开,分号将具体的样式分开。这两套语法通过.sass和.scss两个文件扩展名区分开
1.使用:
通过VSCode安装Live Sass Compiler插件等方法...
2.CSS功能扩展:
2.1:嵌套规则
Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,例如:
#main {
width: 97%; p, div {
font-size: 2em;
a { font-weight: bold; }
} pre { font-size: 3em; }
}
嵌套功能避免了重复输入父选择器,而且令复杂的 CSS 结构更易于管理,编译后:
#main {
width: 97%;
}
#main p, #main div {
font-size: 2em;
}
#main p a, #main div a {
font-weight: bold;
}
#main pre {
font-size: 3em;
}
2.2:父选择器&
在使用2.1嵌套规则时,有时也需要使用嵌套外层的父选择器,例如,给某个元素设定hover样式时
a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline; }
body.firefox & { font-weight: normal; }
} #main {
color: black;
a {
font-weight: bold;
&:hover { color: red; }
}
}
编译后:CSS 文件中&将被替换成嵌套外层的父选择器,如果含有多层嵌套,最外层的父选择器会一层一层向下传递
a {
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
body.firefox a {
font-weight: normal;
} #main {
color: black;
}
#main a {
font-weight: bold;
}
#main a:hover {
color: red;
}
2.3:属性嵌套
个别 CSS 属性遵循相同的命名空间 (namespace),比如 font-family, font-size, font-weight
都以 font
作为属性的命名空间。
为了便于管理这样的属性,同时也为了避免了重复输入,Sass 允许将属性嵌套在命名空间中,例如:
.funky {
font: {
family: fantasy;
size: 30em;
weight: bold;
}
}
编译为:
.funky {
font-family: fantasy;
font-size: 30em;
font-weight: bold;
}
2.4:变量$
Sass最普遍的用法就是变量,以$开头,复制与css属性写法一样,直接调用即可
$width: 100px #main {
width: $width;
}
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用
(全局变量)
将局部变量转换为全局变量可以添加 !global
声明:
#main {
$width: 5em !global;//局部变量转全局变量
width: $width;
} #sidebar {
width: $width;
}
编译为:
#main {
width: 5em;
} #sidebar {
width: 5em;
}
2.5:运算
所有数据类型均支持 == 或 != ,此外,每种数据类型也有各自支持的运算方式
目前感觉这个运算用处不大,但今后遇到某个项目也可能会用到
2.6:@-Rules与指令
2.6.1:Sass 拓展了 @import
的功能,允许其导入 SCSS 或 Sass 文件,被导入的文件将合并编译到同一个 CSS 文件中,
另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。
@import "foo.scss"; @import "foo";
都会导入文件foo.scss
如果需要导入SCSS或者Sass文件,但不希望编译成CSS文件,在文件名前添加下划线即可
例如,将文件命名为 _colors.scss,便不会编译成_colors.css 文件。
2.6.2:Sass 中 @media 指令与 CSS 中用法一样,只是增加了一点额外的功能:允许其在 CSS 规则中嵌套
如果 @media 嵌套在 CSS 规则内,编译时, @media 将被编译到文件的最外层,包含嵌套的父选择器
这个功能让 @media 用起来更方便,不需要重复使用选择器,也不会打乱 CSS 的书写流程
@media 可以使用 Sass(比如变量,函数,以及运算符)代替条件的名称或者值:
.sidebar {
width: 300px;
@media screen and (orientation: landscape) {
width: 500px;
}
}
编译为:
.sidebar {
width: 300px;
}
@media screen and (orientation: landscape) {
.sidebar {
width: 500px;
}
}
2.6.3:@extend ,告诉 Sass 将一个选择器下的所有样式继承给另一个选择器。
.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
2.7:Mixin
Mixin用于定义可重复使用的样式,避免了使用无语意的 class,比如.float-left
混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式
混合样式中也可以包含其他混合样式
2.7.1:定义Mixin
@mixin large-text {
font: {
family: Arial;
size: 20px;
weight: bold;
}
color: #ff0000;
&:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
}
2.7.2:引用Mixin
.page-title {
@include large-text;
padding: 4px;
margin-top: 10px;
}
编译为:
.page-title {
font-family: Arial;
font-size: 20px;
font-weight: bold;
color: #ff0000;
padding: 4px;
margin-top: 10px;
}
2.7.3:Mixin参数
@mixin sexy-border($color, $width:10px) { //默认值
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue, 1in); }
编译后
p {
border-color: blue;
border-width: 1in;
border-style: dashed;
}
@Mixin 可以用 =
表示,而 @include
可以用 +
表示
2.8:函数
$grid-width: 40px;
$gutter-width: 10px; @function grid-width($n) {
@return $n * $grid-width + ($n - 1) * $gutter-width;
} #sidebar { width: grid-width(5); }
#sidebar {width: 240px; } //编译结果
Less:Less是一门向后兼容的CSS扩展语言,语法上和Sass有很大的共性,它受Sass的影响,但对后来引入的SCSS格式有影响
Stylus:在 stylus 中同样可以使用变量、函数、判断、循环一系列 CSS 没有的东西来编写样式文件,使用时需要Node.js
基本使用:
$background-color = lightblue
add (a, b = a)
a = unit(a, px)
b = unit(b, px)
a + b .list-item
.text-box
span
background-color: $background-color
margin: add(10)
padding: add(10, 5)
&:hover
background-color: powderblue
编译后
.list-item span,
.text-box span {
background-color: #add8e6;
margin: 20px;
padding: 15px
}
.list-item:hover,
.text-box:hover {
background-color: #b0e0e6;
}
PostCSS:一个用 JavaScript 工具和插件转换 CSS 代码的工具
特点:
- 增加代码的可读性:可自动添加属性前缀
- 可使用最新的CSS语法,如变量定义
- 可模块化CSS,
CSS Modules
- 可检查CSS语法错误,避免出错
- 强大的格子系统LostGrid
二.异同点
Less与Sass的异同:
异:
- 混入(Mixins)——class中的class
- 参数混入——可以传递参数的class,就像函数一样
- 嵌套规则——Class中嵌套class,从而减少重复的代码
- 运算——CSS中用上数学
- 颜色功能——可以编辑颜色
- 名字空间(namespace)——分组样式,从而可以被调用
- 作用域——局部修改样式
- JavaScript 赋值——在CSS中使用JavaScript表达式赋值
同:
- Less是基于JavaScript,是在客户端处理的;Sass是基于Ruby(一种简单快捷的面向对象的脚本语言),是在服务器端处理的
- 关于变量在Less和Sass中的唯一区别就是Less用@,Sass用$
- 输出设置,Less没有输出设置,Sass提供4中输出选项:nested, compact, compressed 和 expanded
- Sass支持条件语句,可以使用if{}else{},for{}循环等等,而Less不支持
三.总结
为CSS增加一些编程的特性,如规则、变量、混入、选择器、继承等等特性,上手都很简单
(CSS的调试,需要编译,文件过大都是预处理器的缺点)
参考:
CSS预编译器的更多相关文章
- 在 CSS 预编译器之后:PostCSS
提到css预编译器(css preprocessor),你可能想到Sass.Less以及Stylus.而本文要介绍的PostCSS,正是一个这样的工具:css预编译器可以做到的事,它同样可以做到. “ ...
- CSS预编译器配置-------LESS Sass Stylus webstorm
预编译器配置说明 开头语,发挥CSS预处器的作用是一种很有挑战性的事情.CSS预处器有不同的语言,就有不同的语法和功能. 语法 在使用CSS预处器之前最重要的是对语法的理解,幸运的是,这三种CSS预处 ...
- css预编译器——Less的使用
方法一:仅介绍在客户端环境下使用的方法 1 新建test.less并引入.less该文件(和css一样在head处引入),注意rel="stylesheet/less": &l ...
- CSS预编译器:Sass(入门),更快的前端开发
SASs是由美国注册会计师协会(AICPA)下属审计准则委员会(ASB)发布,是为了便于注册会计师执行和落实一般公认审计准则(GAAS). Sass 扩展了 CSS3,增加了规则.变量.混入.选择器. ...
- CSS预编译器less简单用法
1.变量 定义变量 @变量名:值; @test_width:100px; 使用变量 .box{ width:@test_width; height:@test_width; background-co ...
- CSS预编译器:Sass(进阶),更快的前端开发
1.@if @if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块 在 Sass 中除了 @if 之,还 ...
- stylus(css预编译器)
推荐去张鑫旭大神这里详细了解:http://www.zhangxinxu.com/jq/stylus/ 安装 npm install -g stylus 自动编译 $ stylus -w demo.s ...
- 前端学习笔记系列一:6 一种新的css预编译器stylus
stylus是 CSS 的预处理框架.CSS 预处理,顾名思义,预先处理 CSS.那 stylus 咋预先处理呢?stylus 给 CSS 添加了可编程的特性,也就是说,在 stylus 中可以使用变 ...
- CSS预编译与PostCSS以及Webpack构建CSS综合方案
CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...
随机推荐
- Struts2框架提供的结果类型?
已配置结果类型名 类 名 描 述 dispatcher org.apache.struts2.dispatcher.ServletDispatcherResult 默认结果类型,用来呈现JSP页面 c ...
- 为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动 的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联 集合对象时,可以根据对象关系模型直接获取,所以它是全自动的.而 Mybatis 在查询关联对象或关联集 ...
- elasticsearch 是如何实现 master 选举的 ?
面试官:想了解 ES 集群的底层原理,不再只关注业务层面了. 前置前提: 1.只有候选主节点(master:true)的节点才能成为主节点. 2.最小主节点数(min_master_nodes)的目的 ...
- 用maven建立一个工程5
在命令行里面输入cd myapp再按回车 再输入mvn compile再按回车 再输入 cd target按回车 再输入cd../按回车 再输入mvn package按回车 最后输入java -cla ...
- 学习HTML5 history API
html5 在 history 对象上添加几个新的方法.事件.属性,用以增强开发者对于浏览器历史记录的控制.大体上说,新的API可以帮助我们在无刷新的情况下改变浏览器的url,新增或者替换之前的历史记 ...
- css两栏布局、圣杯布局、双飞翼布局
最近几个月一直用vue在写手机端的项目,主要写业务逻辑,在js方面投入的时间和精力也比较多.这两天写页面明显感觉css布局方面的知识有不足,所以复习一下布局方法. 两栏布局 1.浮动 .box1 .l ...
- testview属性之详解
安卓开发当中TextView是最常用的组件之一了,那么现在就来详细的了解下TextView的属性: Android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示 ...
- ES6-11学习笔记--Promise
Promise是ES6异步编程解决方案之一,简化以前ajax的嵌套地狱,增加代码可读性. 基本用法: resolve,成功 reject,失败 let p = new Promise((resol ...
- javaweb图书管理系统之不同用户跳转不同页面
关于分级自测题,我们知道该系统一共分为两个角色,一个是读者,一个是管理员,我们需要根据不同用户去到不同的页面,所以我们需要写一个登陆界面. 本文先写这个功能的实现,该功能主要在servlet里面实现. ...
- String和int、long、double等基本数据类型的转换
学习目标: 掌握Java的基本数据类型与String的转换 学习内容: 1.转化规则 String 转 基本数据类型 基本数据类型 变量 = 包装类.Parse基本数据类型(String); // c ...