less使用方式

本质上,LESS 包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS 文件。LESS 并没有裁剪 CSS 原有的特性,更不是用来取代 CSS 的,而是在现有 CSS 语法的基础上,为 CSS 加入程序式语言的特性。下面是一个简单的例子:

清单 1. LESS 文件

1

2

3

4

5

6

7

8

@color: #4D926F;

#header {

 color: @color;

}

h2 {

 color: @color;

}

经过编译生成的 CSS 文件如下:

清单 2. CSS 文件

1

2

3

4

5

6

#header {

 color: #4D926F;

}

h2 {

 color: #4D926F;

}

从上面的例子可以看出,学习 LESS 非常容易,只要你了解 CSS 基础就可以很容易上手。

LESS 可以直接在客户端使用,也可以在服务器端使用。在实际项目开发中,我们更推荐使用第三种方式,将 LESS 文件编译生成静态 CSS 文件,并在 HTML 文档中应用。

客户端

我们可以直接在客户端使用 .less(LESS 源文件),只需要从 http://lesscss.org下载 less.js 文件,然后在我们需要引入 LESS 源文件的 HTML 中加入如下代码:


1

<link rel="stylesheet/less" type="text/css" href="styles.less">

LESS 源文件的引入方式与标准 CSS 文件引入方式一样:


1

<link rel="stylesheet/less" type="text/css" href="styles.less">

需要注意的是:在引入 .less 文件时,rel 属性要设置为“stylesheet/less”。还有更重要的一点需要注意的是:LESS 源文件一定要在 less.js 引入之前引入,这样才能保证 LESS 源文件正确编译解析。

服务器端

LESS 在服务器端的使用主要是借助于 LESS 的编译器,将 LESS 源文件编译生成最终的 CSS 文件,目前常用的方式是利用 node 的包管理器 (npm) 安装 LESS,安装成功后就可以在 node 环境中对 LESS 源文件进行编译。

在项目开发初期,我们无论采用客户端还是服务器端的用法,我们都需要想办法将我们要用到的 CSS 或 LESS 文件引入到我们的 HTML 页面或是桥接文件中,LESS 提供了一个我们很熟悉的功能— Importing。我们可以通过这个关键字引入我们需要的 .less 或 .css 文件。 如:

@import “variables.less”;

.less 文件也可以省略后缀名,像这样:

@import “variables”;

引入 CSS 同 LESS 文件一样,只是 .css 后缀名不能省略。

使用编译生成的静态 CSS 文件

我们可以通过 LESS 的编译器,将 LESS 文件编译成为 CSS 文件,在 HTML 文章中引入使用。这里要强调的一点,LESS 是完全兼容 CSS 语法的,也就是说,我们可以将标准的 CSS 文件直接改成 .less 格式,LESS 编译器可以完全识别。

语法

变量

LESS 允许开发者自定义变量,变量可以在全局样式中使用,变量使得样式修改起来更加简单。

我们可以从下面的代码了解变量的使用及作用:

清单 3 LESS 文件

1

2

3

4

5

@border-color : #b5bcc7;

.mythemes tableBorder{

  border : 1px solid @border-color;

}

经过编译生成的 CSS 文件如下:

清单 4. CSS 文件

1

2

3

.mythemes tableBorder {

 border: 1px solid #b5bcc7;

}

从上面的代码中我们可以看出,变量是 VALUE(值)级别的复用,可以将相同的值定义成变量统一管理起来。

该特性适用于定义主题,我们可以将背景颜色、字体颜色、边框属性等常规样式进行统一定义,这样不同的主题只需要定义不同的变量文件就可以了。当然该特性也同样适用于 CSS RESET(重置样式表),在 Web 开发中,我们往往需要屏蔽浏览器默认的样式行为而需要重新定义样式表来覆盖浏览器的默认行为,这里可以使用 LESS 的变量特性,这样就可以在不同的项目间重用样式表,我们仅需要在不同的项目样式表中,根据需求重新给变量赋值即可。

