elementUI表格气泡乱串、闪烁、位置偏移问题解决(自制气泡,计算位置,箭头永远指向当前元素)

Unity游戏开发:从零开始适配Nintendo Switch的完整指南 本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。 阅读详情

elementUI表格中插入气泡,会出现bug"来回切换tab页气泡会乱串",导致这个问题的原因是,elementUI底层是通过js绘制的气泡,挂在到body中,通过display:none来控制显隐;当我们来回切换tab页的时候,时而出现display:block;的情况,这时候上一个界面的气泡就再新界面出现,导致气泡乱串了。

为了解决这个问题,尝试过好几种方式,目的就是让气泡隐藏成功或者销毁成功,但是发现这种思路只会让气泡乱串出现的频率降低,并不能从根本上解决问题,而且还会带来新的界面bug。下面先介绍一下错误的思路,带来什么样错误的bug.

第一种方式: 移出气泡dom,销毁气泡元素

// 移出气泡dom
  $route: {
    handler: function (val, oldVal) {
      if (val !== oldVal) {
        let dom = document.getElementsByClassName('ai-tooltip__popper')
        for(let item of dom){
          console.log(item)
          document.body.removeChild(item)
          this.$destroy(true);
        }
      }
    },
    // 深度观察监听
    deep: true
  }

在watch监听中,监听路由变化时,就销毁气泡。这时候给我们的界面带来一个bug,每当点击弹窗,关闭弹窗,然后打开有内容非常多的气泡界面,我们的elementUI表格就不能自适应,就会有一片空白,这个问题的出现是min-width失效了,this.$destroy(true);就是这行代码引发的。

第二种方式: 隐藏气泡,移出气泡

 // 移出气泡dom
  $route: {
    handler: function (val, oldVal) {
      if (val !== oldVal) {
        let dom = document.getElementsByClassName('ai-tooltip__popper')
        for(let item of dom){
          document.body.removeChild(item)
          // console.log(item.style,'style')
           item.style.display = 'none'
        }
      }
    },
    // 深度观察监听
    deep: true
  }

这种方式,你会发现强制更改后,控制台里面当你来回切换tab页,是成功的,但是标签上偶然会失效;可以减少出现的频率;但是导致一个新的bug,那就是用了表格中气泡出现的属性,这种情形下的气泡不出现。


如果你遇到的需求和我的需求一致,那么你可以采用下面这种方式。如果你遇到的需求不一致,也有同样的bug,你可以看看下面这种方式,说不定可以找到灵感。

先说一下我们的需求(在前面有的篇幅中提到过这个需求):
1、表格高度固定4行,超过显示气泡,未超过不显示气泡;
2、表格内、气泡内需要显示原始格式(换行、空格等要与表单中保存是保持一致)
3、气泡内容太多,或导致界面闪屏,用以前提供的方法,给出最大高度,最大宽度,超过出现滚动条。
(也有固定8行的,下面例子中只介绍4行这种demo. 8行的,和这个是一样的。)
这里还要说明一下,这里的样式与纯css绘制气泡,支持适应最大宽度,最大高度这篇文中的有一些不同,虽然采用的是方式二: 将hover的目标与隐藏对象当作相邻的兄弟元素。
不同的地方在与定义方式不同,如果采用决定定位,气泡是不能超过表格中body的线的,及时给了z-index:9999,也是没用的,就像这个图一样。所以这里采用了固定定位
在这里插入图片描述

另外,这里隐藏的方式也不同,这里最开始采用的是display:none;后来发现,在计算气泡高度的时候,会有时候拿不到高度,这就与隐藏后是否占位置有关了。所以这里用了visibility: hidden;visibility: visible;来控制显示隐藏。

