美文网首页
CSS预处理器之less0731

CSS预处理器之less0731

作者: 煤球快到碗里来 | 来源:发表于2019-07-31 18:12 被阅读0次

CSS预处理器之less

1.基础内容

1.1什么是CSS预处理器?
  • CSS 预处理器就是用某一种语言用来为 CSS 增加一些动态语言的的特性(变量、函数、继承等),CSS预处理器可以让你的 CSS 更见简洁,适应性更强,代码更直观等诸多好处
    简而言之: CSS预处理器就是升级版CSS
  • 2.常见的CSS预处理器 :Less、 Sass 、Stylus
1.2 为什么需要less?
  • CSS的语法虽然简单, 但它同时也带来一些问题
  • CSS需要书写大量看似没有逻辑的代码, 不方便维护及扩展, 也不利于复用,造成这些原因的本质源于CSS是一门非程序式的语言, 没有变量/函数/作用域等概念
1.3 什么是less(Leaner Style Sheets)?
  • Less 是一门 CSS 预处理语言,为CSS赋予了动态语言的特征。它扩展了 CSS 语言,增加了变量、Mixin(混合)、嵌套、函数和运算等特性,使 CSS 更易维护和扩展。
  • 一句话:用类似JS的语法去写CSS
1.4 less基本使用

第一种用法

  • 在浏览器中直接运行
    编写less文件-->引入less文件-->引入less.js-->运行

  • 注意点:

    • <link rel="stylesheet/less" href="css/index.less">  注意和引入css区别
      
    • 一定要先引入less.css再引入less.js

      如果less代码是写到单独的文件中, 一定要在服务端环境运行才能生效

第二种用法

1.5 注释
  • less中的注释和JS中的注释一样, 也有单行注释和多行注释
    less中单行注释和多行注释最大的区别在于: 是否会被编译
    单行注释不会被编译(不会出现在编译后的文件中)
    多行注释会被编译 (会出现在编译后的文件中)

2.变量定义与使用

2.1基本使用
  • /*
    1.什么是变量?
    和js中的概念基本一样
    
    2.less中定义变量的格式
    @变量名称: 值;
    
    3.less中使用变量的格式
    @变量名称;
    @w: 400px;
    @h: 200px;
    
    4.和js一样可以将一个变量赋值给另外一个变量
    @变量名称 : @变量名称;
    @h: @w;
    
    5.和js一样less中的变量也有全局变量和局部变量
    定义在{}外面的就是全局的变量, 什么地方都可以使用
    定义在{}里面的就是局部变量, 只能在{}中使用
    
    注意定: less中的变量是延迟加载的, 写到后面也能在前面使用
    
    6.和js一样不同作用域的变量不会相互影响, 只有相同作用域的变量才会相互影响(后定义的覆盖先定义的)
      和js一样在访问变量时会采用就近原则
    */
    
2.2 变量插值(基本不用)
  • @size: 200px;
    @w: width;
    @s: div;
    /*
    1.什么是变量插值?
    在less中如果属性的取值可以直接使用变量, 但是如果是属性名称或者选择器名称并不能直接使用变量
    如果属性名称或者选择器名称想使用变量中保存的值, 那么必须使用变量插值的格式
    
    2.变量插值的格式
    格式: @{变量名称}
    */
    @{s}{
      @{w}: @size;
      height: @size;
      background: red;
    }
    

3. less中的运算

  • //想要让一个元素居中  传统做法
    
    div{
        width: 200px;
        height: 200px;
        background: blue;
        position: absolute;
        left: 50%;
        /*以下的方式不利于编码, 因为需要我们自己口算元素宽度的一半是多少*/
        /*margin-left: -100px;*/
        /*以下的方式不利于兼容, 因为transform属性是CSS3新增的, 只有支持C3属性的浏览器才可以使用*/
        /*transform: translateX(-50%);*/
        /*在CSS3中新增了一个calc函数, 可以实现简单的+ - * / 运算*/
        /*margin-left: calc(-200px / 2);*/
        margin-left: calc(-200px * 0.5);
    }
    
    /*less中的运算和CSS3中新增的calc函数一样, 都支持+ - * / 运算*/
    //margin-left: (-200px * 0.5);
    margin-left: (-200px / 2);
    