LESS 中的变量和其他编程语言一样,可以实现值的复用,同样它也有生命周期,也就是 Scope(变量范围,开发人员惯称之为作用域),简单的讲就是局部变量还是全局变量的概念,查找变量的顺序是先在局部定义中找,如果找不到,则查找上级定义,直至全局。下面我们通过一个简单的例子来解释 Scope。

清单 5. LESS 文件

1

2

3

4

5

6

7

8

9

10

11

@width : 20px;

#homeDiv {

  @width : 30px;

  #centerDiv{

      width : @width;// 此处应该取最近定义的变量 width 的值 30px

             }

}

#leftDiv {

    width : @width; // 此处应该取最上面定义的变量 width 的值 20px

}

经过编译生成的 CSS 文件如下:

清单 6. CSS 文件

1

2

3

4

5

6

#homeDiv #centerDiv {

 width: 30px;

}

#leftDiv {

 width: 20px;

}

Mixins(混入)

Mixins(混入)功能对用开发者来说并不陌生,很多动态语言都支持 Mixins(混入)特性,它是多重继承的一种实现,在 LESS 中,混入是指在一个 CLASS 中引入另外一个已经定义的 CLASS,就像在当前 CLASS 中增加一个属性一样。

我们先简单看一下 Mixins 在 LESS 中的使用:

清单 7. LESS 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

// 定义一个样式选择器

 .roundedCorners(@radius:5px) {

 -moz-border-radius: @radius;

 -webkit-border-radius: @radius;

 border-radius: @radius;

 }

 // 在另外的样式选择器中使用

 #header {

 .roundedCorners;

 }

 #footer {

 .roundedCorners(10px);

 }

经过编译生成的 CSS 文件如下:

清单 8. CSS 文件

1

2

3

4

5

6

7

8

9

10

#header {

-moz-border-radius:5px;

-webkit-border-radius:5px;

border-radius:5px;

}

#footer {

-moz-border-radius:10px;

-webkit-border-radius:10px;

border-radius:10px;

}

从上面的代码我们可以看出:Mixins 其实是一种嵌套,它允许将一个类嵌入到另外一个类中使用,被嵌入的类也可以称作变量,简单的讲,Mixins 其实是规则级别的复用。

Mixins 还有一种形式叫做 Parametric Mixins(混入参数),LESS 也支持这一特性:

清单 9. LESS 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// 定义一个样式选择器

 .borderRadius(@radius){

 -moz-border-radius: @radius;

 -webkit-border-radius: @radius;

 border-radius: @radius;

 }

 // 使用已定义的样式选择器

 #header {

 .borderRadius(10px); // 把 10px 作为参数传递给样式选择器

 }

 .btn {

 .borderRadius(3px);// // 把 3px 作为参数传递给样式选择器

 }

经过编译生成的 CSS 文件如下:

清单 10. CSS 文件

1

2

3

4

5

6

7

8

9

10

#header {

-moz-border-radius: 10px;

-webkit-border-radius: 10px;

border-radius: 10px;

}

.btn {

-moz-border-radius: 3px;

-webkit-border-radius: 3px;

border-radius: 3px;

}

我们还可以给 Mixins 的参数定义一人默认值,如

清单 11. LESS 文件

1

2

3

4

5

6

7

8

.borderRadius(@radius:5px){

 -moz-border-radius: @radius;

 -webkit-border-radius: @radius;

 border-radius: @radius;

 }

 .btn {

 .borderRadius;

 }

经过编译生成的 CSS 文件如下:

清单 12. CSS 文件

1

2

3

4

5

.btn {

-moz-border-radius: 5px;

-webkit-border-radius: 5px;

border-radius: 5px;

}

像 JavaScript 中 arguments一样,Mixins 也有这样一个变量:@arguments。@arguments 在 Mixins 中具是一个很特别的参数,当 Mixins 引用这个参数时,该参数表示所有的变量,很多情况下,这个参数可以省去你很多代码。

清单 13. LESS 文件

1

2

3

4

5

6

7

8

.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);

}

经过编译生成的 CSS 文件如下:

