广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >VUE自定义取色器组件的实现
  • 342
分享到

VUE自定义取色器组件的实现

2024-04-02 19:04:59 342人浏览 安东尼
摘要

本文主要介绍了Vue 自定义取色器组件的实现,分享给大家,具体如下: 效果: 功能: 1。点击色块中任何一点,色块中的正方形显示该点的颜色。 2。点击色块上方的颜色圆点,色块选中该

本文主要介绍了Vue 自定义取色器组件的实现,分享给大家,具体如下:

效果:

功能:

1。点击色块中任何一点,色块中的正方形显示该点的颜色。

2。点击色块上方的颜色圆点,色块选中该颜色所在的位置,并在正方形中显示相应颜色。

3。上方圆点如果不是rgb格式,需要转换。

4。组件的大小从调用它的页面中传过去。

组件代码(canvasColor2.vue):

<template>
<!--    <div>-->
    <div id='outDiv' style="position: relative">
<!--        <canvas class="box" id="show" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas>-->
        <canvas class="box" id="show" width="300px" height="150px"></canvas>
        <div class="cover" id='cover'></div>
        <em id="cur"></em>
    </div>
</template>
 
<script>
    export default {
        name: "CanvasColor2",
        data() {
            return {
                canvas:null,
                context:null,
                paramColor:'',
                viewWidth:0,
                viewHeight:0
            }
        },
        props:{
            data:String,
            canvasWidth:Number,
            canvasHeight:Number,
        },
        created() {
            this.viewWidth = this.canvasWidth;
            this.viewHeight = this.canvasHeight;
        },
        mounted() {
            this.getParamColor('rgb(0,3,243)');
            this.initData();
            this.getDotList();
        },
        methods:{
            async getDotList(){
                this.canvas = document.getElementById("show");
                this.context = this.canvas.getContext("2d");
                console.log('getDotList',this.canvas.offsetLeft);
                // 获取整个 canvas 的像素信息
                var imgData = this.context.getImageData(0, 0,this.canvas.width+this.canvas.offsetLeft, this.canvas.height+this.canvas.offsetTop);
                // 清空数组
                var dotList = [];
                // 最后实现的效果每个点之间有一定的距离,gap 就是控制这个距离的
                var gap = 1;
                // 通过 width 和 height 遍历 imgData 对象,每隔 gap 个点取一次像素,找到红色的像素,
                // 每找到一个红色点,就创建一个 Dot 对象,并添加到 dotList 数组中
                for (var x = 0; x < imgData.width; x += gap) {
                    for (var y = 0; y < imgData.height; y += gap) {
                        var i = (y * imgData.width + x) * 4;
                        // console.log('getDotList',i);
                        // 判断像素点是不是红色
                        if (imgData.data[i] == this.paramColor[0] && imgData.data[i + 1] == this.paramColor[1] && imgData.data[i + 2] == this.paramColor[2]) {
                            var dot = {x,y} ;
                            dotList.push(dot);
                        }
                    }
                }
 
                if (dotList && dotList.length != 0) {
                    var cur = document.getElementById('cur');
                    cur.style.left = (dotList[0].x+this.canvas.offsetLeft)+'px';
                    cur.style.top = (dotList[0].y+this.canvas.offsetTop)+'px';
                }
                console.log('dot',dotList);
                return dotList;
            },
            initData() {
                var show = document.getElementById("show");
                show.setAttribute("width",this.canvasWidth);
                show.setAttribute("height",this.canvasHeight);
                // var cover = document.getElementById("cover");
                var cur = document.getElementById("cur");
                if (show.getContext) {//首先判断getcontext方法是否存在,这是一个良好的习惯
                    var context = show.getContext('2d');
                    var gradientBar = context.createLinearGradient(0, show.height, show.width, show.height);//创建渐变,前两个参数是渐变开始的横纵坐标,后两个参数是渐变结束的横纵坐标
 
                    gradientBar.addColorStop(0, '#ff0000');
                    gradientBar.addColorStop(1 / 6, '#ff00ff');
                    gradientBar.addColorStop(2 / 6, '#0000ff');
                    gradientBar.addColorStop(3 / 6, '#00ffff');
                    gradientBar.addColorStop(4 / 6, '#00ff00');
                    gradientBar.addColorStop(5 / 6, '#ffff00');
                    gradientBar.addColorStop(1, '#ff0000');
 
                    context.fillStyle = gradientBar;
                    context.fillRect(0, 0, show.width, show.width);
 
                    //白色透明黑色,明暗度实现
                    var lightToDark = context.createLinearGradient(0, 0, 0, show.width);
                    lightToDark.addColorStop(0, "#fff");
                    lightToDark.addColorStop(1 / 2, 'rgba(255,255,255,0)');
                    lightToDark.addColorStop(1, '#000');
 
                    context.fillStyle = lightToDark;
                    context.fillRect(0, 0, show.width, show.width);
 
                    show.addEventListener('click', function (e) {
                        var ePos = {
                            x: e.layerX || e.offsetX,
                            y: e.layerY || e.offsetY
                        }
                        //前两个参数为鼠标的位置,后娘个参数为canvas的宽高
                        var imgData = context.getImageData(ePos.x, ePos.y, show.width, show.height).data;
                        //可以通过下面的方法获得当前的rgb值
                        var red = imgData[0];
                        var green = imgData[1];
                        var blue = imgData[2];
                        var rgbStr = "rgb(" + red + "," + green + ',' + blue + ")";
                        console.log(rgbStr);
                        var cover = document.getElementById("cover");
                        cover.style.backgroundColor = rgbStr;
                        // var cur = document.getElementById("cur");
                        var outDiv = document.getElementById('outDiv');
                        console.log('outDiv',outDiv.offsetTop+','+outDiv.offsetHeight);
                        var pos = {
                            x: e.clientX,
                            y: e.clientY-outDiv.offsetTop//当该组件整体为相对位置时,y轴的坐标是当前点的位置-最外层距离顶点的高度
                        }
                        cur.style.left = pos.x + 'px';
                        cur.style.top = pos.y + 'px';
                        console.log('onmousemove',cur.style.left);
                    });
                }
            },
            getParamColor(color) {
                let param = color;
                console.log('getParamColor',param.length)
                param = param.substring(4,param.length-1);
                console.log('getParamColor',param)
                this.paramColor = param.split(',');
                this.getDotList();
                var cover = document.getElementById("cover");
                cover.style.backgroundColor = color;
            }
        }
    }