4.less中的混合

4.1 不带参数的混合
  • /*
    1.什么是less中的混合(Mix in)?
    将需要重复使用的代码封装到一个类中, 在需要使用的地方调用封装好的类即可
    在预处理的时候less会自动将用到的封装好的类中的代码拷贝过来
    本质就是ctrl+c  --> ctrl + v
    
    2.less中混合的注意点:
    如果混合名称的后面没有(), 那么在预处理的时候, 会保留混合的代码
    如果混合名称的后面加上(), 那么在预处理的时候, 不会保留混合的代码
     */
    
    .center{
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
    }
    
    .center(){
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
    }
    
    .father{
      width: 300px;
      height: 300px;
      background: red;
      .center();
      .son{
        width: 200px;
        height: 200px;
        background: blue;
        .center();
      }
    }
    
4.2 带参数的混合
  • // 这里就是带参数的混合
    /*
    .whc(@w, @h, @c){
      width: @w;
      height: @h;
      background: @c;
    }
     */
    // 这里就是带参数的混合, 并且带默认值
    .whc(@w:100px, @h:100px, @c:pink){
      width: @w;
      height: @h;
      background: @c;
    }
    .box1{
      //直接传递参数
      .whc(200px, 200px, red);
      // 这里是给混合的指定形参传递数据
      .whc(@c:red);
    }
    .box2{
      .whc(300px, 300px, blue);
    }
    
4.3 混合的可变参数
  • /*
    1.less中的@arguments和js中的arguments一样, 可以拿到传递进来的所有形参,不用一个一个传
    传递参数如下1  不传递参数就写...如下2
    但是比如transition 需要至少接受两个参数,为了不错误,就先传递两个参数,在写... 如3
    
    2.less中的...表示可以接收0个或多个参数
    如果形参列表中使用了..., 那么...必须写在形参列表最后
    */
    /*
    1.....
    .animate(@name, @time, @mode, @delay){
      //transition: @name @time @mode @delay;
      transition: @arguments;
    }
    
    2.
    .animate(...){
      //transition: @name @time @mode @delay;
      transition: @arguments;
    }
    3.
    */
    .animate(@name, @time, ...){
      //transition: @name @time @mode @delay;
      transition: @arguments;
    }
    div{
      width: 200px;
      height: 200px;
      background: red;
      //transition: all 4s linear 0s;
      //.animate(all, 4s);
      .animate(all, 4s, linear, 0s);
    }
    div:hover{
      width: 400px;
      height: 400px;
      background: blue;
    }
    
4.4 混合中的匹配模式及通用匹配模式
  • /*
    混合的匹配模式:
    就是通过混合的第一个字符串形参,来确定具体要执行哪一个同名混合
    
    @_: 表示通用的匹配模式
    什么是通用的匹配模式?
    无论同名的哪一个混合被匹配了, 都会先执行通用匹配模式中的代码。
    比如我们实现一个三角形无论上下左右都得写width,height, border-style,而通过通用的匹配模式,就能把这些重复的代码写在一个里面,减少代码冗余.
    .triangle(Down, @width, @color){
      width: 0;
      height: 0;
      border-width: @width;
      border-style: solid solid solid solid;
      border-color: @color transparent transparent transparent;
    }
    */
    //我们来通过less实现一个三角形
    .triangle(@_, @width, @color){
      width: 0;
      height: 0;
      border-style: solid solid solid solid;
    }
    //下三角
    .triangle(Down, @width, @color){
      border-width: @width;
      border-color: @color transparent transparent transparent;
    }
    //下三角
    .triangle(Top, @width, @color){
      border-width: @width;
      border-color: transparent transparent @color transparent;
    }
    //左三角
    .triangle(Left, @width, @color){
      border-width: @width;
      border-color: transparent @color transparent transparent;
    }
    //右三角
    .triangle(Right, @width, @color){
      border-width: @width;
      border-color: transparent transparent transparent @color;
    }
    div{
      //.triangle(Down, 80px, green);
      //.triangle(Top, 80px, green);
      //.triangle(Left, 80px, green);
      .triangle(Right, 80px, green);
    }
    

