Less的嵌套规则

在使用标准CSS时,要为多层嵌套的元素定义样式,要么使用后代选择器从外到内的嵌套定义,要么给这个元素加上类名或 id 来定义。这样的写法虽然很好理解,但维护起来很不方便,因为无法清晰了解到样式之间的关系。

在Less中,嵌套规则使这个问题迎刃而解。嵌套规则允许在一个选择器中嵌套另一个选择器,这更容易设计出精简的代码,并且样式之间的关系一目了然。假设以下HTML 代码片段:

  1. <header>
  2.     <h1><a href="http://www.waibo.wang/">歪脖网</a></h1>
  3.     <p>学Web开发,就到歪脖网!</p>
  4. </header>

Less代码可以这样写:

  1. header {
  2. h1 {
  3. font-size: 26px;
  4. font-weight: bold;
  5. a {
  6. color: #f36;
  7. text-decoration: none;
  8. &:hover {
  9. color: #63f;
  10. text-decoration: underline;
  11. }
  12. }
  13. }
  14. p {
  15. font-size: 12px;
  16. &.slogan {
  17. color: #f00;
  18. }
  19. }
  20. }

这难道不就是DOM的写法吗?说实话,当你第一眼看到这种写法,你就会情不自禁地爱上Less。这种写法减了选择器的层级关系,使代码的结构非常清晰,无论是阅读、还是后期维护都是那么自然,是不是有一种本来就该如此的感觉?

在使用嵌套规则时,需要特别注意 & 符号。内层选择器前面的 & 符号就表示对父选择器的引用。在一个内层选择器的前面,如果没有 & 符号,则它被解析为父选择器的后代;如果有 & 符号,它就被解析为父元素自身或父元素的伪类。

比如,上述代码中,由于选择器 h1 前面没有 & 符号,则 h1 被解析为 header 选择器的后代,即 header h1;而 :hover 和 .slogan 前面有 & 符号,& 符号表示对父选择器的引用,则 &.slogan 表示父元素自身,&:hover 表示父元素的伪类,解析结果为 a:hover 和 p.slogan。编译后的CSS代码为:

  1. header h1 {
  2.   font-size: 26px;
  3.   font-weight: bold;
  4. }
  5. header h1 a {
  6.   color: #f36;
  7.   text-decoration: none;
  8. }
  9. header h1 a:hover {
  10.   color: #63f;
  11.   text-decoration: underline;
  12. }
  13. header p {
  14.   font-size: 12px;
  15. }
  16. header p.slogan {
  17.   color: #f00;
  18. }

事实上,父选择器运算符 & 的作用,就是让当前的选择器和父级选择器,按照特定的规则进行连接。它有多种用途,比如创建重复的类名:

  1. .button {
  2.   &-ok {
  3.     background-image: url("ok.png");
  4.   }
  5.   &-cancel {
  6.     background-image: url("cancel.png");
  7.   }
  8.   &-custom {
  9.     background-image: url("custom.png");
  10.   }
  11. }

编译后的CSS代码为:

  1. .button-ok {
  2.   background-image: url("ok.png");
  3. }
  4. .button-cancel {
  5.   background-image: url("cancel.png");
  6. }
  7. .button-custom {
  8.   background-image: url("custom.png");
  9. }

在一个选择器中,& 可以重复出现多次,这样,就可以多次引用父选择器而不必重复它的名字。如:

  1. .link {
  2.   & + & {
  3.     color: red;
  4.   }
  5.   & & {
  6.     color: green;
  7.   }
  8.   && {
  9.     color: blue;
  10.   }
  11.   &, &ish {
  12.     color: cyan;
  13.   }
  14. }

编译后的CSS代码为:

  1. .link + .link {
  2.   color: red;
  3. }
  4. .link .link {
  5.   color: green;
  6. }
  7. .link.link {
  8.   color: blue;
  9. }
  10. .link, .linkish {
  11.   color: cyan;
  12. }

需要注意的是所有的父选择器,而不是仅仅重复最近的祖先选择器。请看以下例子:

  1. .grand {
  2.   .parent {
  3.     & > & {
  4.       color: red;
  5.     }
  6.     & & {
  7.       color: green;
  8.     }
  9.     && {
  10.       color: blue;
  11.     }
  12.     &, &ish {
  13.       color: cyan;
  14.     }
  15.   }
  16. }

编译后的CSS代码为:

  1. .grand .parent > .grand .parent {
  2.   color: red;
  3. }
  4. .grand .parent .grand .parent {
  5.   color: green;
  6. }
  7. .grand .parent.grand .parent {
  8.   color: blue;
  9. }
  10. .grand .parent,
  11. .grand .parentish {
  12.   color: cyan;
  13. }

还可以将 & 放在一个选择器的后面,来改变选择器的顺序,将当前选择器排列到最前面。如:

  1. .header {
  2.   .menu {
  3.     border-radius: 5px;
  4.     .no-borderradius & {
  5.       background-image: url('images/button-background.png');
  6.     }
  7.   }
  8. }

选择器 .no-borderradius & 会使 .no-borderradius 置于他的父选择器 .header .menu 的前面,形成 .no-borderradius .header .menu的结构。编译后的CSS代码为:

  1. .header .menu {
  2.   border-radius: 5px;
  3. }
  4. .no-borderradius .header .menu {
  5.   background-image: url('images/button-background.png');
  6. }

