Less简介
Less是一门向后兼容的CSS扩展语言。
变量
@width: 10px;
@height: @width + 10px;
#header {
width: @width;
height: @height;
}
等价为
#header {
width: 10px;
height: 20px;
}
混合
是将一组属性从一个规则集包含到另一个规则集的方法。
.bordered {
border-top: dotted 1px black;
border-bottom: solid 2px black;
}
如果希望在其他规则集中使用这些属性
#menu a {
color: #111;
.bordered();
}
.post a {
color: red;
.bordered();
}
嵌套(重要)
Less提供了使用嵌套代替层叠或与层叠结合使用的能力。
#header {
color: black;
}
#header .navigation {
font-size: 12px;
}
#header .logo {
width: 300px;
}
//可以写为
#header {
color: black;
.navigation {
font-size: 12px;
}
.logo {
width: 300px;
}
}
用Less书写代码更加简洁,并且模仿了html的组织结构。
还可以使用此方法将伪选择器于混合一同使用,下面是一个经典的clearfix技巧重写为一个混合
(&表示当前选择器的父级)
.clearfix {
display: block;
zoom: 1;
&:after {
content: " ";
display: block;
font-size: 0;
height: 0;
clear: both;
visibility: hidden;
}
}
@规则嵌套和冒泡
@规则(例如@media或@supports)可以与选择器以相同的方式进行嵌套,@规则会被放在前面,同一规则集中的其他元素的相对顺序保持不变。这叫做冒泡
.component {
width: 300px;
@media (min-width: 768px) {
width: 600px;
@media (min-resolution: 192dpi) {
background-image: url(/img/retina2x.png);
}
}
@media (min-width: 1280px) {
width: 800px;
}
}
//编译为
.component {
width: 300px;
}
@media (min-width: 768px) {
.component {
width: 600px;
}
}
@media (min-width: 768px) and (min-resolution: 192dpi) {
.component {
background-image: url(/img/retina2x.png);
}
}
@media (min-width: 1280px) {
.component {
width: 800px;
}
}
运算
算术运算符+,-,*,/可以对任何数字,颜色或变量进行运算。如果可能的话,算术运算符在加,减或比较之前会进行单位换算。计算的结果以最左侧操作数的单位类型为准。如果 单位换算无效或失去意义,则忽略单位。无效的单位换算例如:px到cm或rad到%的转换。
// 所有操作数被转换成相同的单位
@conversion-1: 5cm + 10mm; // 结果是 6cm
@conversion-2: 2 - 3cm - 5mm; // 结果是 -1.5cm
// conversion is impossible
@incompatible-units: 2 + 5px - 3cm; // 结果是 4px
// example with variables
@base: 5%;
@filler: @base * 2; // 结果是 10%
@other: @base + @filler; // 结果是 15%
还可以对颜色进行算术运算
@color: #224488 / 2; //结果是 #112244
background-color: #112244 + #111; // 结果是 #223355
命名空间和访问符
(不要和CSS@namespace或namespace selectors混淆了)
有时,出于组织结构或仅仅是为了提供一些封装的目的,希望对混合(mixins)进行分组。可以用Less更加直观地实现这一需求。假设希望将一些混合(mixins)和变量置于#bundle之下,为了以后方便重用或分发:
#bundle() {
.button {
display: block;
border: 1px solid black;
background-color: grey;
&:hover {
background-color: white;
}
}
.tab { ... }
.citation { ... }
}
如果希望把.button类混合到#header a中
#header a {
color: orange;
#bundle.button(); // 还可以书写为 #bundle > .button 形式
}
映射
从Less3.5版本开始,还可以将混合(mixins)和规则集(rulesets)作为一组值的映射(map)使用。
#colors() {
primary: blue;
secondary: green;
}
.button {
color: #colors[primary];
border: 1px solid #colors[secondary];
}
输出符合预期
.button {
color: blue;
border: 1px solid green;
}
作用域
Less中的作用域与CSS中的作用域非常类似。首先在本地查找变量和混合(mixins),如果找不到,则从“父”级作用域继承
@var: red;
#page {
@var: white;
#header {
color: @var; // white
}
}
与CSS自定义属性一样,混合(mixin)和变量的定义不必引用之前事先定义。因此,下面的Less代码示例和上面的代码示例是相同的:
@var: red;
#page {
#header {
color: @var; // white
}
@var: white;
}
Sass简介
Css无法像其他编程语言一样的嵌套,继承,设置变量,为了解决css的不足,开发者们想到了编写一种对css进行预处理的“中间语言”,可以实现一些“编程”语言才有的功能,然后自动编译成css供浏览识别。
变量
变量声明
sass使用$符号来标识变量
$highlight-color: #F90;
这时变量还没有生效,除非你引用这个变量
变量可以在css规则块定义之外存在。当变量定义在css规则块内,那么该变量只能在此规则块内使用。如果它们出现在任何形式的{…}块中,情况也是如此
$nav-color: #F90;
nav {
$width: 100px;
width: $width;
color: $nav-color;
}
//编译后
nav {
width: 100px;
color: #F90;
}
变量引用
凡是css属性的标准值可存在的地方,变量就可以使用。css生成时,变量会被它们的值所代替。之后,如果你需要一个不同的值,只需要改变这个变量的值,则所有引用此变量的地方生成的值都会改变。
$highlight-color: #F90;
.selected {
border: 1px solid $highlight-color;
}
//编译后
.selected {
border: 1px solid #F90;
}
嵌套CSS规则
#content {
article {
h1 { color: #333 }
p { margin-bottom: 1.4em }
}
aside { background-color: #EEE }
}
/* 编译后 */
#content article h1 { color: #333 }
#content article p { margin-bottom: 1.4em }
#content aside { background-color: #EEE }
父选择器的标识符&
如果使用hover这种伪类时,并不希望以后代选择器的方式连接。比如下面这种情况sass就无法正常工作。
article a {
color: blue;
:hover { color: red }
}
这意味着color:red这条规则将会被应用到选择器article a :hover,article元素内链接的所有子元素在被hover时都会变成红色。这是不正确的!
sass的父选择器,在使用嵌套规则是,父选择器能对于嵌套规则如何解开提供更好的控制,就是一个简单的&符号,且可以放在任何一个选择器可出现的地方,比如h1放在那,他就可以放在哪
article a {
color: blue;
&:hover { color: red }
}
当包含父选择器标识符的嵌套规则被打开时,他不会像后代选择器那样进行拼接,而是&被父选择器直接替换
article a { color: blue }
article a:hover { color: red }
群组选择器
css的写法会让你再群组选择器中的每一个选择器前都重复一遍容器元素的选择器
.container h1, .container h2, .container h3 { margin-bottom: .8em }
sass可以这样写
.container {
h1, h2, h3 {margin-bottom: .8em}
}
子组合选择器和同层组合选择器:>,+和~。
article section { margin: 5px }
article > section { border: 1px solid #ccc }
可以用子组合选择器>选择一个元素的直接子元素。上例中,第一个选择器会选择article下的所有命中section选择器的元素。第二个选择器只会选择article下紧跟着的子元素中命中section选择器的元素。
下例中,可以使用同层相邻选择器+选择header元素后紧跟的p元素
header + p { font-size: 1.1em }
也可以使用同层全体组合选择器~,选择所有跟在article后的同层article元素,不管它们之间间隔了多少其他元素
article ~ article { border-top: 1px dashed #ccc }
这些组合选择器可以毫不费力地应用到sass的规模嵌套中。可以把它们放在外层选择器后边,或里层选择器前边:
article {
~ article { border-top: 1px dashed #ccc }
> section { background: #eee }
dl > {
dt { color: #333 }
dd { color: #555 }
}
nav + & { margin-top: 0 }
}
sass会编译成如下文件
article ~ article { border-top: 1px dashed #ccc }
article > footer { background: #eee }
article dl > dt { color: #333 }
article dl > dd { color: #555 }
nav + article { margin-top: 0 }
嵌套属性
除了选择器,属性也可以进行嵌套。比如border-style border-width border-color
在sass中
nav {
border: {
style: solid;
width: 1px;
color: #ccc;
}
}
//sass会解析成
nav {
border-style: solid;
border-width: 1px;
border-color: #ccc;
}
对于属性的缩写形式,甚至也可以嵌套,指明例外规则
nav {
border: 1px solid #ccc {
left: 0px;
right: 0px;
}
}