基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框

这篇具有很好参考价值的文章主要介绍了基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景:因为有个需求就是鼠标经过可多选的 el-select 选择器时,需要有个气泡框显示已选的内容,其实 el-tooltip 气泡框可以满足需求,就是用 el-tooltip 气泡框来包裹 el-select 选择器,但是当选择器一个也没选中,即内容为空时不应该也显示气泡框,有点影响美观。应该就是若内容为空时,气泡框可以直接不显示出来。

因此,通过网上查找相关案例,自行设计一个仿Element UI的气泡框el-tooltip组件,不过多多少少不及官方Element UI的气泡框 el-tooltip 组件,只是可以满足内容为空时不显示气泡框,也就不需要v-if来判断内容是否为空,频繁创建与销毁组件,以及避免带来的用户体验问题。同时,支持输入的内容为整型、字符串、数组等,会有各自的显示。

父组件:index.vue

<template>
  <div>
    <div style="width: 300px; height: 300px; margin: 300px 200px; padding: 20px; background-color: #eee;">

      <!-- 气泡框内容为空 -->
      <MagicPopover :content="''">
        <el-button size="mini">气泡框内容为空,直接不显示气泡框</el-button>
      </MagicPopover>

      <br /><br /><br />


      <!-- 气泡框内容为整型 -->
      <MagicPopover :content="content1">
        <el-button size="mini">气泡框内容为整型</el-button>
      </MagicPopover>

      <br /><br /><br />

      <!-- 气泡框内容为字符串 -->
      <MagicPopover :content="content2">
        <el-button size="mini">气泡框内容为字符串</el-button>
      </MagicPopover>

      <br /><br /><br />

      <!-- 气泡框内容为数组 -->
      <MagicPopover :content="content3">
        <el-button size="mini">气泡框内容为数组</el-button>
      </MagicPopover>
    </div>    
  </div>
</template>

<script>
import MagicPopover from "./components/magicPopover";

export default {
  components: {
    MagicPopover
  },
  data: () => ({
    content1: 5201314,
    content2: 'HelloWorld',
    content3: [5201314, 'HelloWorld']
  })
}
</script>

<style scoped>

</style>

子组件:magicPopover.vue

<template>
  <div
    class="esse-popover"
    @mouseenter="handleMouseEnterEvent"
    @mouseleave="handleMouseLeaveEvent"
  >
    <transition name="fade">
      <div
        class="esse-popover-wrapper"
        ref="essePopoverWrapperRef"
        v-if="isView && content != null && content != ''"
      >
        <!-- 判断是否为数组 -->
        <div v-if="(content instanceof Array)">
          <p v-for="(item, key) of content" :key="key">{{ item }}</p>
        </div>

        <!-- 其他类型,包括字符串、整型、对象... -->
        <div v-else>
          <p>{{ content }}</p>
        </div>
      </div>
    </transition>

    <div ref="essePopoverSlotRef">
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
props: [
  'content'
],
data() {
  return {
    isView: false,
  }
},
methods: {
  /**
   * 鼠标进入事件
   */
  handleMouseEnterEvent(event) {
    this.isView = true;
    this.$nextTick(() => {
      this.draw();
    })
  },

  /**
   * 鼠标离开事件
   */
  handleMouseLeaveEvent(event) {
    this.isView = false;
  },

  /**
   * 渲染气泡框
   */
  draw() {
    if (this.content != null && this.content != '') {
      document.body.appendChild(this.$refs.essePopoverWrapperRef);
      let {left, top, width} = this.$refs.essePopoverSlotRef.getBoundingClientRect();
      // console.log('this.$refs.essePopoverSlotRef.getBoundingClientRect() =>', this.$refs.essePopoverSlotRef.getBoundingClientRect());
      const offsetTop = 10;// 偏移高度
      const offsetleft = width / 2;// 便宜位移,从左边计算
      this.$refs.essePopoverWrapperRef.style.top = top - offsetTop + 'px';
      this.$refs.essePopoverWrapperRef.style.left = left + offsetleft + 'px';
      document.styleSheets[0].addRule('.esse-popover-wrapper::before','display: block; left: 50%; bottom: 0');// 显示三角形伪类元素
    }
  },
},
}
</script>

<style scoped>
  .esse-popover {
    width: auto;
    display: inline-block;
    position: relative;
  }

  .esse-popover-wrapper {
    position: absolute;
    z-index: 99;
    width: 250px;
    height: auto;
    padding: 6px;
    border: 1px solid #ebeef5;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2);
    background-color: #fff;
    transform: translate(-50%, -100%);
  }

  .esse-popover-wrapper p {
    margin: auto;
    font-size: 13px;
  }

  /* 使用伪元素创建小三角形 */
  .esse-popover-wrapper::before {
    content: "";
    position: absolute;
    border-width: 6px 6px 0 6px;
    border-style: solid;
    border-color: transparent;
    border-top-color: #fff;
    transform: translate(-50%, 100%);
  }
  /* / 使用伪元素创建小三角形 */

  /* 淡入淡出效果 */
  .fade-enter-active {
    /* transition: opacity 1s; */
    transition: all ease 1s;
  }
  .fade-leave-active {
    /* transition: opacity 0.3s; */
    transition: all ease 0.3s;
  }
  .fade-enter, .fade-leave-to /* .fade-leave-active, 2.1.8 版本以下 */ {
    opacity: 0;
  }
  /* / 淡入淡出效果 */
