zoukankan      html  css  js  c++  java
  • 大家一起学习less 2:自带函数

    自带函数的意思是less自身准备的一套函数,可以让你直接在less文本中直接使用,它们90%是与颜色相关的。从源码可以看到,它们都挂在less.tree.functions之下:

    rgb
    rgba
    hsl
    hsla
    hue
    saturation
    lightness
    alpha
    saturate
    desaturate
    lighten
    darken
    fadein
    fadeout
    fade
    spin
    mix
    greyscale
    e
    escape
    %
    round
    ceil
    floor
    _math
    argb
    percentage
    color
    iscolor
    isnumber
    isstring
    iskeyword
    isurl
    ispixel
    ispercentage
    isem
    _isa
    

    下面是我对这些方法的一些理解

    
    tree.functions = {
        rgba: function (r, g, b, a) {
        //返回一个tree.Color 实例
        //https://github.com/cloudhead/less.js/blob/master/lib/less/tree/color.js
        },
        rgb: function (r, g, b) {
            return this.rgba(r, g, b, 1.0);
        },
        hsl: function (h, s, l) {
            return this.hsla(h, s, l, 1.0);
        },
        hsla: function (h, s, l, a) {
        //内部调用rgba
        },
        hue: function (color) {
            //传入一个tree.Color实例,返回它的色相
            //http://en.wikipedia.org/wiki/Hue
            return new(tree.Dimension)(Math.round(color.toHSL().h));
        },
        saturation: function (color) {
            //传入一个tree.Color实例,返回它的饱和度
            //http://www.ncsu.edu/scivis/lessons/colormodels/color_models2.html
            return new(tree.Dimension)(Math.round(color.toHSL().s * 100), '%');
        },
        lightness: function (color) {
            //传入一个tree.Color实例,返回它的亮度
            //http://msdn.microsoft.com/en-us/library/ie/aa358801(v=vs.85).aspx
            //http://en.wikipedia.org/wiki/Lightness
            return new(tree.Dimension)(Math.round(color.toHSL().l * 100), '%');
        },
        red: function (color) {
            //传入一个tree.Color实例,返回它的red值,一个颜色是由红绿蓝这三原色组成,外加透明度
            return new(tree.Dimension)(color.rgb[0]);
        },
        green: function (color) {
            //传入一个tree.Color实例,返回它的green值
            return new(tree.Dimension)(color.rgb[1]);
        },
        blue: function (color) {
            //传入一个tree.Color实例,返回它的blue值
            return new(tree.Dimension)(color.rgb[2]);
        },
        alpha: function (color) {
            //传入一个tree.Color实例,返回它的透明度
            return new(tree.Dimension)(color.toHSL().a);
        },
        //上面hue,saturation,lightness,red,green,alpha是用于取得颜色值的具体属性值的
        luma: function (color) {
        /*
    返回一个与当前传入的颜色值对比比较强烈的颜色
    This adds a contrast function that given an existing colour, returns a contrasting colour value, either black/white, or other configurable light/dark values, and the threshold at which the colour choice is made is configurable too.
    Cases where you might want to use this:
    
    ensuring text contrasts with a given background colour
    ensuring background contrasts with a given text colour
    ensuring borders contrast with background
    ensuring links contrast with normal text
    building gradients with sufficient colour range
    这形成了对比函数,给出一个现有的色彩,返回一个对比颜色值,要么黑/白,或其他可配置的光/暗值,和的门槛,颜色的选择也是可配置的。
    情况下,您可能想要使用这个:
    确保文本与给定的背景颜色
    确保背景与给定的文本颜色
    确保边界与背景相比
    确保与正常文本链接的对比
    创建具有足够的颜色范围渐变
    https://github.com/cloudhead/less.js/pull/730
             */
        },
        saturate: function (color, amount) {
        // 增加饱和度,第二个参数为百分数,内部调用hsla
        },
        desaturate: function (color, amount) {
        // 减小饱和度,第二个参数为百分数,内部调用hsla
        },
        lighten: function (color, amount) {
        // 变淡一点,第二个参数为百分数,内部调用hsla
        },
        darken: function (color, amount) {
        // 变暗一点,第二个参数为百分数,内部调用hsla
        },
        fadein: function (color, amount) {
        //通过改变透明度,让它显示出来
        },
        fadeout: function (color, amount) {
        //通过改变透明度,让它隐褪
        },
        fade: function (color, amount) {
        //通过改变透明度
        },
        spin: function (color, amount) {
        //在color的hue 中增加或减少amount值,amount为数值
        },
        //
        // Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
        // http://sass-lang.com
        //
        mix: function (color1, color2, weight) {
        //将两个颜色合并成一个新的颜色
        },
        greyscale: function (color) {
            //减少当前颜色的灰度
            return this.desaturate(color, new(tree.Dimension)(100));
        },
        contrast: function (color, dark, light, threshold) {
            if (typeof light === 'undefined') {
                light = this.rgba(255, 255, 255, 1.0);
            }
            if (typeof dark === 'undefined') {
                dark = this.rgba(0, 0, 0, 1.0);
            }
            if (typeof threshold === 'undefined') {
                threshold = 0.43;
            } else {
                threshold = threshold.value;
            }
            if (((0.2126 * (color.rgb[0]/255) + 0.7152 * (color.rgb[1]/255) + 0.0722 * (color.rgb[2]/255)) * color.alpha) < threshold) {
                return light;
            } else {
                return dark;
            }
        },
        e: function (str) {
            return new(tree.Anonymous)(str instanceof tree.JavaScript ? str.evaluated : str);
        },
        escape: function (str) {
            return new(tree.Anonymous)(encodeURI(str.value).replace(/=/g, "%3D").replace(/:/g, "%3A").replace(/#/g, "%23").replace(/;/g, "%3B").replace(/\(/g, "%28").replace(/\)/g, "%29"));
        },
        '%': function (quoted /* arg, arg, ...*/) {
            var args = Array.prototype.slice.call(arguments, 1),
            str = quoted.value;
    
            for (var i = 0; i < args.length; i++) {
                str = str.replace(/%[sda]/i, function(token) {
                    var value = token.match(/s/i) ? args[i].value : args[i].toCSS();
                    return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;
                });
            }
            str = str.replace(/%%/g, '%');
            return new(tree.Quoted)('"' + str + '"', str);
        },
        round: function (n, f) {
          // round(1.67); //四舍五入 returns 2
        },
        ceil: function (n) {
          //ceil(2.4);   //向上取整 returns 3
        },
        floor: function (n) {
          // floor(2.6); //向下取整 returns 2
        },
        argb: function (color) {
          // 兼容之前的版本,内部调用rgba
        },
        percentage: function (n) {
         //  percentage(0.5); // returns 50%
        },
        color: function (n) {
            if (n instanceof tree.Quoted) {
                return new(tree.Color)(n.value.slice(1));
            } else {
                throw {
                    type: "Argument",
                    message: "argument must be a string"
                };
            }
        },
        iscolor: function (n) {
         //判定是颜色
        },
        isnumber: function (n) {
            return this._isa(n, tree.Dimension);
        },
        isstring: function (n) {
            return this._isa(n, tree.Quoted);
        },
        iskeyword: function (n) {
        //判定是关键字
        },
        isurl: function (n) {
          //判定URL
        },
        ispixel: function (n) {
         //判定单位是px
            return (n instanceof tree.Dimension) && n.unit === 'px' ? tree.True : tree.False;
        },
        ispercentage: function (n) {
        //判定单位是% 
        },
        isem: function (n) {
        //判定单位是em
        },
    
        /* Blending modes */
    
        multiply: function(color1, color2) {
            var r = color1.rgb[0] * color2.rgb[0] / 255;
            var g = color1.rgb[1] * color2.rgb[1] / 255;
            var b = color1.rgb[2] * color2.rgb[2] / 255;
            return this.rgb(r, g, b);
        },
        screen: function(color1, color2) {
            var r = 255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255;
            var g = 255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255;
            var b = 255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255;
            return this.rgb(r, g, b);
        },
        overlay: function(color1, color2) {
            var r = color1.rgb[0] < 128 ? 2 * color1.rgb[0] * color2.rgb[0] / 255 : 255 - 2 * (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255;
            var g = color1.rgb[1] < 128 ? 2 * color1.rgb[1] * color2.rgb[1] / 255 : 255 - 2 * (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255;
            var b = color1.rgb[2] < 128 ? 2 * color1.rgb[2] * color2.rgb[2] / 255 : 255 - 2 * (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255;
            return this.rgb(r, g, b);
        },
        softlight: function(color1, color2) {
            var t = color2.rgb[0] * color1.rgb[0] / 255;
            var r = t + color1.rgb[0] * (255 - (255 - color1.rgb[0]) * (255 - color2.rgb[0]) / 255 - t) / 255;
            t = color2.rgb[1] * color1.rgb[1] / 255;
            var g = t + color1.rgb[1] * (255 - (255 - color1.rgb[1]) * (255 - color2.rgb[1]) / 255 - t) / 255;
            t = color2.rgb[2] * color1.rgb[2] / 255;
            var b = t + color1.rgb[2] * (255 - (255 - color1.rgb[2]) * (255 - color2.rgb[2]) / 255 - t) / 255;
            return this.rgb(r, g, b);
        },
        hardlight: function(color1, color2) {
            var r = color2.rgb[0] < 128 ? 2 * color2.rgb[0] * color1.rgb[0] / 255 : 255 - 2 * (255 - color2.rgb[0]) * (255 - color1.rgb[0]) / 255;
            var g = color2.rgb[1] < 128 ? 2 * color2.rgb[1] * color1.rgb[1] / 255 : 255 - 2 * (255 - color2.rgb[1]) * (255 - color1.rgb[1]) / 255;
            var b = color2.rgb[2] < 128 ? 2 * color2.rgb[2] * color1.rgb[2] / 255 : 255 - 2 * (255 - color2.rgb[2]) * (255 - color1.rgb[2]) / 255;
            return this.rgb(r, g, b);
        },
        difference: function(color1, color2) {
            var r = Math.abs(color1.rgb[0] - color2.rgb[0]);
            var g = Math.abs(color1.rgb[1] - color2.rgb[1]);
            var b = Math.abs(color1.rgb[2] - color2.rgb[2]);
            return this.rgb(r, g, b);
        },
        exclusion: function(color1, color2) {
            var r = color1.rgb[0] + color2.rgb[0] * (255 - color1.rgb[0] - color1.rgb[0]) / 255;
            var g = color1.rgb[1] + color2.rgb[1] * (255 - color1.rgb[1] - color1.rgb[1]) / 255;
            var b = color1.rgb[2] + color2.rgb[2] * (255 - color1.rgb[2] - color1.rgb[2]) / 255;
            return this.rgb(r, g, b);
        },
        average: function(color1, color2) {
           //取两个颜色的平均值
        },
        negation: function(color1, color2) {
            var r = 255 - Math.abs(255 - color2.rgb[0] - color1.rgb[0]);
            var g = 255 - Math.abs(255 - color2.rgb[1] - color1.rgb[1]);
            var b = 255 - Math.abs(255 - color2.rgb[2] - color1.rgb[2]);
            return this.rgb(r, g, b);
        }
    };
    

    less官网的文档很不全啊,只能参照sass的看看

  • 相关阅读:
    SVN的具体使用方法介绍(安装以及操作)
    谈谈敏捷开发
    008.MVC与数据库的交互
    001.MVC基本概述
    WebApi接口测试工具
    014.存储过程(sql实例)
    我们为什么需要DTO(数据传输对象)
    ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)
    面试题库[2]
    关于单例模式getInstance()的使用
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2683686.html
Copyright © 2011-2022 走看看