el-table溢出隐藏 鼠标移入显示tooltip逻辑

这篇具有很好参考价值的文章主要介绍了el-table溢出隐藏 鼠标移入显示tooltip逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

el-table

文件 element-ui/packages/table/src/table-body.js 截取部分代码

export default {
  render(h) {
    return (
      <table>
        <tbody>
          {/* 表格内容 ... */}
          {/* 一个表格 只渲染一个 tooltip */}
          <el-tooltip effect={this.table.tooltipEffect} placement="top" ref="tooltip" content={this.tooltipContent}></el-tooltip>
        </tbody>
      </table>
    );
  },
  created() {
    this.activateTooltip = debounce(50, tooltip => tooltip.handleShowPopper());
  },
  methods: {
    handleCellMouseEnter(event, row) {  // 鼠标移入表格项 触发事件
      const table = this.table;
      const cell = getCell(event);

      if (cell) {
        const column = getColumnByCell(table, cell);
        const hoverState = table.hoverState = { cell, column, row };
        table.$emit('cell-mouse-enter', hoverState.row, hoverState.column, hoverState.cell, event);
      }
      // 判断是否text-overflow, 如果是就显示tooltip
      const cellChild = event.target.querySelector('.cell');
      if (!(hasClass(cellChild, 'el-tooltip') && cellChild.childNodes.length)) {
        return;
      }
      // use range width instead of scrollWidth to determine whether the text is overflowing
      // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3
      const range = document.createRange();
      range.setStart(cellChild, 0);
      range.setEnd(cellChild, cellChild.childNodes.length);
      const rangeWidth = range.getBoundingClientRect().width;
      const padding = (parseInt(getStyle(cellChild, 'paddingLeft'), 10) || 0) +
        (parseInt(getStyle(cellChild, 'paddingRight'), 10) || 0);
      if ((rangeWidth + padding > cellChild.offsetWidth || cellChild.scrollWidth > cellChild.offsetWidth) && this.$refs.tooltip) {
        // 1. 判断: 如果宽度溢出
        const tooltip = this.$refs.tooltip;
        // TODO 会引起整个 Table 的重新渲染,需要优化
        this.tooltipContent = cell.innerText || cell.textContent; // 2. 表格项内容 赋值给 tooltip显示
        tooltip.referenceElm = cell;  // 3. 替换referenceElm, tooltip通过Popper.js 计算显示的tooltip和referenceElm的相对位置
        tooltip.$refs.popper && (tooltip.$refs.popper.style.display = 'none');
        tooltip.doDestroy();	// 取消tooltip上一系列绑定事件
        tooltip.setExpectedState(true);
        this.activateTooltip(tooltip);  // 4. 显示tooltip
      }
    },
    handleCellMouseLeave(event) { // 鼠标溢出表格项 触发事件
      const tooltip = this.$refs.tooltip;
      if (tooltip) {
        tooltip.setExpectedState(false);
        tooltip.handleClosePopper();  // 隐藏tooltip
      }
      const cell = getCell(event);
      if (!cell) return;

      const oldHoverState = this.table.hoverState || {};
      this.table.$emit('cell-mouse-leave', oldHoverState.row, oldHoverState.column, oldHoverState.cell, event);
    },
  }
}

记录点

  1. 鼠标事件
    mouseenter/mouseleave(新),mouseover/mouseout(旧)
    新的鼠标移入移出事件,去掉了冒泡和捕获的特性
    • mouseenter:鼠标第一次移动到元素区域时触发 (新)
    • mouseleave:移出时触发(新)
    • mousemove:在元素上移动时触发(一直触发)
    • mouseover:鼠标移动到元素上时触发(旧)
    • mouseout:从元素上移开时触发(旧)
  2. 步骤
    • el-tooltiptbody的子节点,一个表格,只渲染一个 el-tooltip
    • 监听鼠标移入事件 mouseenter,判断表格项内容是否溢出
    • 如果溢出
      • 表格项内容赋值给 tooltipContent 显示隐藏内容
      • 替换referenceElm, tooltip通过 Popper.js 计算显示的 tooltipreferenceElm 的相对位置
      • 显示 tooltip
    • 监听鼠标移开事件 mouseleave,隐藏 tooltip