清单 14. CSS 文件

1

2

3

4

5

#header {

-moz-box-shadow: 2px 2px 3px #FF36;

-webkit-box-shadow: 2px 2px 3px #FF36;

box-shadow: 2px 2px 3px #FF36;

}

Mixins 是 LESS 中很重要的特性之一,我们这里也写了很多例子,看到这些例子你是否会有这样的疑问:当我们拥有了大量选择器的时候,特别是团队协同开发时,如何保证选择器之间重名问题?如果你是 java 程序员或 C++ 程序员,我猜你肯定会想到命名空间 Namespaces,LESS 也采用了命名空间的方法来避免重名问题,于是乎 LESS 在 mixins 的基础上扩展了一下,看下面这样一段代码:

清单 15. LESS 文件

1

2

3

4

#mynamespace {

.home {...}

.user {...}

}

这样我们就定义了一个名为 mynamespace 的命名空间,如果我们要复用 user 这个选择器的时候,我们只需要在需要混入这个选择器的地方这样使用就可以了。#mynamespace > .user。

嵌套的规则

在我们书写标准 CSS 的时候,遇到多层的元素嵌套这种情况时,我们要么采用从外到内的选择器嵌套定义,要么采用给特定元素加 CLASS 或 ID 的方式。在 LESS 中我们可以这样写:

清单 16. HTML 片段

1

2

3

4

5

6

7

<div id="home">

<div id="top">top</div>

<div id="center">

<div id="left">left</div>

<div id="right">right</div>

</div>

</div>

清单 17. LESS 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#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 文件如下:

清单 18. CSS 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#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%;

}

从上面的代码中我们可以看出,LESS 的嵌套规则的写法是 HTML 中的 DOM 结构相对应的,这样使我们的样式表书写更加简洁和更好的可读性。同时,嵌套规则使得对伪元素的操作更为方便。

清单 19. LESS 文件

1

2

3

4

5

6

7

8

a {

 color: red;

 text-decoration: none;

 &:hover {// 有 & 时解析的是同一个元素或此元素的伪类,没有 & 解析是后代元素

  color: black;

  text-decoration: underline;

 }

 }

经过编译生成的 CSS 文件如下:

清单 20. CSS 文件

1

2

3

4

5

6

7

8

a {

color: red;

text-decoration: none;

}

a:hover {

color: black;

text-decoration: underline;

}

运算及函数

在我们的 CSS 中充斥着大量的数值型的 value,比如 color、padding、margin 等,这些数值之间在某些情况下是有着一定关系的,那么我们怎样利用 LESS 来组织我们这些数值之间的关系呢?我们来看这段代码:

清单 21 . LESS 文件

1

2

3

4

5

@init: #111111;

@transition: @init*2;

.switchColor {

color: @transition;

}

经过编译生成的 CSS 文件如下:

清单 22. CSS 文件

1

2

3

.switchColor {

 color: #222222;

}

上面的例子中使用 LESS 的 operation 是 特性,其实简单的讲,就是对数值型的 value(数字、颜色、变量等)进行加减乘除四则运算。同时 LESS 还有一个专门针对 color 的操作提供一组函数。下面是 LESS 提供的针对颜色操作的函数列表:


1

2

3

4

5

6

7

8

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

PS: 上述代码引自 LESS CSS 官方网站,详情请见 http://lesscss.org/#-color-functions

使用这些函数和 JavaScript 中使用函数一样。

清单 23 LESS 文件

1

2

3

4

init: #f04615;

 #body {

  background-color: fadein(@init, 10%);

 }

经过编译生成的 CSS 文件如下:

清单 24. CSS 文件

1

2

3

#body {

 background-color: #f04615;

}

从上面的例子我们可以发现,这组函数像极了 JavaScript 中的函数,它可以被调用和传递参数。这些函数的主要作用是提供颜色变换的功能,先把颜色转换成 HSL 色,然后在此基础上进行操作,LESS 还提供了获取颜色值的方法,在这里就不举例说明了。

LESS 提供的运算及函数特性适用于实现页面组件特性,比如组件切换时的渐入渐出。

