css-preprocessors
what ?
预处理器是css 能够使用 变量、操作符、函数、mixins、interpolations 等类似于js 功能的一种语言。
目前比较常用是三种:SASS、less 、stylus 。
Why ?
css 是古老的、不完整的。(哪天要是CSS 自己支持这些,就不用这些啦!)创建函数、重复使用一个变量、继承,css 都是不支持的。对一些大型的、复杂的项目,维护是一个非常困难的事情。(一直重构真的不是好选择)
为了更好地书写css,css作出的努力有:将声明定义到一个个单独的文件中,然后在主文件中import 他们。
这种方式可以处理组件化的问题,但是无法解决代码复用和后期维护的问题。
又出现了另一个方法:面向对象CSS编程(OOCSS),在OOCSS 中,对一个元素声明一个或多个class名称。每种class名称生成一种样式,这样增加了class 的复用性,但是也增加了维护成本。(划分为颗粒级别的class)
预处理器可以在CSS中实现 可复用性、可维护性、和可扩展性。通过使用预处理器,你可以提高工作效率,减少项目的代码工作。
新的功能
和其他编程语言一样,预处理器有很多不同的语法,但都不是很分离的。所有的预处理器都支持原生css风格,并且她们的语法也和原生的css 一样。sass 和 stylus 都一些额外的样式。sass支持省略大括号和分号。(省略以后不好看,而且还不好维护)在stylus中你还可以省略冒号。这些功能在sass 和stylus 中都是可选的。
变量
- sass
$
$font-size: 16px;
div {
font-size: $font-size;
}
- less
@
@font-size: 16px;
div {
font-size: @font-size;
}
- stylus
=
font-size = 16px;
div
font-size: font-size
- css
div {
font-size: 16px;
}
嵌套 (最喜欢的功能点之一)
css 在子选择器中缺乏明显的继承关系。你必须另起一行,写父子选择器的关系。嵌套提供了一种类似于HTML的可视化的继承关系,增加了可读性。在一些情况下,嵌套扩展了属性的范围,形成了类似于“选择器链”的东西,它是非常智能的。
- sass
less 、stylus 都是一样的
$link-color: #999;
$link-hover: #229ed3;
ul {
margin: 0;
li {
float: left;
}
a {
color: $link-color;
}
}
- css
ul { margin: 0; }
ul li { float: left; }
ul a { color: #999; }
ul a:hover { color: #229ed3; }
Mixins(混合)
混合是根据一些参数或静态规则编译生成的一系列定义。利用他们,你可以非常容易的写出跨浏览器的渐变背景色 、CSS箭头等。
(感觉类似于函数)
- sass
@mixin bordered($width) {
border: $width solid #ddd;
$: hover {
border-color: #999;
}
}
h1 {
@include bordered(5px);
}
- less
.bordered (@width) {
border: @width solid #ddd;
&:hover {
border-color: #999;
}
}
h1 {
.bordered(5px);
}
- stylus
bordered(w)
border: n solid #ddd
&:hover
border-color: #999
h1
bordered(5px)
- css
h1 { border: 5px solid #ddd; }
h1:hover { border-color: #999; }
扩展
sass将会扩展extend 的选择器的每一个实例,包括它的子选择器和继承属性。在less 中,你可以通过加上“all”属性来扩展选择器的每个实例,或者你也可以只选择主要的实例。Extends也是链式的。
颜色操作
略,感觉不会去用。
If/Else 声明
- sass
@if lightness($color) > 30% {
background-color: black;
}
@else {
background-color: white;
}
- less
.mixin (@color) when (lightness(@color) > 30%) {
background-color: black;
}
.mixin (@color) when (lightness(@color) =<; 30%) {
background-color: white;
}
- stylus
完全跟js 的写法一样
if lightness(color) > 30%
background-color black
else
background-color white
循环
- sass
@for $i from 1px to 3px {
.border-#{i} {
border: $i solid blue;
}
}
- less
.loop(@counter) when (@counter > 0){
.loop((@counter - 1));
.border-@{counter} {
border: 1px * @counter solid blue;
}
}
- stylus
for num in (1..3)
.border-{num}
border 1px * num solid blue
函数
三种都是一样的
1cm * 1em => 1 cm * em
2in * 3in => 6in
(1cm / 1em) * 4em => 4cm
2in + 3cm + 2pc => 5.181in
3in / 2in => 1.5in
Imports
都是一样的 @
(这个原生的css 就支持了)
结论
这里的三种CSS预处理器都或多或少有相似的特性。根据你的代码习惯选择一种吧。
参考文献:
https://htmlmag.com/article/an-introduction-to-css-preprocessors-sass-less-stylus
css-preprocessors的更多相关文章
- [AngularJS + Webpack] Requiring CSS & Preprocessors
Making your CSS modular is a difficult thing to do, but using Webpack makes this so much easier. By ...
- 开始编写CSS
本文由大漠根据Krasimir Tsonev的<Starting to Write CSS>所译,整个译文带有我们自己的理解与思想,如果译得不好或不对之处还请同行朋友指点.如需转载此译文, ...
- CSS Questions:Front-end Developer Interview Questions
Describe what a "reset" CSS file does and how it's useful. What Is A CSS Reset? A CSS Rese ...
- CSS 预处理器中的循环
本文由 nzbin 翻译,黄利民 校稿.未经许可,禁止转载! 英文出处:css-tricks.com 发表地址:http://web.jobbole.com/91016/ 如果你看过老的科幻电影,你一 ...
- 【转】Facebook React 和 Web Components(Polymer)对比优势和劣势
原文转自:http://segmentfault.com/blog/nightire/1190000000753400 译者前言 这是一篇来自 StackOverflow 的问答,提问的人认为 Rea ...
- Awesome Go
A curated list of awesome Go frameworks, libraries and software. Inspired by awesome-python. Contrib ...
- dfsdf
This project was bootstrapped with Create React App. Below you will find some information on how to ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】
缘起 哈喽大家好,兜兜转转终于来到了Vue实战环节,前边的 6 篇关于Vue基础文章我刚刚简单看了看,感觉写的还是不行呀,不是很系统,所以大家可能看上去比较累,还是得抽时间去润润色,修改修改语句和样式 ...
- 基于vue cli 3.0创建前端项目并安装cube-ui
前提条件: 安装node.js. 国内的开发者最好先配置淘宝镜像. 之后用cnpm来代替npm命令. 项目创建过程: 打开cmd,输入命令进入目标工作空间,以本机项目为例: cd /d d: cd D ...
- vue cli 3.0创建项目
.npm i -g @vue/cli .vue create my-project 此处有两个选择: 1.default (babel, eslint)默认套餐,提供babel和eslint支持 2. ...
随机推荐
- ARM有几条memory barrier 的指令?分别有什么区别?
从ARMv7指令集开始,ARM提供3条内存屏障指令. (1)数据存储屏障( Data Memory Barrier,DMB) 数据存储器隔离.DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕 ...
- Flutter在Windows平台下的安装配置
目录 1. 安装 Flutter SDK2. 设置环境变量3. Flutter doctor4. 安装 Android Studio5. 启动 Android Studio, 安装 Android S ...
- Spring boot 直接访问templates中html文件
application.properties 在浏览器中输入http://localhost:8080/index.html 会报一个 因为Spring boot 无法直接访问templates下的文 ...
- hubilder打包+C#服务端个推服务实现
关于推送鼓捣了好长时间,这里不再写helloworld了,只讲里面遇到的问题. 1.关于苹果开发者平台上的注册 网上很多的教程,只要按照步骤来设置就行了,在 iOS证书(.p12)和描述文件(.mob ...
- Nginx服务器的图片防盗链
全站的防盗链方法 在/usr/local/webserver/nginx/conf//vhost/xxxx.conf文件要添加防盗链的server段里添加下面的代码: location ~ .*\.( ...
- 深入探究JFreeChart
1 简介 JFreeChart 是 SourceForge.net 上的一个开源项目,它的源码和 API 都可以免费获得. JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三维 ) , ...
- vue实例详解
Vue实例的构造函数 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的 虽然没有完全遵循 MVVM 模式, Vue 的设计无疑受到了它的启发.因此在文档中经常会使用 ...
- GUI_菜单练习
package com.mywindow.test; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...
- Android平台调用Web Service:线程返回值
接上文 前文中的遗留问题 对于Java多线程的理解,我曾经只局限于实现Runnable接口或者继承Thread类.然后重写run()方法.最后start()调用就算完事,可是一旦涉及死锁以及对共享资源 ...
- js中return,return true,return false三者的用法及区别
return其实就是return undefined; 1.语法及返回方式 ①返回控制与函数结果 语法为:return 表达式; 语句结果函数的执行,返回调用函数,而且把表达式的值作为函数结果返回出去 ...