element-ui的el-color-picker颜色选择器组件,弹窗定位在左上角的问题排查和解决

1.问题复现场景

拿官网实例截个图说明一下

由于需要替换第三方插件的颜色选择器,所以打算用element-ui直接替换,故在第三方插件初始化颜色选择器的类中返回element-ui的color-picker组件

typescript 复制代码
import { ColorPicker } from 'element-ui';

class ColorController {
    constructor(parent, object, property, rgbScale) {
        const Picker = Vue.extend(ColorPicker)
        const instance = new Picker({
            propsData: {
                value: object[property],
                showAlpha: true
            }
        })

        instance.$on('change', (v) => {
            console.log('color-change', v)
            this._setValueFromHexString(v);
        })
        let div = document.createElement('div')
        this.$widget.appendChild(div) // this.$widget为第三方插件生成颜色选择器的dom节点
        instance.$mount(div)
    }
  ... // 省略第三方插件其他源代码
}

2.问题根源

1.el-color-picker颜色选择器弹窗基于父级组件dom动态计算所在位置,显示定位; 2.由于第三方插件ColorController类构造函数内生成el-color-picker组件实例所挂载的dom节点被替换,导致获取到this.$parent.$el为空,在渲染颜色选择器弹窗时,无法得到有效的位置,所以弹窗只能显示在页面左上角

3.解决方案

1.自定义一个颜色选择器组件,导入el-color-picker组件进行包装套壳,确保颜色选择器弹窗能获取正确的父级节点

xml 复制代码
// 自定义颜色选择器组件 color-picker
<template>
  <div class="color-picker">
    <ColorPicker v-model="color" :showAlpha="showAlpha"></ColorPicker>
  </div>
</template>

<script>
import { ColorPicker } from 'element-ui';
export default {
  name: 'color-picker',
  props: {
    value: {
      type: String,
      default: '#ffffff',
    },
    showAlpha: {
      type: Boolean,
      default: true
    }
  },
  components: {
    ColorPicker,
  },
  data() {
    return {
    };
  },
  computed: {
    color: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('change', val);
      },
    },
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
.color-picker {
  background-color: transparent;
}
</style>

2.修改第三方组件库ColorController类

javascript 复制代码
import ColorPicker from './color-picker.vue'; // 引入包装过的自定义组件

class ColorController {
    ... // 其它代码保持不变
}
相关推荐
风骏时光牛马7 分钟前
AI开源工具一站式体验:上手探索原生AI能力
前端
鬼手点金8 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的9 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday9 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室9 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan10 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床10 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a11 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台11 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