Comments(注释)

适当的注释是保证代码可读性的必要手段,LESS 对注释也提供了支持,主要有两种方式:单行注释和多行注释,这与 JavaScript 中的注释方法一样,我们这里不做详细的说明,只强调一点:LESS 中单行注释 (// 单行注释 ) 是不能显示在编译后的 CSS 中,所以如果你的注释是针对样式说明的请使用多行注释。

时间: 2024-10-06 01:24:08

less使用方式的相关文章

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

配置resin web方式部署项目

写在前面,推荐下载resin4.0.47版本.其它版本没有测试 最近打算做一个小项目,然后容器选用了resin.想通过web提交war文件的方式 进行部署,更新代码也方便. 试了resin最新的版本(目前最新版本为4.0.53),提交war文件到webapps下面都是.tmp文件.百度google一通还是没找到解决办法. 看了下公司用的resin版本,选择4.0.47.下载后发现没最新版本的上传问题. 通过web提交war文件方式步骤如下: 步骤一:修改resin.properties.推荐配置

(转)web会话管理方式

阅读目录 1. 基于server端session的管理 2. cookie-based的管理方式 3. token-based的管理方式 4. 安全问题 5. 总结 http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端.所以对我们的应用而言,它是需要有状态管理的,以便服务端能够准确的知道http请求是哪个用户发起的,从而判断他是否有权限继续这个请求.这

Jenkins 2.60.x 2种发送邮件方式

1.1 默认发邮件的配置方式 1.1.1 系统级别 邮件配置 1.1.2 项目级别 邮件配置 测试构建失败是否会发邮件: 控制台输出:提示已发送邮件给项目配置指定的两个邮箱地址. 1.1.2.1  查看邮箱 1.2 第三方插件 发送邮件的配置方式 1.2.1 系统级别 邮件配置 再次打开系统配置找到如下图的地方配置发送邮件的触发条件. 1.2.1 项目级别 邮件配置 控制台输出(console output): 1.2.1.1  查看邮件 确认第一个邮箱收件人 确认第二个邮箱收件人

maven 坐标获取方式

问题:我们在开发时pom.xml文件中的 <dependencies>     <dependency>         <groupId>org.mybatis</groupId>         <artifactId>mybatis</artifactId>         <version>3.2.5</version>     </dependency> </dependencies

mysql读写分离的三种实现方式

1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自己维护更新,增减服务器在代码处理 2 amoeba参考官网:http://amoeba.meidusa.com/优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活 3 mysql-proxy参考 mysql-proxy

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

【巨坑】springmvc 输出json格式数据的几种方式!

最近公司项目需要发布一些数据服务,从设计到实现两天就弄完了,心中窃喜之. 结果临近部署时突然发现.....  服务输出的JSON 数据中  date 类型数据输出格式要么是时间戳,要么是  {"date":26,"day":1,"hours":21,"minutes":38,"month":5,"seconds":22,"time":1498484302259,&qu

CSS原生布局方式

前言 网页原生布局的方法其实网上有很多,大概为Flow(流动布局模型).Float(浮动布局模型).Layer(层级布局模型).<!--more--> Flow布局 流动布局模型其实就是默认的网页布局模式.也就是说网页在默认状态下的HTML网页元素都是根据流动模型来分布网页内容的.流动布局将会有两个比较典型的特征,第一,块级元素都会在所处的最近父级容器元素内自上而下按顺序垂直顺延分布,因为在默认状态下,块级元素的宽度都是100%(即父级元素宽度的100%).实际上,块状元素都会以行的形式占据位

mariadb10.xGTID复制方式

常用的master_log_file,master_log_pos复制方式,当主库宕机时会造成数据不一致问题: mariadb10.x默认就是支持GTID的复制方式  1.不支持的参数 gtid-mode=on enforce-gtid-consistency=true 2.修改的参数 slave-parallel-workers参数修改为slave-parallel-threads 3.连接至主服务使用的命令 增加:master_use_gtid= current_pos | slave_po