zoukankan      html  css  js  c++  java
  • CSS模块化:less

    • less的安装与基本使用
    • less的语法及特性

     一、本地使用less的方法

    Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。是一种动态样式语言,属于css预处理语言的一种。

    下载后找到less.js:less.js-2.5.3distless.js

    也可以直接使用CDN缓存: <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script> 

    注意link的rel属性: <link rel="stylesheet/less" type="text/css" href="styles.less" /> 

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7     <title>Document</title>
     8     <link rel="stylesheet/less" type="text/css" href="demo.less" />
     9 </head>
    10 <body>
    11     <div class="wrapper">
    12         <div class="box">
    13             <ul>
    14                 <li><a href="">aaaa</a></li>
    15                 <li><a href="">aaaa</a></li>
    16                 <li><a href="">aaaa</a></li>
    17                 <li><a href="">aaaa</a></li>
    18                 <li><a href="">aaaa</a></li> 
    19             </ul>
    20         </div>
    21     </div>
    22     <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>
    23 </body>
    24 </html>
    测试结构代码
     1 *{
     2     margin: 0;
     3     padding: 0;
     4     list-style: none;
     5     text-decoration: none;
     6     body{
     7         background-color: #ccc;
     8         .wrapper{
     9             position: relative;
    10             width: 500px;
    11             height: 500px;
    12             margin:200px auto;
    13             border: 1px solid #000;
    14             .box{
    15                 position: absolute;
    16                 width: 200px;
    17                 height: 200px;
    18                 top: 50%;
    19                 left: 50%;
    20                 margin-top: -100px;
    21                 margin-left: -100px;
    22                 border:1px solid #000;
    23             }
    24         }
    25     }
    26 }
    测试的Less样式表

    注意本地测试时需要放到本地服务下,在less.js中会有ajax网络请求,直接使用本地文件路径打开页面会报错。

     二、在nodejs环境中使用less

     1.安装less到全局

    npm install less -g

    2.通过lessc指令将less文件编译转换成css文件

    lessc demo.less demo.css

    执行完成以后会生成一个demo.css文件,上面示例中的demo.less被编译转换成demo.css文件的代码如下;

     1 * {
     2   margin: 0;
     3   padding: 0;
     4   list-style: none;
     5   text-decoration: none;
     6 }
     7 * body {
     8   background-color: #ccc;
     9 }
    10 * body .wrapper {
    11   position: relative;
    12   width: 500px;
    13   height: 500px;
    14   margin: 200px auto;
    15   border: 1px solid #000;
    16 }
    17 * body .wrapper .box {
    18   position: absolute;
    19   width: 200px;
    20   height: 200px;
    21   top: 50%;
    22   left: 50%;
    23   margin-top: -100px;
    24   margin-left: -100px;
    25   border: 1px solid #000;
    26 }
    View Code

    注:在webpack中使用less会在后期的webpack相关博客中解析。

     三、less的语法及特性

    1.注释编译:less中的双斜杠注释不会被编译到css文件中,但是包裹注释会被编译到css文件中

    // 双斜杠注释不会被编译到css文件中
    /*我可以出现在css文件中*/ 

    编译后的结果:

    /*我可以出现在css文件中*/

    2.变量与运算

    1 @ince-blue:#5B83AD;
    2 @light-blue:@ince-blue + #ff0;
    3 //@light-blue的实际颜色是由@ince-blue + #ff0得到的,实际颜色值是#ffffad
    4 //在less中直接将变量应用到样式中
    5 background-color:@light-blue;

    可以运算的值当然还有像素值:

    @list-300px;
    @list-height:@list-width * 2;

    2.1.变量也可以说是可变插值,上面的示例中展示的都是使用变量来控制CSS样式值,less中的变量除了可以控制css样式值以外,还可以被用作选择器名称、属性名称、URL和@import语句。

    2.1.1.变量控制选择器

    1 @my-selector:banner;
    2 
    3 .@{my-selector}{
    4         // 这里是类选择器banner的具体的样式
    5 }

    2.1.2.变量控制网址(URL)

    1 @images: "../img";
    2 
    3 div{
    4     background: url("@{imges}/mei.png");
    5 }

    2.1.3.变量与导入语句

    @themes: "../../src/themes";
    
    @import "@{themes}/tidal-wave.less"

    2.1.4.变量与属性

    @property-color:color;
    
    span{
        @{property-color}: #0ee;
    }

    2.1.5.变量与变量名

    1 @fnord: "I am fnord.";
    2 @var: 'fnord';
    3 content: @@var;
    4 
    5 //编译为
    6 content: "I am fnord.";

    2.1.6.变量的作用域与延迟加载

     1 body{
     2     div{
     3         @size:14px;
     4         .p1{
     5             @size:18px;
     6             font-size:@size;
     7         }
     8         ul{
     9             font-size:@size;
    10         }
    11         .p2{
    12             font-size:@size;
    13         }
    14     }
    15 }

    less作用域类似JS的块级作用域,当前作用域有该变量就取当前作用域的变量值。当前作用域没有的话就取沿着作用域链往外层作用域匹配。

    2.1.6.1.但是要注意的是,这并不能说明less的变量作用域就完全与JS的作用域相同,恰恰相反它们有很大的区别。比如延迟加载:

     1 div{
     2     @col-p:#ffo;
     3     p{
     4         color:@col-p;
     5         @col-p:#000;
     6     }
     7 }
     8 //编译结果
     9 div p{
    10     color:#000;
    11 }

    2.1.6.2.这种延迟加载还存在作用域上,例如下面这种情况:

     1 //情况以
     2 .lazy-eval {
     3   width: @var;
     4 }
     5 
     6 @var: @a;
     7 @a: 9%;
     8 //情况二
     9 .lazy-eval-scope {
    10   width: @var;
    11   @a: 9%;
    12 }
    13 
    14 @var: @a;
    15 @a: 100%;

    以上这两种情况都编译成下面这css代码:

    .lazy-eval-scope {
      width: 9%;
    }

    2.1.6.3.如果出现当前作用域和外层作用域的延迟加载问题时,当前作用域有该变量直接使用当前作用域的,没有当前作用域的话使用外层作用域的变量。

    2.2混入:从一个规则集引入到另一个规则集的方式。

    在CSS代码中经常会出现比较多的重复的代码,但是在原生的CSS中没有太好的方法可以解决,当然也不是没有,比如使用单独的类名抽离,但是这带来了HTML文件中的class属性值会增加很多,在Less中采用了混合的语法解决了这个问题。

    1 .border{
    2     border:1px solid #000;
    3 }
    4 div{
    5     .border;//引入边框样式
    6 }

    示例中的混合写法,在引用时采用了简写方式,大家第一眼这代码是不是特别像类的选择器写法,其实不然,less标准的混合引入是要在后面带小括号的,所以示例中的标准写法是“.border()”。这一种简写和一种标准写法都没什么差别,具体遵循自己的开发文档的标准或者个人习惯就好。

    看到这个引入方式是不是有了一些启发呢?既然引入标准语法是可以带小括号,这个小括号就不是随便放在那里的,而是有一定的实际意义。这个实际意义就是混入可以理解为JS中的方法,在定义的时候可以定义形参,然后在引用的时候传入实参:

    1 .border(@width,@color){
    2     border:@width solid @color;
    3 }
    4 div{
    5     .border(1px,#000);
    6 }

    还可以使用默认值定义混入规则:

    1 .border(@1px,@color:#000){
    2     border:@widht solid @color;
    3 }
    4 div{
    5     .border;
    6 }

    这个看上去比JS更强大了是不是,关于混入还有比较多的特性,后面再具体来剖析。

    2.3导入:基于混入的模式,当在一个less文件中存在比较多的混入引入模式,又或者比较多的混入可以在多个less中重复引用,这时候就可以用一个独立的less文件来抽离这些混入模式,然后再将这个公共的less文件导入到各个依赖的less中,这也就实现了less的模块化。通过下面这个border实现三角形示例演示导入:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7     <title>Document</title>
     8     <link rel="stylesheet/less" href="trangleStyle.less">
     9 </head>
    10 <body>
    11     <div class="wrapper">
    12         <div class="box"></div>
    13     </div>
    14     <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.3/less.min.js"></script>
    15 </body>
    16 </html>
    HTML结构代码
     1 .trangle(T,@width,@color){
     2      0;
     3     height: 0;
     4     border- @width;
     5     border-style: solid;
     6     border-color:@color transparent transparent transparent;
     7     border-bottom- 0;
     8 }
     9 .trangle(R,@width,@color){
    10      0;
    11     height: 0;
    12     border- @width;
    13     border-style: solid;
    14     border-color:transparent @color transparent transparent;
    15     border-left- 0;
    16 }
    17 .trangle(B,@width,@color){
    18      0;
    19     height: 0;
    20     border- @width;
    21     border-style: solid;
    22     border-color:transparent transparent @color transparent;
    23     border-top- 0;
    24 }
    25 .trangle(L,@width,@color){
    26      0;
    27     height: 0;
    28     border- @width;
    29     border-style: solid;
    30     border-color:transparent transparent transparent @color;
    31     border-right- 0;
    32 }
    less依赖模块

    重点来看这个主入口less代码:通过@import引入外部less

     1 *{
     2     padding: 0;
     3     margin: 0;
     4     @width:300px;
     5     @color:red;
     6     @import url(./trangle.less);//也可以采用字符串写法:@import './trangle.less'
     7     body{
     8         .wrapper{
     9             position: absolute;
    10             width: @width;
    11             height: @width;
    12             top: 50%;
    13             left: 50%;
    14             margin-top: -@width/2;
    15             margin-left: -@width/2;
    16             .box{
    17                 .trangle(R,@width/2,@color);
    18             } 
    19         }
    20     }
    21 }

    可以通过切换trangle混入模块的第一个参数,来实现引入不同的样式,通常这个参数再less混入中被称为标识符。

    关于less的详细特性后面会有博客剖析。

  • 相关阅读:
    解决Maven项目 Missing artifact jdk.tools:jdk.tools:1.7的错误
    Hive三种不同的数据导出的方式
    【万字总结】图解堆算法、链表、栈与队列(多图预警)
    精心收集的Hadoop学习资料(持续更新)
    [大牛翻译系列]Hadoop 翻译文章索引
    sql server代理服务无法启动(SQL Agent):OpenSQLServerInstanceRegKey:GetRegKeyAccessMask failed (reason: 2).
    【转】sql server迁移到mysql
    linux shell中的EOF
    yum源出问题,rpmdb: BDB0113 Thread/process 17276/140338032428864 failed: BDB1507 Thread died in Berkeley DB library
    linux网卡出现问题:Job for network.service failed because the control process exited with error code问题
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/11080118.html
Copyright © 2011-2022 走看看