5.less中导入其他less文件

  • @import "triangle.less";
    @import "triangle"; 可以不加后缀

6.less中的内置函数

  • <script>
        /*
        由于less的底层就是用JavaScript实现的,
        所以JavaScript中常用的一些函数在less中都支持
        */
        // 混杂方法
        /*
        image-size("file.jpg"); // => 100px 50px
        image-width("file.jpg"); // => 100px
        image-height("file.jpg"); // => 50px
    
        // 单位转换
        convert(9s, "ms"); // => 9000ms
        convert(14cm, mm); // => 140mm
        convert(8, mm); // => 8
    
        // 列表
        @list: "A", "B", C, "D";
        length(@list); // => 4
        extract(@list, 3); // => C
        */
        // 数学
        /*
        ceil(2.1); // => 3 向上取整
        floor(2.1); // => 2 向下取整
        percentage(.3); // => 30% 转百分比
        round(1.67, 1); // => 1.7 四舍五入,保留一位小数点
        sqrt(25cm); // => 5cm 取平方根
        abs(-5cm); // => 5cm 取绝对值
        pi(); // => 3.141592653589793 圆周率π
        max(3px, 42px, 1px, 16px); // => 42px
        min(3px, 42px, 1px, 16px); // => 1px
        */
        // 字符串
        /*
        replace("Hi Tom?", "Tom", "Jack"); // => "Hi Jack"
        */
        // 判断类型
        /*
        isnumber(56px); // => true 是否含数字
        isstring("string"); // => true
        iscolor(#ff0); // => true
        iscolor(blue); // => true
        iskeyword(keyword); // => true
        isurl(url(...)); // => true
        ispixel(56px); // => true
        isem(7.8em); // => true
        ispercentage(7.8%); // => true
        isunit(4rem, rem); // => true 是否为指定单位
        isruleset(@rules); // => true 是否为变量
        */
        // 颜色操作
        /*
        增加饱和度
        saturate(color, 20%)
        减少饱和度
        desaturate(color, 20%)
        增加亮度
        lighten(color, 20%)
        减少亮度
        darken(color, 20%)
        降低透明度
        fadein(color, 10%)
        增加透明度
        fadeout(color, 10%)
        设置绝对不透明度(覆盖原透明度)
        fade(color, 20%)
        旋转色调角度
        spin(color, 10)
        将两种颜色混合,不透明度包括在计算中。
        mix(#f00, #00f, 50%)
        与白色混合
        tint(#007fff, 50%)
        与黑色混合
        shade(#007fff, 50%)
        灰度,移除饱和度
        greyscale(color)
        返回对比度最大的颜色
        contrast(color1, color2)
        */
        // 颜色混合
        /*
        每个RGB 通道相乘,然后除以255
        multiply(color1, color2);
        与 multiply 相反
        screen(color1, color2);
        使之更浅或更暗
        overlay(color1, color2)
        避免太亮或太暗
        softlight(color1, color2)
        与overlay相同,但颜色互换
        hardlight(color1, color2)
        计算每个通道(RGB)基础上的两种颜色的平均值
        average(color1, color2)
        */
    
    </script>
    

7.less中的层级结构

