天天看点

前端构建:Less入了个门

一、前言                             

  说到前端构建怎能缺少CSS预处理器呢!其实CSS的预处理器有很多啦,比较出名的有Scss、Sass、Stylus和Less。(最近还听说出现了Autoprefixer等CSS后处理器,可参考@一丝的PPT)

  众多CSS预处理器中Less的语法最接近原生CSS,因此相对来说更容易上手,假如有JS、C#等编程经验的话,其实上述的几种预处理器的学习成本也不会特别高。下面是我们这阵子的学习笔记,以便日后查阅。

  最好的入门教程——官网地址:http://lesscss.org/

  最佳实践之一——Bootstrap

  由于内容较多,特设目录一坨:

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a3">  三、内联样式和外联样式</a>

<a href="http://www.cnblogs.com/a4" target="_blank">  四、语法</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a6">  六、函数</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a10">  十、总结</a>

  搭建Less的学习环境非常简单,只需在&lt;/body&gt;标签前通过&lt;script type="text/javascript" src="less.js"&gt;&lt;/script&gt;引入处理器即可实现浏览器端中将less预编译为css样式。更有效的方式是通过如下代码监测less样式,自动编译为css样式,从而减少我们修改less代码后需按F5后才看到实际效果的繁琐步骤。

  基于我们现在使用的是浏览器端进行预编译,因此Less可用于内联样式和外联样式当中。

内联样式如下:

外联样式引入如下:

     Less中的变量有以下规则:

以@作为变量的起始标识,变量名由字母、数字、_和-组成

没有先定义后使用的规定;

定义时 "@变量名: 变量值;" 的形式;引用时采用 "@变量名" 或 "@{变量名}" 的形式;

   Less源码:

前端构建:Less入了个门
前端构建:Less入了个门

    最终输出:

前端构建:Less入了个门
前端构建:Less入了个门

    less变量除了支持#FFF,12px,12,test等单值类型外,还支持列表类型,通过内置函数extract通过索引获取列表元素,通过内置函数length获取列表的元素个数

   最终输出:

  Less源码:

前端构建:Less入了个门
前端构建:Less入了个门

  最终输出:

前端构建:Less入了个门
前端构建:Less入了个门

采用&amp;引用完整的父选择器

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a43multiple">可通过追加和预追加的方式加工&amp;,从而生成新的选择器</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a43:">通过<code>&amp;::after</code>等方式添加伪元素、伪类样式规则集合</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a43multiple">同一个选择器可使用多个&amp;</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a43revert">通过在选择器后添加 "空格&amp;"的方式,可将当前选择器排列到最前面</a>

<a href="http://www.cnblogs.com/fsjohnhuang/p/4187675.html#a43group">&amp;指向组选择器时,会生成新的组选择器</a>

前端构建:Less入了个门
前端构建:Less入了个门

      最终输出:

前端构建:Less入了个门
前端构建:Less入了个门

  less样式文件可通过 @import '文件路径'; 引入外部的less文件。

  注意:

不带扩展名或带非.less的扩展名均被视为less文件;

<code>@import</code>可出现在任何位置,而不像css的<code>@import</code>那样只能放在文件第一行。

  另外<code>@import</code>还提供了6个可选配置项(分别为<code>reference</code>,<code>inline</code>,<code>less</code>,<code>css</code>,<code>once</code>,<code>multiple</code>),用来改变引入文件的特性。语法为:  @import (reference) '文件路径'; 。下面为各配置项的具体说明:

<dl></dl>

<dt>1. @import (reference) "文件路径"; </dt>

<dd>  将引入的文件作为样式库使用,因此文件中样式不会被直接编译为css样式规则。当前样式文件通过<code>extend</code>和<code>mixins</code>的方式引用样式库的内容。</dd>

<dt>2. @import (inline) "文件路径"; </dt>

<dd>  用于引入与less不兼容的css文件,通过inline配置告知编译器不对引入的文件进行编译处理,直接输出到最终输出。注意:引入的文件和当前文件会被编译为一个样式样式</dd>

<dt>3. @import (less) "文件路径"; </dt>