el-tooltip

文件 element-ui/packages/tooltip/src/main.js 截取部分代码

const PopperJS = require('element-ui/src/utils/popper.js');
export default {
  beforeCreate() {
    this.popperVM = new Vue({
      data: { node: '' },
      render(h) {
        return this.node;
      }
    }).$mount();
    this.debounceClose = debounce(200, () => this.handleClosePopper());
  },
  render(h) {
    if (this.popperVM) {
      this.popperVM.node = (
        <transition
          name={ this.transition }
          onAfterLeave={ this.doDestroy }>
          <div
            onMouseleave={ () => { this.setExpectedState(false); this.debounceClose(); } }
            onMouseenter= { () => { this.setExpectedState(true); } }
            ref="popper"
            role="tooltip"
            id={this.tooltipId}
            aria-hidden={ (this.disabled || !this.showPopper) ? 'true' : 'false' }
            v-show={!this.disabled && this.showPopper}
            class={
              ['el-tooltip__popper', 'is-' + this.effect, this.popperClass]
            }>
            {/* 具名插槽 content 渲染在tooltip */}
            { this.$slots.content || this.content }
          </div>
        </transition>);
    }

    const firstElement = this.getFirstElement();  
    if (!firstElement) return null;

    const data = firstElement.data = firstElement.data || {};
    data.staticClass = this.addTooltipClass(data.staticClass);

    return firstElement;  // 找到默认插槽 default 显示在组件位置
  },
  mounted() {
    this.referenceElm = this.$el;
    // 给 referenceElm 绑定一系列事件, 包括: mouseenter mouseleave
    // ...
    
    if (this.value && this.popperVM) {
      this.popperVM.$nextTick(() => {
        if (this.value) {
          this.updatePopper();
        }
      });
    }
  },
  methods: {
    updatePopper() {
      const popperJS = this.popperJS;
      if (popperJS) {
        popperJS.update();
        if (popperJS._popper) {
          popperJS._popper.style.zIndex = PopupManager.nextZIndex();
        }
      } else {
        this.createPopper();
      }
    },
    createPopper() { // 省略...只剩下需要的逻辑
      let reference = this.referenceElm = this.referenceElm || this.reference || this.$refs.reference;
      const popper = this.popperElm = this.popperElm || this.popper || this.$refs.popper; // 提示信息ref 对应的DOM
      const options = this.popperOptions;

      if (!popper || !reference) return;
      if (this.appendToBody) document.body.appendChild(this.popperElm); // 渲染在body节点下
      /**
       * reference: 默认插槽/鼠标移入移出显示tooltip相对的元素
       * popper: 提示信息ref 对应的DOM (tooltip)
       * option: 一些配置
       */
      this.popperJS = new PopperJS(reference, popper, options);
      // ...
    }
  }
}

记录点:文章来源地址https://www.toymoban.com/news/detail-495133.html

  1. render
    1. 找到默认插槽 default 显示在组件位置
    2. 提示信息:transition + 具名插槽 content,鼠标移入referenceElm,显示提示信息
  2. mounted:给 referenceElm 绑定一系列事件, 包括: mouseentermouseleave,调用 updatePopper
  3. 调用 createPopper
    1. 通过 Popper.js 计算显示的 提示信息 和 referenceElm 的相对位置
    2. 关键代码:this.popperJS = new PopperJS(reference, popper, options);
      • reference: 默认插槽/referenceElm,鼠标移入移出显示 提示信息 相对的元素
      • popper: 提示信息ref 对应的DOM (tooltip)
      • option: 一些配置

到了这里,关于el-table溢出隐藏 鼠标移入显示tooltip逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • el-table 设置行背景颜色 鼠标移入高亮问题处理

    后端返回表格数据,有特定行数需要用颜色标识。类似于以下需求: 方式 区别 :row-class-name=“tableRowClassName” 已返回类名的形式设置样式,代码整洁,但是会鼠标高亮,导致背景颜色失效 :cell-style=“cellStyle” 以返回样式的形式设置,无鼠标高亮问题 2.1 表格代码 2.2 :row-cla

    2024年02月15日
    浏览(56)
  • el-button实现按钮,鼠标移入显示,移出隐藏

    2023.8.18今天我学习了 如何实现鼠标移入显示按钮,鼠标移出隐藏按钮。 效果如图: 鼠标移入时: 鼠标移出时:    原本我是想直接在el-button写入这两个方法,但是elementUI并不支持。 所以我在外面套了一层div

    2024年02月12日
    浏览(49)
  • element ui 中在el-table内,当内容超过多少行时,显示el-tooltip

    最近来了一个需求,在一个el-table里边的某一列渲染一个 ‘介绍’ 的内容,由于内容过多,全部展示显示的不是很美观,所以就给定了个需求让超出两行后显示省略号,并在鼠标移上去之后显示全部内容。 我首先想到的就是使用el-tooltip来实现,但是在使用过程中试了很多方

    2024年02月03日
    浏览(47)
  • el-table 列的动态显示与隐藏

    目录 业务场景 官方链接 实现效果图 使用框架 代码展示 template代码 ①、为什么要给el-table绑定【:key=\\\"reload\\\"】? ②、为什么给每个绑定【key=\\\"Math.random()\\\"】呢? ③、为什么列改变之后要添加【reload = Math.random();】修改值呢? ④、为什么要给el-table定义【max-height】属性? ⑥、为

    2023年04月18日
    浏览(36)
  • 【elementplus】解决el-table开启show-overflow-tooltip后,tooltip的显示会被表格边框遮挡的问题

    如图所示: 原因: 1. el-table没有设置高度;2.就是被遮住了 解决: 方法一:给el-table设置高度 方法二: 如果不想给el-table设置高度,就直接使用方法二解决即可

    2024年02月12日
    浏览(76)
  • 【Vue3+element plus 】el-table滚动条、固定列fixed、表头超出内容隐藏并显示省略号

            element plus中el-table采用的是el-scrollbar,无法采用全局默认滚动条样式修改,需要单独写公共样式。 原生滚动条样式 el-table滚动条样式 效果图:         el-table设置了自定义样式后,为el-table-column添加fixed=\\\"right\\\"属性,此时表格侧边栏固定列出现样式错乱,自定义

    2024年02月12日
    浏览(57)
  • 【CSS】鼠标(移入/移出)平滑(显示/隐藏)下划线

    鼠标移入内容时,下划线从 左 开始绘制到 右 侧结束 鼠标移出内容时,下划线从 左 开始擦除到 右 侧结束 我们给内容添加一个黑色背景 background: #000; 示例 效果 将黑色背景 background: #000; 替换成彩色渐变背景 background: linear-gradient(to right,#ec695c,#61c454); 示例 效果 宽度设置100个

    2024年02月09日
    浏览(53)
  • Vue中实现鼠标移入显示,移出隐藏滚动条

    实现目标:鼠标移入显示滚动条,移出隐藏滚动条。 1、 html 结构内容如下: 注意:文本内容需要溢出容器才能显示滚动条。 代码说明: 2、 css 样式: 注意:该样式存在兼容性问题,只在以 webkit 为内核的浏览器才可使用。 3、 js 功能实现: 4、效果演示 补充:实现隐藏滚

    2024年04月22日
    浏览(77)
  • css滚动条变细且隐藏,鼠标移入显示

    全局修改滚动条的样式,让滚动条变细且隐藏,只有鼠标移入到所属区域时才显示。 滚动条可设置的元素: 元素后面还可以跟一些事件:

    2024年01月19日
    浏览(43)
  • vue鼠标移入显示弹窗,移出隐藏弹窗,记录一下

    鼠标移入A弹出B , 移出A隐藏B, A : B :  逻辑 :

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包