在less中使用伪元素和伪类

  • /*如果在某一个选择器的{}中直接写上了其它的选择器, 会自动转换成后代选择器
      例如以下代码: .father .son
    */
    .father{
      width: 300px;
      height: 300px;
      background: red;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      /*
      .son{
        // 这里的&的作用, 是告诉less在转换的时候不用用后代来转换, 直接拼接在当前选择器的后面即可
        如果不加&,就会变成这样 .father .son :hover多了一个空格
        */
        &:hover{
          background: skyblue;
        }
        width: 200px;
        height: 200px;
        background: blue;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }
       
    
      &::before{
        content: "子元素";
        display: block;
        background: yellowgreen;
        width: 100px;
        height: 100px;
      }
    }
    

8. less中的继承

  • .center{
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
    }
    /*
    1.less中的继承和less中混合的区别
    1.1使用时的语法格式不同 .father:extend(.center){}
    1.2转换之后的结果不同(混合是直接拷贝, 继承是并集选择器)
    */
    .father:extend(.center){
      width: 300px;
      height: 300px;
      background: red;
      //.center;
      .son:extend(.center){
        width: 200px;
        height: 200px;
        background: blue;
        //.center;
      }
    }
    

9.less中的条件判断

  • /*
    less中可以通过when给混合添加执行限定条件, 只有条件满足(为真)才会执行混合中的代码
    when表达式中可以使用比较运算符(> < >= <= =)、逻辑运算符、或检查函数来进行条件判断
    检查函数在上面
    */
    /*
    .size(@width,@height) when (@width = 100px){
      width: @width;
      height: @height;
    }
     */
    // (),()相当于JS中的||
    /*
    .size(@width,@height) when (@width = 100px),(@height = 100px){
      width: @width;
      height: @height;
    }
     */
    // ()and()相当于JS中的&&
    /*
    .size(@width,@height) when (@width = 100px)and(@height = 100px){
      width: @width;
      height: @height;
    }
     */
    .size(@width,@height) when (ispixel(@width)){
      width: @width;
      height: @height;
    }
    div{
      .size(100px,100px);
      background: red;
    }
    

相关文章

  • CSS预处理器之less0731

    CSS预处理器之less 1.基础内容 1.1什么是CSS预处理器? CSS 预处理器就是用某一种语言用来为 CS...

  • 初识css预编译之Less

    什么是less less是CSS的预处理器,学过C语言的同学应该对预处理器挺熟悉的把,C语言的编译过程就分为:预处...

  • Scss与 Less 对比

    相同点: 两者都是css预处理器 能够更快速的编写代码 结构清晰,便于维护 相比较: sass是较成熟的CSS预处...

  • 在Vue.js中使用Stylus预处理器

    概述 什么是Stylus Stylus是一个CSS预处理器。 什么是CSS预处理器 关于CSS预处理器,推荐先行阅...

  • 十分钟入门sass

    什么是css预处理器 :bookmark: CSS 预处理器是一个能让你通过预处理器自己的语法生成CSS的工具。 ...

  • CSS预处理器之Less

    CSS预处理器 什么是CSS预处理器 CSS 预处理器就是用某一种语言用来为 CSS 增加一些动态语言的的特性(变...

  • sass是什么?为什么要使用sass?使用sass,以及其他一些

    什么是scss? Sass属于CSS预处理器,那什么是 CSS 预处理器呢? CSS 预处理器定义了一种新的语言,...

  • Sass和Less

    什么是Sass和Less? Sass和Less都属于CSS预处理器。 什么是 CSS 预处理器呢? CSS 预处理...

  • css预处理器之sass0805

    css预处理器之sass 1.基础 1.什么是SASS(Syntactically Awesome Stylesh...

  • web开发小部分单词

    Sass=scss编程 Sass 是css预处理器 css预处理器用编程思维写一些可以转成css的东西 优点:更加...

网友评论

      本文标题:CSS预处理器之less0731

      本文链接:https://www.haomeiwen.com/subject/sgztdctx.html