Less预处理语言

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.js

安装成功后打开终端输入命令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界面:
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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容