如果您需要了解表格根据高度显示气泡问题,可以先查看这篇文章:
elementUI表格内容根据高度来判断是否显示气泡,表格单元格显示原始格式(换行、空格
表格气泡内容显示不全,闪烁问题,可以先查看这篇文章:
elementUI中,表格内容太多,导致气泡会出现闪烁,或者显示不全问题解决
当前demo中也是用气泡滚动条来解决的,本例中未使用elementUI中的el-tooltip组件。
下面正式介绍实现方式:
界面效果展示:
在这里插入图片描述

样式方面:

 // 方式二: 将hover的目标与隐藏对象当作相邻的兄弟元素
  // 气泡盒子
  .hover-box-nex{
    /*display: none;*/
    height: auto;
    width: auto;
    visibility: hidden;
    position: fixed;
    padding: 10px;
    width: max-content;
    max-width: 600px;
    z-index:1111;
    height: auto;
    background: #f0f6fb ;
    color: #0a92d9 ;
    font-size: 16px ;
    border: 1px solid #0a92d9 ;
    line-height: 1.2;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    border-radius: 4px;
    .tip-box-div{
      max-height: 245px;
      overflow-y: auto;
      @media screen and (min-width: 1801px) {
        max-height: 410px;
      }
    }
    &:after{
      content: '\00a0';
      width: 0;
      height: 0;
      display: block;
      border-color: transparent;
      border-style: solid;
      border-width: 6px;
      position: fixed;
      z-index:-1;
    }
    // 靠上
    &.tip-top{
      &:after{
        border-bottom-color: #0a92d9 !important;
      }
    }
    // 靠下
    &.tip-bottom{
      &:after{
        border-top-color: #0a92d9 !important;
      }
    }
  }

  //hover的目标
  .hover-box{
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
    top:6px;
  }
  // //hover的目标       // 气泡盒子
  .hover-box:hover + .show-hover-box-nex{
    /*display: list-item;*/
    /*list-style-type: none;*/
    visibility: visible;
  }
  // 气泡盒子
  .hover-box-nex:hover{
    /*display: list-item;*/
    /*list-style-type: none;*/
    /*visibility: visible;*/
  }

  // 气泡盒子 显示
  .show-hover-box-nex{
    visibility: hidden;
    &:hover{
      visibility: visible;
    }
  }
  // 气泡盒子 隐藏
  .hide-hover-box-nex{
    visibility: hidden;
    &:hover{
      visibility: hidden;
    }
  }

表格中的代码部分:

<el-table-column
        label="商品名称"
        align="left"
        prop="name">
        <template slot-scope="scope">
          <div style="height: 100%; width: 100%;" @mouseover="mouseover">
            <div class="hover-box"  style="" v-html="scope.row.name"></div>
            <div class="hover-box-nex"
                 :class="[
                    scope.column.position == 'top' ?'tip-top': 'tip-bottom',
                    scope.column.show==true && scope.column.rowId == scope.row.id ? 'show-hover-box-nex': 'hide-hover-box-nex'
                 ]"
                 :id="scope.column.id+'-'+scope.row.id"
                 :style="scope.column.position == 'top'?scope.column.styleTop: scope.column.styleBottom">
              <div class="tip-box-div" v-html="scope.row.name"></div>
            </div>
          </div>
        </template>
      </el-table-column>

在这里插入图片描述
可以看到这里用了很多的三目运算,这里需要给气泡绑定动态类,动态id,动态style。
scope.column.position == 'top' ?'tip-top': 'tip-bottom' 是为了确定气泡向上还是向下,从而给气泡中三角形设置样式
在这里插入图片描述
scope.column.show==true && scope.column.rowId == scope.row.id ? 'show-hover-box-nex': 'hide-hover-box-nex' 是为了判断当前这个单元格是否需要显示气泡,这里column中字段值改变,就代表一整列都一样,需要再就加一个row.id来区分。 如果没有 scope.column.rowId == scope.row.id 这个判断,就会出现一个问题,如果商品这一列下第一个单元格高度超出了,第二个单元格高度没超出,来回切换这2格单元格,未超出高度的单元格,鼠标移入也会出现气泡,这就与需求不符合了。
:id="scope.column.id+'-'+scope.row.id" 为了准确获取当前这个气泡的伪类位置
:style="scope.column.position == 'top'?scope.column.styleTop: scope.column.styleBottom" 为了这是气泡的位置

下面就是js部分了。
在这里插入图片描述

js代码:

/** 固定4行高度超出显示气泡begin */
      handleCellMouseEnter(row, column, cell, event) {
        const cellChild = event.target.querySelector('.cell'), // cell单元格
              hoverChild = cell.querySelector(`.hover-box`), // 鼠标移入对象盒子
              range = document.createRange(), // 创建一个范围(以鼠标移入对象为基准)
              tipChild = cell.querySelector(`#${column.id}-${row.id}`) // 获取当前单元格下气泡盒子
        range.setStart(hoverChild, 0); // 设置范围的起始点
        range.setEnd(hoverChild,hoverChild.childNodes.length); // 设置范围的结束点
        const rangeHeight = range.getBoundingClientRect().height; // 获取当前范围的高度
        let cellChildClientObj = cellChild.getBoundingClientRect()
        if(rangeHeight>cellChild.offsetHeight){
          this.$set(column,'show',true)
          this.$set(column,'rowId',row.id)
        }else{
          this.$set(column,'show',false)
          this.$set(column,'rowId','')
        }
        const positionHeight = tipChild? (tipChild.offsetHeight+(cellChild.offsetHeight/3)*2) : 400, positionWidth = tipChild? (tipChild.offsetWidth+20): 650; // 获取气泡盒子高度、宽度
        if(window.innerHeight - cellChildClientObj.top > positionHeight){ //窗口高度- 当前cell的top值 > 气泡盒子盒子高度
          this.$set(column,'position','top')
          // 强制更新伪类样式
          document.styleSheets[0].addRule(`#${column.id}-${row.id}::after`,`top: ${cellChildClientObj.top+(cellChild.offsetHeight/3)*2-20}px; left:${cellChildClientObj.left+cellChild.offsetWidth/3-30}px;`);
          window.innerWidth - cellChildClientObj.left > positionWidth ? this.$set(column,'styleTop',{top: (cellChildClientObj.top+(cellChild.offsetHeight/3)*2-8)+'px', left:(cellChildClientObj.left-cellChild.offsetWidth/3) + 'px'}) : this.$set(column,'styleTop',{top: (cellChildClientObj.top+(cellChild.offsetHeight/3)*2-8)+'px', left:(window.innerWidth - positionWidth  )+'px'})
        }else{ // 窗口高度- 当前cell的top值 <= 气泡盒子盒子高度
          this.$set(column,'position','bottom')
          // 强制更新伪类样式
          document.styleSheets[0].addRule(`#${column.id}-${row.id}::after`,`top: ${cellChildClientObj.top+cellChild.offsetHeight/2}px; left:${cellChildClientObj.left+cellChild.offsetWidth/3-30}px;`);
          window.innerWidth - cellChildClientObj.left > positionWidth ? this.$set(column,'styleBottom',{bottom: (window.innerHeight - cellChildClientObj.top-cellChild.offsetHeight/2)+'px', left:(cellChildClientObj.left-cellChild.offsetWidth/3) + 'px'}) : this.$set(column,'styleBottom',{bottom: (window.innerHeight - cellChildClientObj.top-cellChild.offsetHeight/2)+'px', left:(window.innerWidth - positionWidth  )+'px'})
        }
      },
      /** 固定高度超出显示气泡end */

补充说明:
本例中用到的公共样式:表格固定高度4行:

/deep/ .el-table.testHeightTip td {
  .cell {
    height: 92px;
    vertical-align: middle;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 4; /*可以显示的行数,超出部分用...表示 */
    -webkit-box-orient: vertical;
    white-space: pre-wrap;
    text-align: left;
    .ai-button {
      padding: 7px 5px !important;
    }
  }
}

Vue3 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站! vue3,nuxt3,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue3西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,自定义播放器样式,截屏,监控视频,vue3使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程, 阅读详情

相关推荐

从HSPICE到Spectre:手把手教你搞定不同SPICE仿真器的网表转换(附避坑指南)

本文详细介绍了从HSPICE到Spectre的SPICE仿真器网表转换方法,包括核心语法差异、分步转换流程和常见问题排查。通过实战案例和避坑指南,帮助工程师高效解决不同SPICE仿真器间的兼容性问题,提升集成电路设计效率。

weixin_29745609的博客 368

element-plus: el-tooltip 乱浮动,append-to 失效问题

官方文档可能写有append-to这个属性,但是这个属性在实际开发中不存在,也就导致连续hover(el-tooltip)出现乱浮动的现象;查看源代码发现它只有append-to-body这个属性

qq_27936291的博客 8798

基于LSTM算法的股票预测详解

一、需求 给定几个已知的股市因素(开盘、收盘、最高、最低、成交量、成交额)及各因素对应的大量数据,训练一个该股票的涨跌趋势的预测模型。并在给定的测试数据的条件下求出接下来的涨跌趋势。即得到下图中的label值。-1代表跌、1代表涨。 二、分析 1、LSTM简单介绍 LSTM这个算法是专门训练有时间序列信息的数据的,即这些数据不仅按照时间递增的顺序排布,并且前后的数据都有着很强的联系。个人认为与马尔可夫的思想差不多,即后面的值由前面的值来决定。本次需求是要根据已知的股市数据来分析某个时间段的涨跌趋势,并预测

Zhang_713的博客 1万+

vue3+element-plus使用tooltips时弹出的气泡位置错误的问题

element-plus使用tooltips时气泡位置错误,箭头和主题部分分离

hellolipop 3857

gem5 run parsec2.1 ---- 亲测跑通教程

使用gem5模拟仿真parsec2.1,排除了各种bug,成功跑通,亲测有效!!!

m0_55539563的博客 1546

YOLOv8 + TensorRT 实战:手把手教你用 C++ 实现实时视频流目标检测(附完整项目代码)

本文详细介绍了如何将YOLOv8与TensorRT结合,通过C++实现实时视频流目标检测的全流程。从环境配置、模型转换优化到视频处理架构设计,手把手教你构建高性能检测系统,并附完整项目代码。特别针对Windows平台下的TensorRT模型加速部署提供了实用技巧和性能优化方案。

weixin_29051193的博客 346

elementUI表格中气泡位置偏移

1、气泡位置偏移这个问题出现,是由于,需求要求打破了常规模式,要求“elementUI表格内容根据高度来判断是否显示气泡”,这时候我们会发现,气泡在底层代码中是以实际高度的位置来判断气泡显示的位置,而不是以我们在样式中设置的height这个判断。 “elementUI表格内容根据高度来判断是否显示气泡” 这个需求的实现见文章 https://blog.youkuaiyun.com/CuiCui_web/article/details/106531997 由上图就可以看到,这个问题的根本原因就是上面说的,底层中是以实

CuiCui_web的博客 2842

核回归(Kernel Regression)

本文讲解了核函数,并且实战通过核函数进行了预测,并附python代码

a2333333_的博客 6956

CSS实现带小箭头气泡

显示效果如下 .tip { position: fixed; bottom: 19px; right: 32px; width: 100px; height: 40px; background: #fff; box-shadow: 0px 10px 24px 0px rgba(0, 0, 0, 0.1); border-radius: 4px; z-index: 1; display: flex; align-items: center; } .tip::aft

笔记搬运工 1416

多目标优化AI Agent:增强LLM的复杂决策能力

在人工智能领域,尤其是自然语言处理(NLP)和大语言模型(LLM)的应用中,决策问题往往涉及多个目标的平衡与优化。例如,在智能客服系统中,既要提高客户满意度,又要降低运营成本;在自动驾驶中,既要确保安全,又要追求行驶效率。传统的单目标优化方法难以满足这种复杂场景的需求,因此多目标优化成为了一种必然趋势。AI Agent是一种智能系统,能够通过感知环境、处理信息并采取行动来实现特定目标。它可以是一个软件程序,也可以是一个物理设备。NSGA-II:一种基于群体的多目标优化算法,通过遗传算法的思想进行迭代优化。

AI天才研究院 1300

063.CI/CD for ML:给YOLO项目装上自动化流水线

本文分享了为YOLO目标检测项目搭建CI/CD流水线的实践经验。作者通过手动调试模型导出问题的经历,意识到重复验证工作比模型改进更耗时,提出需要自动化解决方案。文章详细介绍了四阶段流水线设计:1)代码质量检查;2)快速训练验证;3)推理性能基准测试;4)模型注册部署。同时总结了环境不一致、GPU资源争抢等常见问题及解决方案,建议从简单规则开始逐步完善,强调模型版本管理的重要性。实施后不仅提高了效率,还促使团队形成更规范的开发习惯。

2603_95664987的博客 235

列表中滚动鼠标Tooltip文本提示组件在列表中出现错位问题优化、elememt库的组件;