</style>

效果如下~

el-tooltip 数组分别显示,vue.js

 

参考资料

Vue基础popover弹出框编写及bug问题分析 - 编程宝库文章来源地址https://www.toymoban.com/news/detail-636561.html

到了这里,关于基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [element-ui] el-table表格头添加图标-鼠标移入显示el-tooltip提示信息

    只是单纯的想在table中添加图标和tooltip 在el-table-column中绑定:render-header=“renderPrice” (此方法无法使tooltip换行) 方法二、 使用组件插槽,elementui已封装好 elementUI表格头添加图标-鼠标移入显示el-tooltip提示信息

    2024年02月11日
    浏览(33)
  • 【Element UI】解决el-tooltip组件在鼠标快速移动场景下出现的残影问题

    当我们把el-tooltip组件直接拿来和el-table组件使用的时候,鼠标上下快速移动会出现如图残影和渐变消失的问题 如下图: 所以我们去看一下官网 我们这时候试一试将 transition 属性设置为空 代码如下: 发现渐变消失是解决了但是并没有解决鼠标快速移动产生残影的问题 最终代

    2024年02月19日
    浏览(32)
  • 自定义vue指令,实现el-tooltip仅在文字溢出时显示,文字未溢出则不显示,复制即可使用

    在项目里遇到了这种需求,想到el-table里的show-overflow-tooltip属性就有这种效果,在参考了一些网上的文章以及show-overflow-tooltip跟el-tooltip的源码后,觉得使用自定义指令的方式来实现这个需求会很方便,于是便有了以下代码 2.1. 默认无参数用法 没有传递值给指令的时候,将使用

    2024年02月04日
    浏览(36)
  • vue3中el-tooltip的样式修改不生效

    如下代码中,无论如何修改el-tooltip的样式,都不能生效 原因如下:         element-plus中, tl-tooltip的dom结构默认是 被追加 在 body 下的,故在app结构下的样式修改是不生效的;具体解决方法如下: 方法一: 将 “teleported”属性设置为false ,这样,默认则会不被追加到 append

    2024年02月13日
    浏览(41)
  • 【vue2】element-ui el-transfer扩展 实现多列效果一对多

    vue2 el-transfer 穿梭框实现多类别 template 复制Transfer源码中的template,并拓展我们需要的列表2和button script 这里重写了Transfer的addToLeft方法,按着element-ui的逻辑写出第二个列表的逻辑即可。源码就不做解释了,这个组件比较简单,感兴趣的朋友可以去看看 style GitHub地址

    2024年02月08日
    浏览(43)
  • Vue2 + element ui el-select 远程搜索分页懒加载功能实现

    新建指令 :         1、 在 src 目录下 新建文件夹 directive / loadmore         2、在 loadmore 文价夹下新建 elSelectLoadmore.js 和 index.js 文件:            elSelectLoadmore.js index.js 3、在main 文件中注册该指令 4、 基于 el-select 封装 懒加载 远程搜索框 remoteSelect.vue 组件提示

    2024年01月21日
    浏览(41)
  • vue3中如何使用el-tooltip中的插槽达到换行效果

    el-tooltip的content属性中的内容可以使用插槽来替换 话不多说,直接上代码 最后放上效果对比图,如果觉得有帮到你,可以给我一个赞吗😜 没换行前的效果 换行后的效果

    2024年02月10日
    浏览(35)
  • 基于Vue2+Element UI或Vue3+Element plus对 el-notification 增加倒计时进度条特效,鼠标移入暂停计时,移出继续计时

    遇到一个需求就是对这个 el-notification 加一个倒计时进度条,方便用户知道该通知何时自动关闭。于是自己动手丰衣足食。 (1)基于Vue2+ElementUI的项目 (1)基于Vue3+ElementPlus的项目 JS DOM获取元素属性+操作方法 Vue2的h函数(createElement)与Vue3中的h函数用法

    2024年02月16日
    浏览(47)
  • Vue3 el-tooltip 根据内容控制宽度大小换行和并且内容太短不显示

    tooltip 根据内容自动换行 如果内容超出显示省略号显示,不超出不显示 tooltip 组件 使用

    2024年02月09日
    浏览(31)
  • 如何搭建一个基于vue2和element-ui的项目框架模板(两万四千字长文)

    使用vue script标签引入 如果只是单纯的使用vue,可以使用 script src=\\\"https://cdn.jsdelivr.net/npm/vue/dist/vue.js\\\"/script 直接引入 npm安装vue 使用npm安装vue需要先安装node.js,如果你的电脑未安装node,可以参考我的个人碰到的前端问题总结及解决方案2第15个问题先安装nvm(node version manager)

    2024年02月13日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包