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. vue 从入门到精通(一)

    很早之前就想开一系列有关vue的博客,奈何太忙了,哈哈(爱信不信)...刚刚收到消息vue2.5发布了,哎!还是应该加快一下步伐,要不就与社会脱节了.这次采用小步慢跑的形式一点一点总结vue,第一篇先 ...

  2. LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  3. Spring MVC 快捷定义 ViewController

    WHY  :               为什么我们需要快捷定义 ViewController ? 在项目开发过程中,经常会涉及页面跳转问题,而且这个页面跳转没有任何业务逻辑过程,只是单纯的路由过程 ...

  4. 使用 LitJson 解析Json并读取数据

    开发中经常要获取各种数据,而现今比较常见的数据便是Json数据格式,网上也有很多解析Json数据的方法,但是 作为小白的我,对于那些个高大上的方法理解不够,这不找了许久发了这些一个 LitJson 库 ...

  5. input框内的单引号,双引号转译

    主要是在后台传前端之前先把变量值替换单引号双引号成转译付. $bianlian是要替换的变量 两种方法 1.php后台输出值先转译 //双引号替换成转译符 $bianlian=preg_replace ...

  6. Ionic3 遇到的一些错误- Error: Your isarray platform does not have Api.js

    执行:ionic cordova resources android --icon -i 生成应用图标时,出现下面的错误: 尝试解决方案: 删掉整个项目,重新创建,竟然好了....

  7. TCP建立连接和断开连接图解

    参考博客: http://blog.csdn.net/whuslei/article/details/6667471 http://www.2cto.com/net/201310/251896.htm ...

  8. CodeForces - 294A Shaass and Oskols

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  9. Thinkphp5 常量设置问题

    楼主是之前使用了thinkphp3.2快两年了,很早就听说过thinkphp的版本已经到达5了. 不过鉴于早期的版本尚未完善,并没有立即开始学习.最近做一个项目,尝试一下新的知识. 但是在使用的时候, ...

  10. Python爬虫入门:爬虫基础了解

    有粉丝私信我想让我出更基础一些的,我就把之前平台的copy下来了,可以粗略看一下,之后都会慢慢出. 1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫 ...