欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue.js修改el-popover組件顯示位置

 更新時(shí)間:2023年06月27日 15:57:32   作者:BAtodl  
el-popover是一個(gè)基于element-ui框架設(shè)計(jì)的,用于浮動(dòng)展示提示或菜單的UI組件,下面這篇文章主要給大家介紹了關(guān)于vue.js修改el-popover組件顯示位置的相關(guān)資料,需要的朋友可以參考下

前言

我們?cè)谕ǔG闆r下使用el-popover組件,都是讓組件自動(dòng)計(jì)算氣泡顯示位置。不過我之前遇到過這樣一個(gè)需求:當(dāng)觸發(fā)氣泡顯示的元素寬度太大,氣泡顯示位置可能會(huì)離鼠標(biāo)位置較遠(yuǎn),用戶反映移動(dòng)鼠標(biāo)到氣泡上的距離太長(zhǎng)了,希望能讓氣泡在鼠標(biāo)進(jìn)入觸發(fā)元素的位置顯示。

方法一:通過修改組件 offset 屬性,修改氣泡顯示位置

首先,我想到看組件的文檔,看組件是否有提供這樣的需求支持。然后我找到一個(gè)屬性offset: 出現(xiàn)位置的偏移量,這樣我只需把鼠標(biāo)的位置設(shè)置進(jìn)去不就可以了嗎?

修改完后發(fā)現(xiàn)實(shí)際效果和預(yù)想的有些出入

仔細(xì)查看后發(fā)現(xiàn),offset這個(gè)偏移量是在組件計(jì)算出的left距離的基礎(chǔ)上再進(jìn)行偏移,那么想要顯示位置等于偏移量,需要限制組件計(jì)算的left=0,我想這點(diǎn)通過設(shè)置placement屬性也可以實(shí)現(xiàn)。

實(shí)現(xiàn)代碼

<template>
  <el-popover
    ref="popover"
    title="標(biāo)題"
    width="200"
    content="這是嵌套操作的內(nèi)容"
    :offset="popoverOffset"
    placement="bottom-start"
    trigger="hover"
  >
    <div
      slot="reference"
      style="
        width: 100%;
        height: 100px;
        background: aquamarine;
        overflow-x: scroll;
      "
      @mouseenter="handlerMouseenter"
    >
      <div style="width: 3000px">通過修改offset屬性,改變氣泡出現(xiàn)的位置</div>
    </div>
  </el-popover>
</template>

<script>
  module.exports = {
    data() {
      return {
        popoverOffset: 0, // 出現(xiàn)位置的偏移量
      };
    },
    methods: {
      handlerMouseenter(event) {
        const { clientX } = event;
        this.popoverOffset = clientX;
        console.log("鼠標(biāo)clientX", clientX);
        let timer = setTimeout(() => {
          console.log(this.$refs.popover.popperElm);
        }, 5);
      },
    },
  };
</script>

效果

看起來(lái)還不錯(cuò),正當(dāng)我以為可以交差的時(shí)候,又發(fā)現(xiàn)了一個(gè)問題?。?!

我設(shè)置了placement="bottom-start",但是當(dāng)元素下方空間不夠,氣泡轉(zhuǎn)移到上方顯示的時(shí)候,offset屬性不生效了。

不過到這我就沒有再繼續(xù)研究下去了,因?yàn)槲野l(fā)現(xiàn)我能拿到氣泡元素,那我可以直接修改left屬性。

方法二:通過直接修改氣泡元素 left 屬性,修改氣泡顯示位置

<template>
  <el-popover
    ref="popover"
    title="標(biāo)題"
    width="200"
    trigger="hover"
    content="這是嵌套操作的內(nèi)容"
  >
    <div
      slot="reference"
      style="width: 100%; height: 100px; background: pink; overflow-x: scroll"
      @mouseenter="handlerMouseenter"
    >
      <div style="width: 3000px">
        通過直接修改氣泡left屬性,改變氣泡出現(xiàn)位置
      </div>
    </div>
  </el-popover>
</template>
<script>
  module.exports = {
    methods: {
      handlerMouseenter(event) {
        // 鼠標(biāo)進(jìn)入觸發(fā)元素
        const popover = this.$refs.popover;
        let timer = setTimeout(() => {
          const { clientX } = event;
          const bodyWidth = document.body.clientWidth;
          // 找到氣泡元素
          const { popperElm } = popover;
          /**
           * 鼠標(biāo)位置+氣泡彈框?qū)挾仁欠裥∮赽ody的寬度
           * 1. 是,設(shè)置鼠標(biāo)位置為氣泡彈框橫向位移
           * 2. 否,設(shè)置body寬度-氣泡彈框?qū)挾葹闅馀輳椏驒M向位移
           */
          let disX =
            clientX + popperElm.offsetWidth < bodyWidth
              ? clientX
              : bodyWidth - popperElm.offsetWidth;
          popover.popperElm.style.left = disX + "px";
          clearTimeout(timer);
        }, 5);
      },
    },
  };
