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

1.问题复现场景

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

由于需要替换第三方插件的颜色选择器,所以打算用element-ui直接替换,故在第三方插件初始化颜色选择器的类中返回element-uicolor-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 {
    ... // 其它代码保持不变
}
相关推荐
ITresearchGuest2 小时前
AI 焦虑下,前端该何去何从
前端·人工智能
Codiggerworld3 小时前
Chrome DevTools 隐藏神技:这 5 个调试技巧你可能从来没用过
前端·chrome·chrome devtools
旋生万物3 小时前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf
IT_陈寒3 小时前
被Java的final坑惨了,这些细节你可能也忽略了
前端·人工智能·后端
kyriewen3 小时前
我带着DeepSeek Harness跑了一周真实需求——这份避坑速查表请收好
前端·ai编程·deepseek
计算机魔术师4 小时前
OpenAI不单独发o3了,Altman说GPT-5才是终局
前端
一座古城4 小时前
Claude Code 架构源码解析:AI 应用开发的范式跃迁
前端·后端
K哥爬虫4 小时前
【JS 逆向百例】Vaptcha V4 手势验证码逆向分析
前端·后端
用户921080262864 小时前
复盘 AI Coding 工作台的流式链路:从 Sender 输入到 SSE 分流,再到 BubbleList 和右侧预览
前端
了不起的小明4 小时前
SwiftMesh:本地 3D 模型查看器,加密交付 + 转盘录屏一站式搞定,开源免费
前端