element icon indicating copy to clipboard operation
element copied to clipboard

[Bug Report] If there is a full screen effect on a DIV, the Popover and Tooltip will not display properly.如果一个DIV开启全屏效果,则Popover和Tooltip不能正常显示。

Open gongzk opened this issue 5 years ago • 18 comments

Element UI version

2.12.0

OS/Browsers version

Windows 10 Pro 1903 / Google Chrome 77.0.3865.90

Vue version

2.6.10

Reproduction Link

https://jsfiddle.net/3ej0x5yf/

Steps to reproduce

click the blue button to full screen, the Popover and Tooltip will not display properly

What is Expected?

If there is a full screen effect on a DIV, the Popover and Tooltip is ok.

What is actually happening?

If there is a full screen effect on a DIV, the Popover and Tooltip will not display properly

gongzk avatar Oct 12 '19 02:10 gongzk

如果一个DIV开启全屏效果,则Popover和Tooltip不能正常显示。

gongzk avatar Oct 12 '19 02:10 gongzk

如果一个DIV开启全屏效果,则Popover和Tooltip不能正常显示。

我也遇到了这个问题,不能正常显示的原因是因为Popover和Tooltip是直接挂在body下,局部全屏只能全屏你这个div以及内部的元素。 不过我参考官方提供api修改Popover的opover-options好像没什么效果。

wen81643956 avatar Nov 21 '19 01:11 wen81643956

Hi all, I just fix this using body tag element. if el-tooltip element apended to body means you should assign the body element as fullscreen element..

var element = document.getElementsByTagName('body')[0];

prasanthmaran1 avatar Feb 11 '20 08:02 prasanthmaran1

同样问题,觉得 tooltip 和 popover 应该提供类似 getContainer 之类的 props

silent-tan avatar Feb 12 '20 02:02 silent-tan

最近也遇到了同样的问题,看了下element的源码,发现可以这么解决~ popover可以直接加:append-to-body="false",但是tooltip麻烦点,加完appendToBody后发现弹出内容没有插入dom……所以自己写了个指令作为辅助,解决问题^_^

/*
!!! 使用此指令需要先设置<el-tooltip :append-to-body="false">

例子1:v-el-tooltip-append-to="$des"
例子2:v-el-tooltip-append-to
说明:$des为要将文字提示的弹出框插入的目的节点元素,不写则默认插入指令绑定节点元素的父节点
*/
import { DirectiveBinding } from 'vue/types/options';
import { VNode } from 'vue';

export default {
  bind(el: any, binding: DirectiveBinding, vnode: VNode) {
    el.tooltipAppend = () => {
      // 插入的目的节点元素
      const des = binding.value || el.parentElement;
      // 获取tooltip的节点元素popper
      const popper = vnode.componentInstance && vnode.componentInstance.$refs.popper as Element;
      // 将popper插入目的节点元素
      if (popper && des && !document.getElementById(popper.id)) {
        des.appendChild(popper);
      }
    };

    el.removeEventListener('mouseenter', el.tooltipAppend);
    el.addEventListener('mouseenter', el.tooltipAppend);
  },
  unbind(el: any) {
    el.removeEventListener('mouseenter', el.tooltipAppend);
  },
};

linjiayu2012 avatar Mar 26 '20 03:03 linjiayu2012

@linjiajian999 如果我在 el-dialog 中使用了 el-tooltip,你的辅助指令也能显示加了 append-to-body="false" 的 tooltip 吗

Leecason avatar Mar 29 '20 11:03 Leecason

@linjiajian999 如果我在 el-dialog 中使用了 el-tooltip,你的辅助指令也能显示加了 append-to-body="false" 的 tooltip 吗

@Leecason 老哥是不是 艾特 错人了

linjiajian999 avatar Mar 29 '20 11:03 linjiajian999

@linjiajian999 如果我在 el-dialog 中使用了 el-tooltip,你的辅助指令也能显示加了 append-to-body="false" 的 tooltip 吗

@Leecason 老哥是不是 艾特 错人了

对不起~😄

Leecason avatar Mar 29 '20 11:03 Leecason

@linjiayu2012 如果我在 el-dialog 中使用了 el-tooltip,你的辅助指令也能显示加了 append-to-body="false" 的 tooltip 吗

Leecason avatar Mar 29 '20 11:03 Leecason

@linjiayu2012 如果我在 el-dialog 中使用了 el-tooltip,你的辅助指令也能显示加了 append-to-body="false" 的 tooltip 吗

可以的,这个指令只是用来解决将tooltip的append-to-body设置为false时提示框没有插入dom的问题。

linjiayu2012 avatar Mar 30 '20 03:03 linjiayu2012

发现datepicker 以及 下拉框也存在这种问题 有办法解决吗 ?

jawn-ha avatar Jul 27 '20 01:07 jawn-ha

发现datepicker 以及 下拉框也存在这种问题 有办法解决吗 ?

可以的,他们俩实际用的是popover。datepicker可以直接用:append-to-body="false",下拉框的话官方文档有说明,可以用:popper-append-to-body="false"

linjiayu2012 avatar Jul 28 '20 06:07 linjiayu2012

@linjiayu2012 我的tooltip是在table里的 。 然后用了你这个之后出现了tooltip定位出错的问题。你有遇到过嘛。比如我鼠标悬浮屏幕最下面的文字,结果tooltip出现在屏幕最上面[捂脸]

13164286167 avatar May 06 '21 11:05 13164286167

@linjiayu2012 我的tooltip是在table里的 。 然后用了你这个之后出现了tooltip定位出错的问题。你有遇到过嘛。比如我鼠标悬浮屏幕最下面的文字,结果tooltip出现在屏幕最上面[捂脸]

我找到了一个新的解决办法,全屏body然后把目标div添加以下css属性 .fullscreen-target { position:fixed !important; z-index:2002; top: 0; left: 0; right: 0; bottom: 0; }

jawn-ha avatar May 06 '21 11:05 jawn-ha

上面的解决方案都不完美,我试过生成两个popover,然后根据是否全屏来显示不同的popover,但还是有问题。 最后使用 popperjs 写了。

jhxxs avatar Aug 09 '22 02:08 jhxxs

还是用 el-popover 代替了 el-tooltip, 设置append-to-body="false",修改css样式即可 /* popover提示样式 */ .el-popover { min-width: 66px; background: #303133; border: 1px solid #303133; padding: 0px; text-align: center; .el-popover__title { color: #fff; font-size: 12px; line-height: 1; margin: 10px 0; } .popper__arrow { border-right-color: #303133; } .popper__arrow::after { border-right-color: #303133; } }

aoyoo111 avatar Aug 11 '22 01:08 aoyoo111

局部全屏下分页的调整每页显示条数选择框也点不了

dorahasadream avatar Aug 12 '22 02:08 dorahasadream

还是用 el-popover 代替了 el-tooltip, 设置append-to-body="false",修改css样式即可 /* popover提示样式 */ .el-popover { min-width: 66px; background: #303133; border: 1px solid #303133; padding: 0px; text-align: center; .el-popover__title { color: #fff; font-size: 12px; line-height: 1; margin: 10px 0; } .popper__arrow { border-right-color: #303133; } .popper__arrow::after { border-right-color: #303133; } }

为什么我设置append-to-body后直接不渲染了 好奇怪 是版本原因么 在文档中也没有找到这个配置

2016011969sunyifang avatar Aug 22 '22 09:08 2016011969sunyifang

@linjiayu2012 我的tooltip是在table里的 。 然后用了你这个之后出现了tooltip定位出错的问题。你有遇到过嘛。比如我鼠标悬浮屏幕最下面的文字,结果tooltip出现在屏幕最上面[捂脸]

我找到了一个新的解决办法,全屏body然后把目标div添加以下css属性 .fullscreen-target { position:fixed !important; z-index:2002; top: 0; left: 0; right: 0; bottom: 0; }

亲测可行, 这应该是目前最好的方案了。即使是el-popover 等组件使用已支持的:popper-append-to-body="false"等属性, 依然不方便(需要动态设置, 全屏时为false, 非全屏时为true, 而且与el-column fixed也存在冲突)。

mike652638 avatar Mar 31 '23 15:03 mike652638

基于前面指令版本重新写了一个,不需要设置popper-append-to-body和append-to-body,只在全屏模式生效

export const elTooltipFullscreen = {
    bind(el, binding, vnode) {
        el.tooltipAppend = () => {
            if (!document.fullscreenElement) return;
            const des = binding.value || document.fullscreenElement;
            setTimeout(() => {
                const popper = vnode.componentInstance?.$refs.popper;
                const popperNode = document.getElementById(popper.id);
                if (popper && !popperNode) {
                    des.appendChild(popper);
                } else if (popperNode && !des.contains(popperNode)) {
                    des.appendChild(popperNode);
                }
            }, 50);

        };

        el.removeEventListener('mouseenter', el.tooltipAppend);
        el.addEventListener('mouseenter', el.tooltipAppend);
    },
    unbind(el) {
        el.removeEventListener('mouseenter', el.tooltipAppend);
    },
};

Dinrer avatar Apr 24 '23 07:04 Dinrer

基于前面指令版本重新写了一个,不需要设置popper-append-to-body和append-to-body,只在全屏模式生效

export const elTooltipFullscreen = {
    bind(el, binding, vnode) {
        el.tooltipAppend = () => {
            if (!document.fullscreenElement) return;
            const des = binding.value || document.fullscreenElement;
            setTimeout(() => {
                const popper = vnode.componentInstance?.$refs.popper;
                const popperNode = document.getElementById(popper.id);
                if (popper && !popperNode) {
                    des.appendChild(popper);
                } else if (popperNode && !des.contains(popperNode)) {
                    des.appendChild(popperNode);
                }
            }, 50);

        };

        el.removeEventListener('mouseenter', el.tooltipAppend);
        el.addEventListener('mouseenter', el.tooltipAppend);
    },
    unbind(el) {
        el.removeEventListener('mouseenter', el.tooltipAppend);
    },
};

@Dinrer 你好,请问一下应该如何使用你写的这个指令呢。

yinyiyu avatar Oct 18 '23 13:10 yinyiyu