<dd>  默认使用该配置项,表示引入的文件为less文件。</dd>

<dt>4. @import (css) "文件路径"; </dt>

<dd>  表示当前操作为CSS中的<code>@import</code>操作。当前文件会输出一个样式文件,而被引入的文件自身为一个独立的样式文件</dd>

<dt>5. @import (once) "文件路径"; </dt>

<dd>  默认使用该配置项,表示对同一个资源仅引入一次。</dd>

<dt>6. @import (multiple) "文件路径"; </dt>

<dd>  表示对同一资源可引入多次。</dd>

  有两种语法形式, &lt;selector&gt;:extend(&lt;parentSelector&gt;){} 和 &lt;selector&gt;{ &amp;:extend(&lt;parentSelector&gt;); } 

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

注意事项:

<dt></dt>

<dt>  Less源码:</dt>

前端构建:Less入了个门
前端构建:Less入了个门

  最终输出:

前端构建:Less入了个门
前端构建:Less入了个门

 Less源码:

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

      注意:不能extend当前media query块内部的子media query块中的选择器样式;但可以extend父media query块的选择器样式。

    Less源码:

前端构建:Less入了个门
前端构建:Less入了个门

    最终输出:

前端构建:Less入了个门
前端构建:Less入了个门

   Less源码:

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

  Mixin相当于macro,会将样式规则内联到调用的位置中。而Less中的mixin有以下的注意点:

<dt>  Less源码:</dt>

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

     Less中通过混合(Mixin)后的when关键字来提供选择的作业控制,通过递归来实现循环的作业控制。

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

  Less还支持+、-、*、/运算符。但对单位不一致的运算数进行运算要注意以下两点:

  1. 运算数与运算符间必须用空格分隔;

  2. 以第一个运算数的单位作为运算结果的单位;

    Less源码:

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

  Less为我们提供了一个功能强大的内置函数库,其中绝大部分为颜色处理函数。下面着重介绍Misc Function中的default函数、String Function中的escape函数和颜色处理函数。

     示例:

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

    虽然上述示例逻辑上不合理。但可以看出default函数用于条件控制当中,充当else或switch语句中default的角色。

    通过官网提供的综合示例我们可以更好理解它的用法:

前端构建:Less入了个门
前端构建:Less入了个门

   注意:

     1. default函数必须在条件控制语句当中使用;

     2. default函数可实现比else更复杂的功能,如下:

