element ui popperjs相关

6,667 阅读1分钟

el-tooltip

特定: 超出边界元素,自动切的方向

属性

append-to-body 作用:tooltip是否插入到body中. 类型:boolean, 默认:true

该属性默认为true, 如果为true, 则tooltip默认插入到body元素中 设置为false, 则需要使用append方法手动插入. 如:

<script>
export default {
  name: 'App',
  data() {
    return {}
  },
  created() {
    this.$message('这是一条消息提示')
  },
  mounted() {
    console.log('this.$refs.elTooltip', this.$refs.elTooltip)
    // 因为将append-to-body设置成了false, 所以需要手动插入
    this.$refs.comp.appendChild(this.$refs.elTooltip.popperVM.$el)
  },
}
</script>
<template>
  <div ref="comp">
    <h3>Hello Vue 2 + Vite</h3>
    <el-button type="primary">按钮</el-button>
    <el-tooltip ref="elTooltip" :append-to-body="false" class="item" effect="light" placement="top">
      <el-button>上边</el-button>
      <div slot="content" class="tooltipContainer">
        <div v-for="(item, index) in 100" :key="index">{{ item }}-这是内容</div>
      </div>
    </el-tooltip>
  </div>
</template>
<style lang="scss">
.tooltipContainer {
  max-height: 200px;
  overflow: auto;
}
</style>

popperOptions.boundariesElement 默认: 为'body', 可选值: view, html, HtmlElement元素

表示tooltip的边界元素.

如:

  • placement="top", 并将popperOptions.boundariesElement设置为一个Html元素, 则表示: tooltip的最顶部不会超过popperOptions.boundariesElement元素的顶部
  • placement="bottom", 并将popperOptions.boundariesElement设置为一个Html元素, 则表示: tooltip的最底部不会超过popperOptions.boundariesElement元素的顶部
<script>
export default {
  name: 'App',
  data() {
    return {
      popperOptions: { boundariesElement: this.$refs.comp, gpuAcceleration: true },
    }
  },
  created() {
    this.$message('这是一条消息提示')
  },
  mounted() {
    console.log('this.$refs.elTooltip', this.$refs.elTooltip)
    this.popperOptions = {
      ...this.popperOptions,
      boundariesElement: this.$refs.comp,
    }
  },
}
</script>
<template>
  <div ref="comp" class="comp">
    <h3>Hello Vue 2 + Vite</h3>
    <el-button type="primary">按钮</el-button>
    <el-tooltip
      ref="elTooltip"
      class="item"
      effect="light"
      placement="top"
      :popper-options="popperOptions">
      <el-button>上边</el-button>
      <div slot="content" class="tooltipContainer">
        <div v-for="(item, index) in 100" :key="index">{{ item }}-这是内容</div>
      </div>
    </el-tooltip>
  </div>
</template>
<style lang="scss">
.tooltipContainer {
  max-height: 200px;
  overflow: auto;
}
.comp {
  width: 300px;
  height: 200px;
  background: lightblue;
  margin-top: 300px;
}
</style>

offset: 对tooltip的位置进行调整,类型:number, 当:placement="left"时, 设置offset表示调整上,下位置, 当:placement="right"时, 设置offset表示调整左,右位置。 其他依此类推

popper-class: 给tooltip加一个class, 可以用于修改tooltip样式,或者用于在placement原始位置的基础上,对tooltip的位置进行调整

调整位置的例子:

<script>
export default {
  name: 'App',
  data() {
    return {}
  },
  created() {
    this.$message('这是一条消息提示')
  },
  mounted() {
    console.log('this.$refs.elTooltip', this.$refs.elTooltip)
  },
}
</script>
<template>
  <div ref="comp" class="comp">
    <h3>Hello Vue 2 + Vite</h3>
    <el-button type="primary">按钮</el-button>
    <el-tooltip ref="elTooltip" effect="light" placement="top" popper-class="myTooltip">
      <el-button>上边</el-button>
      <div slot="content" class="tooltipContainer">
        <div v-for="(item, index) in 100" :key="index">{{ item }}-这是内容</div>
      </div>
    </el-tooltip>
  </div>
</template>
<style lang="scss">
.tooltipContainer {
  max-height: 200px;
  overflow: auto;
}
.comp {
  width: 300px;
  height: 200px;
  background: lightblue;
  margin-top: 300px;
}
.myTooltip {
  // 这里用来在placement位置的基础上,调整tooltip位置,注意必须加: !important 才会生效
  top: 200px !important;
}
</style>

实际位置的计算逻辑详见: node_modules/element-ui/src/utils/popper.jsupdate, getOuterSizes, _getOffsets, getOffsetRectRelativeToCustomParent方法

方法

updatePopper: 这个是vue-poper.js的内部方法, 可以用于重新计算tooltip的位置.

<el-popover
  ref="dcPopover"
  placement="left"
  width="797"
  trigger="hover"
  :popper-options="{ boundariesElement: 'viewport', removeOnDestroy: true }"
  @show="handleShow(scope)"
  :open-delay="300"
>
<button>按钮</button>
</el-popover>
this.$nextTick(()=>{
  this.$refs.dcPopover.updatePopper()
})

参考文章

完全满足需求,轻量级 tooltips 提示插件:popper.js

elementui将tooltip和dropdown显示到指定dom而非body根节点

element-ui的popover组件位置偏移

终于搞懂了el-dialog属性modal-append-to-body,append-to-body的作用【图解】

element-ui tooltip文字提示的几种用法