</script>
 
<style scoped>
    .box {
        position: relative;
        background-color: pink;
        
        border-radius: 15px;
    }
    
    #cur {
        width: 13px;
        height: 13px;
        outline: 2px solid #ffffff;
        margin-left: -1px;
        margin-top: -1px;
        position: absolute;
        border-radius: 13px;
    }
 
    #cover{
        position: absolute;
        left: 100px;
        top: 10px;
        width: 50px;
        height: 50px;
        background-color: antiquewhite;
        
        pointer-events: none;
    }
</style>

调用:

<template>
    <div style="background-color: black">
        <div style="display: flex; height: 44px;align-items: center">
            <div style="width: 100px;color: white">彩光</div>
            <div style="width: 100px;color: white">白光</div>
        </div>
        <div style="display: flex; height: 44px;align-items: center;">
            <div class="btn_style-common" style="background-color: rgb(41,53,255)" @click="selectColor('rgb(41,53,255)')"></div>
            <div class="btn_style-common" style=" background-color: rgb(255,202,83)" @click="selectColor('rgb(255,202,83)')"></div>
        </div>
        <CanvasColor2 ref="canvasColor" :data="color" :canvas-width="340" :canvas-height="170"></CanvasColor2>
    </div>
</template>
 
<script>
    import CanvasColor2 from "./CanvasColor2";
    import '../../util/utils.js'
    export default {
        name: "yxfColor",
        components:{
            CanvasColor2
        },
        data() {
            return {
                color:'rgb(100,255,83)'
            }
        },
        mounted() {
            this.$refs.canvasColor.getParamColor(this.color)
        },
        methods:{
            selectColor(color) {
                if (color.indexOf('rgb') != 0) {
                    this.color = color.colorRgb();
                } else {
                    this.color = color;
                }
 
                this.$refs.canvasColor.getParamColor(this.color)
            },
        }
    }
</script>
 
<style scoped>
.btn_style-common {
    height: 20px;width: 20px; border-radius: 20px;margin-left: 20px;
}
</style>

颜色从十六进制转换成RGB格式:utils.js

String.prototype.colorRgb = function () {
    // 16进制颜色值的正则
    var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
    // 把颜色值变成小写
    var color = this.toLowerCase();
    if (reg.test(color)) {
        // 如果只有三位的值,需变成六位,如:#fff => #ffffff
        if (color.length === 4) {
            var colorNew = "#";
            for (var i = 1; i < 4; i += 1) {
                colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
            }
            color = colorNew;
        }
        // 处理六位的颜色值,转为RGB
        var colorChange = [];
        for (var j = 1; j < 7; j += 2) {
            colorChange.push(parseInt("0x" + color.slice(j, j + 2)));
        }
        return "RGB(" + colorChange.join(",") + ")";
    } else {
        return color;
    }
};

注意:

组件中最外层的div的位置设为相对位置,页面中的坐标设置都是相对于最外层div的,所以在设置点击位置的时候要减去最外层div的距离顶部的高度。即

var pos = {
     x: e.clientX,
     y: e.clientY-outDiv.offsetTop//当该组件整体为相对位置时,y轴的坐标是当前点的位置-最外层距离顶点的高度
}

到此这篇关于VUE 自定义取色器组件的实现的文章就介绍到这了,更多相关VUE 取色器 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: VUE自定义取色器组件的实现

