CSS现状及LESS的作用
CSS(层叠样式表)是一门历史悠久的标记性语言,同 HTML 一道,被广泛应用于万维网(World Wide Web)中。HTML 主要负责文档结构的定义,CSS 负责文档表现形式或样式的定义。
作为一门标记性语言,CSS 的语法相对简单,对使用者的要求较低,但同时也带来一些问题:
CSS 需要书写大量看似没有逻辑的代码,不方便维护及扩展,不利于复用,尤其对于非前端开发工程师来讲,往往会因为缺少 CSS 编写经验而很难写出组织良好且易于维护的 CSS 代码,造成这些困难的很大原因源于 CSS 是一门非程序式语言,没有变量、函数、SCOPE(作用域)等概念。
LESS 为 Web 开发者带来了福音,它在 CSS 的语法基础之上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了 CSS 的编写,并且降低了 CSS 的维护成本,就像它的名称所说的那样,LESS 可以让我们用更少的代码做更多的事情。
LESS 原理及使用方式
本质上,LESS 包含一套自定义的语法及一个解析器,可以根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的CSS 文件。LESS 并没有裁剪CSS 原有的特性,更不是用来取代CSS 的,而是在现有CSS 语法的基础上,为CSS 加入程序式语言的特性。
编译工具
** 方法一:Node.js库 安装node.js进入中文官网http://nodejs.cn/**
安装成功后打开终端输入命令
node -v
输出版本号则安装成功,输入命令 npm install less -g
安装less,新建一个less文件(demo.less),使用cd命令跳转至less文件所在文件夹,输入命令lessc demo.less
在终端中会输出编译后的css格式的样式,输入lessc demo.less > demo.css
命令执行后会自动生成对应的css文件(demo.css)如下图所示:
//新建less文件中输入代码
#header {
h1 {
font-size: 26px;
font-weight: bold;
}
p { font-size: 12px;
a { text-decoration: none;
&:hover { border-width: 1px }
}
}
}
方法二: koala(Win/Mac/Linux)国人开发的LESSCSS/SASS编译工具。(建议使用方便快捷)
下载地址:http://koala-app.com/index-zh.html
下载完成后进入Koala界面:
注意: 在编写less文件不能关闭软件 引入文件直接引入生成后的css文件
一:注释
默认css注释是适应“/**/”,Less新加了一种css注释方法,使用双斜杠注释,这种注释方式不会再编译的css文件中出现,建议使用双斜杠进行注释
/*在css文件中显示*/
//在css文件中不显示
注意:如果使用less编写css样式的话后期维护在less中,所以注释建议使用双斜杠
二:变量
与其他变成语言类似,less也有了变量的概念,主要是用于将相同的值定义成变量统一管理起来,该特性适用于定义主题,我们可以将背景颜色、字体颜色、边框属性等常规样式进行统一定义,这样不同的主题只需要定义不同的变量文件就可以了。(每个变量前加@)
//less文件编写
@border-color : #b5bcc7;
.main {
border : 1px solid @border-color;
}
//css中编译后结果
.main {
border: 1px solid #b5bcc7;
}
三:变量范围
Less中的变量和别的程序语言一样,他的变量也有一个范围概念,这个概念就有点像局部变量和全局变量一样,只是在Less中采取的是就近原则,换句话说,元素先找本身有没有这个变量存在,如果本身存在,就取本身中的变量,如果本身不存在,就寻找父元素,依此类推,直到寻找到相对应的变量,LESS中查找变量的顺序是先在局部定义中找,如果找不到,则查找上级定义,直至全局
//less文件编写
@width : 20px;
#left {
@width : 30px;
#left-mian{
width : @width;// 此处应该取最近定义的变量 width 的值 30px
}
}
#right {
width : @width; // 此处应该取最上面定义的变量 width 的值 20px
}
//css中编译后结果
#left #left-mian {
width: 30px;
}
#right {
width: 20px;
}
四:Mixins(混入)
混入是多重继承的一种实现方式,在 LESS 中,混入是指在一个 CLASS 中引入另外一个已经定义的 CLASS,就像在当前 CLASS 中增加一个属性一样。
多个参数可以使用分号或者逗号分隔,推荐使用分号分隔,因为逗号有两重含义:它既可以表示混合的参数,也可以表示一个参数中一组值的分隔符。
使用分号作为参数分隔符意味着可以将逗号分隔的一组值作为一个变量处理。换句话说,如果编译器在混合的定义或者是调用中找到至少一个分号,就会假设参数是使用分号分隔的,所有的逗号都属于参数中的一组值的分隔符。
2个参数,每个参数都含有通过逗号分隔的一组值的情况:.name(1, 2, 3; something, else)。
3个参数,每个参数只含一个数字的情况:.name(1, 2, 3)。
//less文件编写
// 定义一个样式选择器
//@radius:5px是定义的变量默认值.border;使用默认圆角为5px;
//如果需要改变圆角值可直接传参.border(10px);
.border(@radius:5px) {
-moz-border-radius: @radius;
-webkit-border-radius: @radius;
border-radius: @radius;
}
//多参数混入
.mixin(@color; @padding; @margin: 2px) {
color: @color;
padding: @padding;
margin: @margin @margin @margin @margin;
}
// 在另外的样式选择器中使用
#header {
.border;//取默认值
}
#footer {
.border(10px);//传参数
}
#sider {
.mixin(#ccc,10px);
}
//css中编译后结果
#header {
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
#footer {
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
}
#sider {
color: #cccccc;
padding: 10px;
margin: 2px 2px 2px 2px;
}
五:@arguments 变量
像 JavaScript 中 arguments一样,Mixins 也有这样一个变量:@arguments。@arguments 在 Mixins 中具是一个很特别的参数,当 Mixins 引用这个参数时,该参数表示所有的变量,很多情况下,这个参数可以省去你很多代码。
@arguments包含了所有传递进来的参数。 如果你不想单独处理每一个参数的话就可以直接使用@arguments代替:
//less文件编写
.boxShadow(@x:0,@y:0,@blur:1px,@color:#000){
-moz-box-shadow: @arguments;
-webkit-box-shadow: @arguments;
box-shadow: @arguments;
}
#header {
.boxShadow(2px,2px,3px,#f36);
}
#sider {
.boxShadow(2px,2px);
}
#footer {
.boxShadow;
}
//css中编译后结果
#header {
-moz-box-shadow: 2px 2px 3px #ff3366;
-webkit-box-shadow: 2px 2px 3px #ff3366;
box-shadow: 2px 2px 3px #ff3366;
}
#sider {
-moz-box-shadow: 2px 2px 1px #000000;
-webkit-box-shadow: 2px 2px 1px #000000;
box-shadow: 2px 2px 1px #000000;
}
#footer {
-moz-box-shadow: 0 0 1px #000000;
-webkit-box-shadow: 0 0 1px #000000;
box-shadow: 0 0 1px #000000;
}
补充 (高级参数用法与@rest参数)
如果需要在 mixin 中不限制参数的数量,可以在变量名后添加 ...,表示这里可以使用 N 个参数。
.mixin (...) { // 接受 0-N 个参数
.mixin () { // 不接受任何参数
.mixin (@a: 1) { // 接受 0-1 个参数
.mixin (@a: 1, ...) { // 接受 0-N 个参数
.mixin (@a, ...) { // 接受 1-N 个参数
六:嵌套的规则
在我们书写标准 CSS 的时候,遇到多层的元素嵌套这种情况时,我们要么采用从外到内的选择器嵌套定义,要么采用给特定元素加 class 或 id 的方式。在 LESS 中我们可以多层嵌套编写样式,也避免的样式重名的问题,嵌套的结构与HTML文件结构一致
<!--HTML文件结构-->
<div id="home">
<div id="top">top</div>
<div id="center">
<div id="left">left</div>
<div id="right">right</div>
</div>
</div>
//less文件编写
#home{
color : blue;
width : 600px;
height : 500px;
border:outset;
#top{
border:outset;
width : 90%;
}
#center{
border:outset;
height : 300px;
width : 90%;
#left{
border:outset;
float : left;
width : 40%;
}
#right{
border:outset;
float : left;
width : 40%;
}
}
}
//css中编译后结果
#home {
color: blue;
width: 600px;
height: 500px;
border: outset;
}
#home #top {
border: outset;
width: 90%;
}
#home #center {
border: outset;
height: 300px;
width: 90%;
}
#home #center #left {
border: outset;
float: left;
width: 40%;
}
#home #center #right {
border: outset;
float: left;
width: 40%;
}
七:伪元素操作
这里的&很重要,它表示选择上一级,如下例中:
:hover前添加&符号是给自身添加hover样式;
:hover前无&符号是给后代元素添加hover样式;
//less文件编写
a {
color: red;
text-decoration: none;
&:hover {// 有 & 时解析的是同一个元素或此元素的伪类,没有 & 解析是后代元素
color: black;
text-decoration: underline;
}
:hover {// 有 & 时解析的是同一个元素或此元素的伪类,没有 & 解析是后代元素
color: blue;
text-decoration: underline;
}
}
//css中编译后结果
a {
color: red;
text-decoration: none;
}
a:hover {
color: black;
text-decoration: underline;
}
a :hover {
color: blue;
text-decoration: underline;
}
八:运算
在css样式中经常会有color、padding、margin等,赋数值的样式,这种数值在less中运算提供了加,减,乘,除操作;我们可以做属性值和颜色的运算,这样就可以实现属性值之间的复杂关系。
//less文件编写
@init: #111111;
@transition: @init*2;
.switchColor {
color: @transition;
}
//css中编译后结果
.switchColor {
color: #222222;
}
九:!important关键字
注意: 在调用混用方法时,如果在方法后面添加“!important”关键字,那就表示将混入所引进来的所有属性都添加!important关键字;
//less文件编写
.mixin (@a: 1px,@b: 10px) {
border: @a solid #ccc;
margin: @b;
}
.important {
.mixin(2) !important;
}
//css中编译后结果
.important {
border: 2 solid #cccccc !important;
margin: 10px !important;
}
十:Color Functions(扩展部分)
除了以上常用的方法之外,Less中还提供了一个Color Functions,他具有多种变换颜色的功能,先把颜色转换成HSL色,然后在此基础上进行操作,具体包括以下几种:
HSL色是依照色相、饱和度、明度对颜色进行调整的一种方式(H: Hue 色相、S:Saturation 饱和度、L Lightness 明度)
lighten(@color, 10%); // return a color which is 10% lighter than @color
darken(@color, 10%); // return a color which is 10% darker than @color
saturate(@color, 10%); // return a color 10% more saturated than @color
desaturate(@color, 10%); // return a color 10% less saturated than @color
fadein(@color, 10%); // return a color 10% less transparent than @color
fadeout(@color, 10%); // return a color 10% more transparent than @color
spin(@color, 10); // return a color with a 10 degree larger in hue than @color
spin(@color, -10); // return a color with a 10 degree smaller hue than @color
//less文件编写
@base: #f04615;
#header {
color: @base;
h1 {
color: lighten(@base,20%);
a {
color: darken(@base,50%);
&:hover {
color: saturate(@base,30%);
}
}
}
p {
color: desaturate(@base,60%);
}
}
//css中编译后结果
#header {
color: #f04615;
}
#header h1 {
color: #f69275;
}
#header h1 a {
color: #060200;
}
#header h1 a:hover {
color: #ff3e06;
}
#header p {
color: #a56f60;
}