将 & 用在一个使用逗号分隔的选择器列表中,可以产生列表中所有选择器的所有可能的排列,这被称作组合爆炸。如:

  1. p, a, ul, li {
  2.   border-top: 2px dotted #366;
  3.   & + & {
  4.     border-top: 0;
  5.   }
  6. }

上述列表中有 4 个选择器,列表中所有选择器的所有可能的排列,将有 16 种可能。编译后的CSS代码为:

  1. p,
  2. a,
  3. ul,
  4. li {
  5.   border-top: 2px dotted #366;
  6. }
  7. p + p,
  8. p + a,
  9. p + ul,
  10. p + li,
  11. a + p,
  12. a + a,
  13. a + ul,
  14. a + li,
  15. ul + p,
  16. ul + a,
  17. ul + ul,
  18. ul + li,
  19. li + p,
  20. li + a,
  21. li + ul,
  22. li + li {
  23.   border-top: 0;
  24. }
 

Less的嵌套规则的更多相关文章

  1. XHTML标签的嵌套规则分析

    在 XHTML 的语言里,我们都知道:ul 标签包含着 li.dl 标签包含着 dt 和 dd——这些固定标签的嵌套规则十分明确.但是,还有许多标签是独立的,它们没有被捆绑在一起,比如 h1.div. ...

  2. HTML5标签嵌套规则

    × 目录 [1]分类 [2]子元素 [3]总结 前面的话 在html5中,<a>元素的子元素可以是块级元素,这在以前是被认为不符合规则的.本文将详细介绍html5的标签嵌套规则 分类 ht ...

  3. HTML标签的嵌套规则

    我在平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,后来发现有些标签嵌套却是错误的.通过网上找资料,了解了html标签的嵌套规则. 一.HTML 标签包括 块级 ...

  4. XHTML标签的嵌套规则--很基础很重要

    XHTML的标签有许多:div.ul.li.dl.dt.dd.h1~h6.p.a.addressa.span. strong……我们在运用这些标签搭建页面结构的时候,是可以将它们无限嵌套的,但是,嵌套 ...

  5. HTML的奇葩嵌套规则

    一.HTML 标签包括 块级元素(block).内嵌元素(inline) 1.块级元素 一般用来搭建网站架构.布局.承载内容……它包括以下这些标签: address.blockquote.center ...

  6. html标签的嵌套规则分析

    1.a标签最好不要嵌套块级元素,可以嵌套内联元素,但是不能嵌套a标签和input之类的标签.能嵌套的标签像,等等. 2.ul和ol的子元素不能是别的元素只能是li,不能是别的比如div等,但是li中可 ...

  7. 一天搞定HTML----标签的嵌套规则06

    标签的嵌套规则 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. Unit 3.标签的分类和嵌套规则

    一.标签分类 HTML中标签元素三种不同类型:块状元素,行内元素,行内块状元素. 常用的块状元素: <div> <p> <h1>~<h6> <ol ...

  9. HTML(二)HTML元素(整体结构,块级元素,内联元素,结构元素,交互元素,元素嵌套规则)

    HTML整体结构解释 <!DOCTYPE html> // 文件应以"<!DOCTYPE ......>"首行顶格开始,推荐使用"<!DOC ...

随机推荐

  1. python学习笔记(一)之入门

    1.python的安装 官网下载.exe文件直接安装即可,在安装过程中选择加入环境变量,就不用在安装后再去增添环境变量了. 本文选择的是python3.6版本,没有选择2.7版本. 2.启动pytho ...

  2. css雪碧图(css splite)

    将很多小的背景图片放在一起,可以减少http请求. 这些图片通常是一类的. 所以使用雪碧图. 雪碧图即为: 测试一下减少了多长时间 0 = 0

  3. Nodejs.安装.非源码方式安装Node.js (Centos)

    已验证的适用环境: Centos6.x 树莓派官方ROM(Raspbian) 先去官网下载已编译好的安装包 https://nodejs.org/en/download/current/​ 以Cent ...

  4. 忘记root密码,进入单用户模式修改密码

    进入单用户模式 rhel61.在系统数秒时,按下键,进入到系统引导菜单 中2.选择系统后 按“e”键 选择kernel后 按“e”键 后空格 1+回车 b:启动系统 进入到单用户模式 rhel71.在 ...

  5. [Bayesian] “我是bayesian我怕谁”系列 - Naive Bayes+prior

    先明确一些潜规则: 机器学习是个collection or set of models,一切实践性强的模型都会被归纳到这个领域,没有严格的定义,’有用‘可能就是唯一的共性. 机器学习大概分为三个领域: ...

  6. js页面事件方法

    1. 监听页面加载事件: window.onload = function (){ alert('页面加载成功'); } 2.监听页面大小改变事件: window.onresize = functio ...

  7. 我的第一个python web开发框架(14)——后台管理系统登录功能

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  8. YYHS-猜数字(并查集/线段树维护)

    题目描述     LYK在玩猜数字游戏.    总共有n个互不相同的正整数,LYK每次猜一段区间的最小值.形如[li,ri]这段区间的数字的最小值一定等于xi.     我们总能构造出一种方案使得LY ...

  9. 路由知识 静态路由 rip eigrp ospf

    第1章 路由选择原理 1.1 几个概念 1.1.1 被动路由协议 用来在路由之间传递用户信息 1.1.2 主动路由协议 用于维护路由器的路由表 R2#show ip route Codes: C - ...

  10. 解决Qt编译动态链接库could not find or load the Qt platform plugin "windows" in.问题

    最近用Qt5做了一个项目的界面,在编译成可执行文件EXE之后,运行文件,提示: This application failed to start because it could not find o ...