本文链接: https://www.lsjlt.com/news/161809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • VUE自定义取色器组件的实现
    本文主要介绍了VUE 自定义取色器组件的实现,分享给大家,具体如下: 效果: 功能: 1。点击色块中任何一点,色块中的正方形显示该点的颜色。 2。点击色块上方的颜色圆点,色块选中该...
    99+
    2022-11-12
  • vue递归实现自定义tree组件
    本文实例为大家分享了vue递归实现自定义tree组件的具体代码,供大家参考,具体内容如下 1. 在tree/index.vue中: <template> <...
    99+
    2022-11-12
  • vue实现自定义公共组件及提取公共的方法
    目录自定义公共组件及提取公共的方法vue自定义公共组件vue 提取公共的方法vue定义公用方法自定义公共组件及提取公共的方法 vue自定义公共组件 我们在编写页面的时候,会存在公共的...
    99+
    2022-11-13
  • Vue怎么实现自定义组件自动生成
    本文小编为大家详细介绍“Vue怎么实现自定义组件自动生成”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么实现自定义组件自动生成”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。就目前三大前端主流数据驱动框架...
    99+
    2023-07-04
  • Vue自定义铃声提示音组件的实现
    目录背景/前言组件的使用安装加载组件生效组件参数使用默认音效关于open参数的解释项目地址背景/前言 之前的一个功能需求,需要在页面接收消息,一旦有了新消息之后,需要用铃声进行提醒。...
    99+
    2022-11-13
  • vue实现自定义组件挂载原型上
    目录自定义组件挂载原型上以elementUI二次分装dialog举例在原型上挂载方法和组件挂在方法,在main.js中挂载组件自定义组件挂载原型上 以elementUI二次分装dia...
    99+
    2022-11-13
    vue自定义组件 vue挂载原型 vue组件挂载原型上
  • Vue自定义Form组件实现方法介绍
    目录1. 需求分析2. 表单功能的简单实现3. 抽象验证规则4. 支持 v-model 双向绑定5. 使用 $attrs 支持默认属性6. 父组件调用子组件中的方法1. 需求分析 我...
    99+
    2022-11-13
    Vue自定义Form组件 Vue Form组件 Vue Form
  • Android自定义组件:2、如何实现和使用自定义组件、自定义属性
    声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、如何实现自定义组件 步骤1:写 attrs.xml 资源文件 1、...
    99+
    2022-06-06
    属性 自定义属性 Android
  • vue如何实现自定义公共组件及提取公共方法
    这篇“vue如何实现自定义公共组件及提取公共方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何实现自定义公共组件及...
    99+
    2023-06-30
  • Vue实现自定义组件的方式引入图标
    这篇文章主要讲解了“Vue实现自定义组件的方式引入图标”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue实现自定义组件的方式引入图标”吧!前言在项目开发中,使用图标的方式有很多种,可以在i...
    99+
    2023-06-20
  • vue自定义全局组件实现弹框案例
    本文实例为大家分享了vue自定义全局组件实现弹框案例的具体代码,供大家参考,具体内容如下 说明:本案例是封装的一个弹框页面,因为只想要一个遮罩,内容自定义。因为ElementUI上已...
    99+
    2022-11-13
  • vue如何实现自定义模态弹窗组件
    本篇内容主要讲解“vue如何实现自定义模态弹窗组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue如何实现自定义模态弹窗组件”吧! 一、创建弹窗组件 qu...
    99+
    2022-10-19
  • vue实现echarts中的map自定义地图背景色
    效果图: 使用series-map.data.itemStyle. color定义每个地区背景色 vue代码 export default { props:{ ...
    99+
    2023-09-01
    echarts vue.js php
  • Vue之组件的自定义事件详解
    目录总结 <template> <div > <h2>{{msg}}</h2> <!-- 通过父组件给...
    99+
    2022-11-12
  • Vue如何实现自定义铃声提示音组件
    小编给大家分享一下Vue如何实现自定义铃声提示音组件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!组件的使用安装npm i easy-ring...
    99+
    2023-06-28
  • vue自定义翻页组件的方法
    本文实例为大家分享了vue自定义翻页组件的具体代码,供大家参考,具体内容如下 效果图如下: 1、在components建立page.vue文件 <template>  ...
    99+
    2022-11-13
  • android自定义组件实现方法
    本文实例讲述了android自定义组件实现方法。分享给大家供大家参考。具体如下: atts.xml: <?xml version="1.0" encoding...
    99+
    2022-06-06
    方法 Android
  • 如何使用vue组件自定义v-model实现一个Tab组件
    这篇文章主要介绍如何使用vue组件自定义v-model实现一个Tab组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果先让我们看一下例子的效果吧!v-model我们知道 v-mo...
    99+
    2022-10-19
  • Vue+elementUI下拉框自定义颜色选择器怎么实现
    这篇“Vue+elementUI下拉框自定义颜色选择器怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue+elem...
    99+
    2023-07-05
  • 基于Vue实现自定义组件的方式引入图标
    前言 在项目开发中,使用图标的方式有很多种,可以在iconfont上面找到合适的图标,通过http或者直接下载使用,这里我分享一种通过实现自定义组件的方式引入图标。 搭建环境 这里...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作