</script>

以上基本算是完美符合需求了,但是需要注意2點(diǎn),

popperElm的值需要等組件創(chuàng)建/更新氣泡元素后才能拿到,所以需要延遲一點(diǎn)時(shí)間執(zhí)行修改left邏輯這里會(huì)出現(xiàn)2個(gè)問題(我嘗試后使用延遲5ms沒有出現(xiàn)問題):

1.1 如果不延遲或延遲時(shí)間稍短會(huì)出現(xiàn),沒拿到當(dāng)前氣泡元素,修改不生效

1.2 如果延遲時(shí)間稍長(zhǎng)會(huì)出現(xiàn),氣泡先顯示在原來(lái)的位置,再顯示到修改后的位置,有一個(gè)閃現(xiàn)的效果需要判斷左右的空間是否能足夠顯示氣泡,如不能需要進(jìn)行處理(我的示例中頁(yè)面結(jié)構(gòu)簡(jiǎn)單只需要處理靠右時(shí)的氣泡顯示) 總結(jié)

如果觸發(fā)元素上下空間足夠,使用方法一更簡(jiǎn)單,否則使用方法二效果更好

總結(jié)

到此這篇關(guān)于vue.js修改el-popover組件顯示位置的文章就介紹到這了,更多相關(guān)修改el-popover顯示位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中瀑布流布局與圖片加載優(yōu)化的實(shí)現(xiàn)

    Vue中瀑布流布局與圖片加載優(yōu)化的實(shí)現(xiàn)

    本文主要介紹了Vue中瀑布流布局與圖片加載優(yōu)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 深入探究Vue中三種不同的props用法

    深入探究Vue中三種不同的props用法

    Vue?的核心功能之一在于?props?的使用,props?是我們?cè)?Vue?中從父組件到子組件傳遞數(shù)據(jù)的方式,但并非所有?props?都是一樣的,本文我們會(huì)深入學(xué)習(xí)這三種不同類型的?props,看看它們有何不同,以及何時(shí)使用它們,需要的朋友可以參考下
    2024-03-03
  • vue3中如何用threejs畫一些簡(jiǎn)單的幾何體

    vue3中如何用threejs畫一些簡(jiǎn)單的幾何體

    最近學(xué)習(xí)threejs有些時(shí)間了,就想著著手做些東西,下面這篇文章主要給大家介紹了關(guān)于vue3中如何用threejs畫一些簡(jiǎn)單的幾何體的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • vue $refs動(dòng)態(tài)拼接獲取值問題

    vue $refs動(dòng)態(tài)拼接獲取值問題

    這篇文章主要介紹了vue $refs動(dòng)態(tài)拼接獲取值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 10分鐘快速上手VueRouter4.x教程

    10分鐘快速上手VueRouter4.x教程

    Vue Router目前最新版本是4.X,本文主要主要介紹了10分鐘快速上手VueRouter4.x教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue2.0基于vue-cli+webpack父子組件通信(實(shí)例講解)

    Vue2.0基于vue-cli+webpack父子組件通信(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Vue2.0基于vue-cli+webpack父子組件通信(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-09-09
  • Vue 創(chuàng)建組件的兩種方法小結(jié)(必看)

    Vue 創(chuàng)建組件的兩種方法小結(jié)(必看)

    Vue 創(chuàng)建組件的方法有哪些呢?下面小編就為大家分享一篇Vue 創(chuàng)建組件的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-02-02
  • vue實(shí)現(xiàn)列表固定列滾動(dòng)

    vue實(shí)現(xiàn)列表固定列滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)列表固定列滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 在vue中實(shí)現(xiàn)echarts隨窗體變化

    在vue中實(shí)現(xiàn)echarts隨窗體變化

    這篇文章主要介紹了在vue中實(shí)現(xiàn)echarts隨窗體變化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-07-07
  • Vue3中如何使用v-model高級(jí)用法參數(shù)綁定傳值

    Vue3中如何使用v-model高級(jí)用法參數(shù)綁定傳值

    本文給大家介紹Vue3中使用v-model高級(jí)用法參數(shù)綁定傳值的相關(guān)知識(shí),包括單個(gè)輸入框傳值和多個(gè)輸入框傳值,一個(gè)組件接受多個(gè)v-model值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10

最新評(píng)論