前端构建:Less入了个门
前端构建:Less入了个门

    顾名思义就是对字符串中的特定字符进行编码,该函数将对<code>\&lt;space\&gt;</code>, <code>#</code>, <code>^</code>, <code>(</code>, <code>)</code>, <code>{</code>, <code>}</code>, <code>|</code>, <code>:</code>, <code>&gt;</code>, <code>&lt;</code>, <code>;</code>, <code>]</code>, <code>[ 和 </code><code>=字符进行编码。</code>

    颜色处理函数又分为四大类:颜色定义函数(Color Definition)、颜色通道值获取函数(Color Channel)、颜色通道值修改函数(Color Operation Function)、混色函数(Color Blending)。

    这里仅仅介绍常用的lighten和darken函数。

     lighten(color, amount) ,color为颜色,amount为增加的亮度值,取值范围为0-100%。

     darken(color, amount) ,color为颜色,amount为减少的亮度值,取值范围为0-100%。

   到这里我想大家已经对Less有一定程度的了解,并希望在将其加入你的开发工具包中。但通过less.js将Less解析器引入到浏览器肯定是不适合开发的,而cli工具lessc更适合开发环境中使用。在使用之前我们先要通过npm来安装less。

  然后我们就可以通过 lessc [option option=parameter ...] &lt;source&gt; [destination] 的命令格式来调用lessc了!

  lessc的option选项较多,我将主要的选项分为lessc命令信息相关、sourcemap相关、@import指令相关和插件相关四类。

  1. lessc命令信息相关

     lessc -h ,获取lessc命令的帮助信息;

     lessc -v ,获取lessc命令的版本号。

  2. sourcemap相关

     由于在浏览器直接查看和操作的是CSS样式规则,而我们开发时使用的Less代码,这会导致难以找到CSS样式规则所对应的Less代码从而增大调试难度。而sourcemap就是为了解决这一痛点而提出的技术解决方案,其原理就是通过一个map文件来保存两个文件中代码的对应关系,然后支持sourcemap的浏览器的devTools中就会根据这些对应关系来定位相应的Less代码。(Chrome和FF均支持sourcemap,IE11及以下均不支持)

     若对sourcemap不太了解的可以参考《前端构建:Source Maps详解》

      --source-map ,生成与生成的css同名的sourcemap文件(例如生成的css文件为main.css,那么sourcemap文件就是main.css.map),且与css文件位于同一目录下;

      --source-map=&lt;sourcemap文件路径&gt; ,自定义sourcemap文件的路径;

       --source-map-rootpath=&lt;sourcemap文件中sources属性值的路径前缀&gt; ,假如main.less文件位于src/less下,而生成的css和sourcemap文件位于bin/style下,那么就需要修改sourcemap文件中用于指向less文件路径的sources属性值,浏览器才能通过sourcemap文件查找到less文件。上述例子的命令为:

                     lessc --source-map --source-map-rootpath=../../src/less/main.less src/less/main.less bin/style/main.css 

       --source-map-map-inline ,以data URI Scheme的形式将sourcemap文件内容内嵌到css文件中。

       --source-map-url=&lt;css文件中指向sourcemap文件的url&gt; ,默认情况下css文件的最后一行会插入如 /*# sourceMappingURL=main.css.map */ 的内容来指向sourcemap文件,而该选项则可修改sourceMappingURL的值。

  3. @import指令相关

       --include-path=&lt;path&gt;[;&lt;path&gt;]* ,通过@import指令引入外部less或css等文件时存在引入的文件路径到底是以哪个目录作为参考的问题,我们可以通过该选项来指定参考目录,当存在多个参考目录时,使用;号分隔。

       --relative-urls 或 -ru ,用于保持样式库中的图片等资源的相对路径。示例:

前端构建:Less入了个门
前端构建:Less入了个门

      不使用该选项时:

      使用该选项时:

  4. 插件相关

      lessc以插件的形式来增强其功能,下面仅介绍clean-css插件,其他插件请参考http://lesscss.org/usage/#plugins-list-of-less-plugins

      首先通过npm安装插件 npm install -g less-plugin-clean-css ,然后通过--clean-css选项来启动CSS压缩功能。

        如: lessc file.less --clean-css="--s1 --advanced --compatibility=ie8"  

 先假定我们开发环境的目录结构如下(灰色表示文件由构建工具生成):

  sample

    |-- build.bat     构建工具

    |-- lib              第三方依赖库

    |     |-- less     

    |            |-- base.less 

    |            |-- img

    |                  |-- nav.png

    |-- src              源码

    |     |-- less

    |     |      |-- main.less

    |     |-- index.html

    |-- bin              编译后的文件

    |     |-- style

    |             |-- main.css

    |             |-- main.css.map

    |-- dist              发布文件

    |-- lib

    |  |-- less

    |          |-- img

    |                |-- nav.png

    |-- app

      |-- style

      |   |--main.css

      |-- index.html

  index.html文件内容:

前端构建:Less入了个门
前端构建:Less入了个门

  样式库base.less文件内容:

前端构建:Less入了个门
前端构建:Less入了个门

   main.less文件内容:

前端构建:Less入了个门
前端构建:Less入了个门

   我们一般将工程代码级别的产出分为源码、可执行代码 和可发布代码 三种,而可执行代码和可发布代码的构建需求是不同的,因此构建方式也有所区别,也就是lessc使用的选项也会不同。下面将针对不同的产出物来介绍lessc的使用。

   1. 可执行代码

     我将可执行代码部分再细分为release和debug两种编译模式,可以看到通过变量@env来实现不同模式下采用不同的样式规则。默认采用release模式编译源码。

     在执行lessc命令时通过选项--modify-var="env=debug"即可以debug模式编译源码。

     可以看到上述编译过程中均会生成sourcemap文件以便调试使用。

   2. 可发布代码

     对于发布的内容我们会对其进行压缩处理

     由于sourcemap文件仅在开发阶段有用,因此生成发布代码时就不要生成了。

   完整的构建文件build.bat如下:

前端构建:Less入了个门
前端构建:Less入了个门

View Code

    然后在CMD中输入 build bin  、 build debug  或  build dist  即可构建工程了!

  我们沿用第八节的工程目录结构来演示。

 sample-grunt

    |-- package.json

    |-- Gruntfile.js

    |-- node_modules   

    |-- bin              编译后的文件

   其中用于将Less编译为CSS的插件为grunt-contrib-less, 下面我们对应第八章的内容来介绍该插件的选项。

   sourcemap相关:

   {Boolean} sourceMap,对应lessc中属性值为true/false的--source-map选项;

   {String} sourceMapFilename,对应lessc中属性值为String的--source-map选项;

   {String} sourceMapRootPath,对应lessc的--source-map-rootpath选项;

   {String} sourceMapURL,对应lessc的--source-map-url选项;

   {Boolean} outputSourceFiles,,对应lessc的--source-map-map-inline选项;

   @import指令相关:

 {Array|String} paths,对应lessc的--include-path选项;

   {Boolean} relativeUrls,对应lessc的--relative-urls选项;

   插件相关:

  {Array} plugins,数组元素为插件实例。

   Gruntfile.js内容如下:

前端构建:Less入了个门
前端构建:Less入了个门

  到这里我只能和大家说一声,“辛苦了各位,终于看完了耶!”。但正如标题所说,此刻无论是对less的使用,还是将其融入我们的开发工作流,我们均是入了个门而已。那应该如何进阶呢?那就是

前端构建:Less入了个门
前端构建:Less入了个门

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

前端构建:Less入了个门
前端构建:Less入了个门
前端构建:Less入了个门

<a href="http://home.cnblogs.com/u/fsjohnhuang/">^_^肥仔John</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followees">关注 - 85</a>

<a href="http://home.cnblogs.com/u/fsjohnhuang/followers">粉丝 - 707</a>

<a>+加关注</a>

14

<a></a>

评论列表

不错,以前接触过less,现在看来也是学到很多

没有什么吸引力啊,能不能整点干货呢?

css写法快不只有这种方式嘛

http://pic.cnblogs.com/face/424274/20130126034040.png

css中的@import指令并不是说只能放在.css文件第一行,而是说一定要在所有的样式表之前使用,多个引用写多行;

这个地方的“第一行”容易让很多不了解css@import指令的人误解

请问下,less.watch机制可以在我更改了less中的代码后,浏览器无需刷新页面,就能显示最新的结果,这是如何实现的?

http://pic.cnblogs.com/face/696637/20141219193815.png

看extend 6.2

// 匹配失败

// 形式1,不支持以变量作入参

.son1:extend(@{p1}){}

// 形式2,不支持以变量作为选择器的规则集合

.son1:extend(.parent2){}

// 匹配成功

.son2:extend(.parent1){}

.son1:extend(.parent2){}和 .son2:extend(.parent1){}不是一回事吗?我是小白,看到这里我蒙逼了,不懂为啥第一个匹配失败,第二个就匹配成功了

http://pic.cnblogs.com/face/853802/20170425114819.png

@

我又仔细看了一遍,好像是懂了

非常好,正是我需要的,谢谢大佬,收藏了

http://pic.cnblogs.com/face/1108721/20170221073311.png

<a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】超50万VC++源码: 大型工控、组态\仿真、建模CAD源码2018!</a>

<a href="https://cloud.tencent.com/developer/support-plan?fromSource=gwzcw.710852.710852.710852" target="_blank">【推荐】加入腾讯云自媒体扶持计划,免费领取域名&amp;服务器</a>

前端构建:Less入了个门

<b>最新IT新闻</b>:

前端构建:Less入了个门

<b>最新知识库文章</b>:

<a href="https://github.com/fsjohnhuang" target="_blank">肥仔John@github</a>

作品:

<a href="https://github.com/fsjohnhuang/iScheme" target="_blank">iScheme—Scheme解释器</a>

继续阅读