vue项目中滚动鼠标,element的提示文体组件tooltip错位问题

努力飞起的菜鸟 2332

让 ME51N 在采购信息记录过期时不要带出上一次采购订单的价格

在采购信息记录(PIR)价格条件无效或过期时,到上一次采购订单价格进行提议;你可以通过关闭,并在把PO price设置为不采纳,再辅以把过期的价格来源直接拦截为错误。若仍需 100% 阻断,可用在保存前清空估价价格作为技术兜底。标准行为与配置证据见文内引用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 661

element-ui表单串数据的问题

在一个页面中,写了三个表单,三个表单根据左侧的菜单操作进行显示和隐藏,在表单数据回显的时候发现,上一个表单的数据会显示在下一个表单中。 解决方法: 给每一个表单加一个唯一的标识key ...

weixin_42113124的博客 408

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

zoom缩放后导致element-ui下拉框位置偏移的解决

zoom缩放后导致element-ui下拉框位置偏移的解决

m0_47132924的博客 7831

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

element-ui 里 el-popover 位置发生偏移

解决方案 在 el-popover 里添加下面配置 :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }" <el-popover ref="popover" placement="top" trigger="hover" :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }"> <span s

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

解决element ui表格内容偏移问题

解决element ui表格内容偏移问题

m0_46097421的博客 985

【elementplus】body设置zoom后,el-table开启show-overflow-tooltip后,表格的tooltip显示会错位的解决方案

示例:明明划过的是第一行,tooltip却显示到了第四行的位置;代码:使用transform属性来修复el-table组件的位置。正确显示:划过第一行,tooltip显示在第一行的位置。

bbt953的博客 3934

vue中使用Element组件el-dialog导致页面偏移——解决方法

在vue项目中里使用Element的el-dialog组件 问题1:原先的页面有滚动条,再引入弹出框之后又出现滚动条 解决方法:找到弹出框对应的class再将overflow设置为hidden 问题2:组件引起原页面偏移 修改完之后滚动条没了但是滚动条的位置还在,这导致了弹框出现的时候原来的页面会向左边偏移,引起页面的抖动 一番检查后发现问题所在:弹框出现的时候body上会被动态的添加上一个class和style 例如:点击弹框前的body 点击弹框之后 一开始一直把关注点放在组件上,甚至怀疑是e

weixin_44066534的博客 7267

Vue2.x解决Element组件el-tooltip滚动时错位不消失的问题

Vue解决Element组件el-tooltip滚动时不消失的问题 一、问题 在给列表中的某些值外层嵌套了Element组件中的el-tooltip后,在滑动鼠标滑轮时el-tooltip的提示框不会消失(或不会立即消失,被滚动到顶上),影响了界面的显示; 产生这种情况的原因是因为el-tooltip是监听鼠标是否移动,所以当鼠标不移动只进行滚动的时候提示并不会消失,由于组件内设置了z-index的属性,滚到上面后依然悬浮在页面上层影响界面的显示,具体问题如图所示: 二、解决 解决思路为监

BreenCL的博客 1万+

使用elementui组件,遇到的位置展示问题

elementui日期组件、下拉面板位置错位,table添加tooltip后,tooltip的位置错位

Nakisha7的博客 2486

element 表格气泡是如何实现的

element 表格气泡是如何实现的

weixin_41897680的博客 1640

【vue3+elementPlus】在el-table中使用popconfirm、popover、tooltip、select时,出现placement错位或者框被table的列遮挡的解决方案

【vue3+elementPlus】在el-table中使用popconfirm、popover、tooltip、select时,出现placement错位或者框被table的列遮挡的解决方案

bbt953的博客 8871

Vue2&Element-UI中table表格添加气泡跟随点击位置弹出

点击table表格气泡跟随鼠标位置弹出

月色真美121的博客 1193

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释)

如何给element ui table组件 添加表头气泡卡片

weixin_47389477的博客 1317

ElementUI(el-select\el-popper)出现的交互问题

elementUi中el-select和el-popper交互问题

m0_73430030的博客 1008
上一篇: 纯css绘制气泡,支持适应最大宽度,最大高度
下一篇: vuex的基本用法(提炼公共文件import all vuex modules)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值