轻量级JavaScript(JS) HSLA颜色选择器

简介: 有时候我们需要一个颜色选择器让用户在某个对象上自定义颜色,这里我们实现一个简单的小型的js,交互式的颜色选择器。实战创建一个div块,用于实时观察颜色选择器的交互效果 创建一个可以实时显示当前颜色的块hsla color创建HSLA的滑块。

有时候我们需要一个颜色选择器让用户在某个对象上自定义颜色,这里我们实现一个简单的小型的js,交互式的颜色选择器。

实战

  1. 创建一个div块,用于实时观察颜色选择器的交互效果
  <div class="swatch" style="background-color: hsla(170, 55%, 55%, 1)">
  1. 创建一个可以实时显示当前颜色的块
<h3 class="colorname">hsla color</h3>
  1. 创建HSLA的滑块。
<form>
    <h6>HUE</h6>
    <div class="hue"><input name="hue" type="range" min="1" max="300" value="130"></div>

    <h6>SATURATION</h6>
    <div class="satcolor" style="background-color: rgb(255, 29, 25);">
        <div class="sat"><input name="sat" type="range" min="1" max="100" value="100"></div>
    </div>

    <h6>LIGHT</h6>
    <div class="light">
        <input name="light" type="range" min="1" max="100" value="55"></div>

    <h6>ALPHA</h6>
    <div class="alphaimg2">
        <div class="alpha">
            <input name="alpha" type="range" min="0" max="1" step="0.01" value="1">
        </div>
    </div>
</form>
  1. 给关键的hsla部分添加css样式
.hue {
    background-image: linear-gradient(to right, red, orange, yellow, green, blue, indigo, violet);
    border-radius: 3px;
    border-style: solid;
    border-width: thin;
}

.sat {
    background-image: linear-gradient(to right, #494949 0%, transparent 100%), linear-gradient(to right, #fff 0%, transparent 0%);
    border-radius: 3px;
    border-style: solid;
    border-width: thin;
}

.light {
    background-image: linear-gradient(to right, #000 0%, transparent 100%), linear-gradient(to right, #fff 0%, transparent 100%);
    border-radius: 3px;
    border-style: solid;
    border-width: thin;
}

.alpha {
    background-image: linear-gradient(to right, hsla(66, 31%, 94%, 0.18), white);
    border-radius: 3px;
    border-style: solid;
    border-width: thin;
}
  1. 监听html中颜色滑动条的事件
const colorChange = () => {
    document.querySelector('.colorname').textContent = getHSL()
    const swatch = document.querySelector('.swatch')
    swatch.style.backgroundColor = getHSL()
    document.querySelector('.satcolor').style.backgroundColor = getHSL()
}

let hue = 130    #设置hue的值
let sat = 100    #设置饱和度
let light = 55    #亮度
let alpha = 1    #不透明度

    const hueInput = document.querySelector('input[name=hue]')
    hueInput.addEventListener('input', () => {
        hue = hueInput.value
        colorChange()
    })
    const satInput = document.querySelector('input[name=sat]')
    satInput.addEventListener('input', () => {
        sat = satInput.value
        colorChange()
    })
    const lightInput = document.querySelector('input[name=light]')
    lightInput.addEventListener('input', () => {
        light = lightInput.value
        colorChange()
    })

    const alphaInput = document.querySelector('input[name=alpha]')
    alphaInput.addEventListener('input', () => {
        alpha = alphaInput.value
        colorChange()
    })

  1. 额外的hsl与rgba程序的互相转换
/**
 * 转换hsl为rgb
 * 输入的hsl值区间为[0,1],输出的rgb数组为[0,255]
 *  http://en.wikipedia.org/wiki/HSL_color_spacen 
 * @param   {number}  h       The hue
 * @param   {number}  s       The saturation
 * @param   {number}  l       The lightness
 * @return  {Array}           The RGB representation
 */
function hslToRgb(h, s, l){
    var r, g, b;

    if(s == 0){
        r = g = b = l; // achromatic
    }else{
        var hue2rgb = function hue2rgb(p, q, t){
            if(t < 0) t += 1;
            if(t > 1) t -= 1;
            if(t < 1/6) return p + (q - p) * 6 * t;
            if(t < 1/2) return q;
            if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
            return p;
        }

        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        var p = 2 * l - q;
        r = hue2rgb(p, q, h + 1/3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1/3);
    }

    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}

/**
 * 转换rgb为hsl
 * http://en.wikipedia.org/wiki/HSL_color_space.
 * 输入的 r, g, 和 b 区间为 [0, 255] 
 * 返回的 h, s, 和 l 区间为 [0, 1].
 *
 * @param   {number}  r       The red color value
 * @param   {number}  g       The green color value
 * @param   {number}  b       The blue color value
 * @return  {Array}           The HSL representation
 */
function rgbToHsl(r, g, b){
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b), min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if(max == min){
        h = s = 0; // achromatic
    }else{
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch(max){
            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
            case g: h = (b - r) / d + 2; break;
            case b: h = (r - g) / d + 4; break;
        }
        h /= 6;
    }

    return [h, s, l];
}

  1. 最终效果,本文的程序只包含核心部分..
    那个头发是用来测试的,使用imagefilter对图像进行处理,使用fabricjs库。有兴趣的可以看一下。


    img_0c3c5d59cbacd100adb1c1913ddce735.gif
    演示效果图

最后

前端的东西都挺灵活,方案也有很多,感兴趣的可以试一下。这里主要介绍一个简单的js颜色拾取器的实现。

参考

相关文章
|
5月前
|
资源调度 JavaScript 前端开发
Day.js极简轻易快速2kB的JavaScript库-替代Moment.js
dayjs是一个极简快速2kB的JavaScript库,可以为浏览器处理解析、验证、操作和显示日期和时间,它的设计目标是提供一个简单、快速且功能强大的日期处理工具,同时保持极小的体积(仅 2KB 左右)。
280 24
|
7月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
179 32
|
7月前
|
JavaScript 前端开发 API
纯js轻量级页面顶部Loading进度条插件
纯js轻量级页面顶部Loading进度条插件
|
7月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
11月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
177 3
springboot解决js前端跨域问题,javascript跨域问题解决
|
10月前
|
JavaScript 前端开发
【JavaScript】——JS基础入门常见操作(大量举例)
JS引入方式,JS基础语法,JS增删查改,JS函数,JS对象
|
11月前
|
JavaScript 前端开发
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
Moment.js与其他处理时间戳格式差异的JavaScript库相比有什么优势?
|
11月前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API