最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Element Plus實(shí)現(xiàn)Affix 固釘

 更新時(shí)間:2021年07月19日 10:16:19   作者:LittleWorker本尊  
本文主要介紹了Element Plus實(shí)現(xiàn)Affix 固釘,Affix組件用于將頁(yè)面元素固定在特定可視區(qū)域,文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下

一、組件介紹

Affix組件用于將頁(yè)面元素固定在特定可視區(qū)域。

1.1 屬性

  • position:指定固釘?shù)奈恢茫稍O(shè)置為top或bottom,默認(rèn)為top
  • offset: 設(shè)置偏移距離,默認(rèn)為0
  • target:指定容器(CSS 選擇器),讓固釘始終保持在容器內(nèi),超過(guò)范圍則隱藏,默認(rèn)的容器是document.documentElement。
  • z-index: 固釘?shù)膶蛹?jí),默認(rèn)100

1.2 事件

  • scroll: 容器滾動(dòng)時(shí)觸發(fā)事件,參數(shù)是:固釘?shù)膕crollTop值和狀態(tài)(是否fixed)
  • change: 固釘狀態(tài)改變時(shí)觸發(fā),參數(shù)是固釘當(dāng)前是否處于fixed狀態(tài)

二、源碼分析

2.1 template

<template>
  <div ref="root" class="el-affix" :style="rootStyle">
    <div :class="{'el-affix--fixed': state.fixed}" :style="affixStyle">
      <slot></slot>
    </div>
  </div>
</template>

template部分很簡(jiǎn)單,通過(guò)slot接收內(nèi)容

2.2 script

// 部分核心代碼,代碼順序有所調(diào)整
setup(props, { emit }) {
    // target容器 ref
    const target = ref(null) 
    // 固釘ref,與template中的ref屬性配合,得到HTML元素
    const root = ref(null)
    // 滾動(dòng)容器ref
    const scrollContainer = ref(null)
    
    // 固釘狀態(tài)
    const state = reactive({
      fixed: false,
      height: 0, // height of root
      width: 0, // width of root
      scrollTop: 0, // scrollTop of documentElement
      clientHeight: 0, // clientHeight of documentElement
      transform: 0,
    })
    
    onMounted(() => {
      // 根據(jù)傳入的target確定 target容器
      if (props.target) {
        target.value = document.querySelector(props.target)
        if (!target.value) {
          throw new Error(`target is not existed: ${props.target}`)
        }
      } else {
        target.value = document.documentElement
      }
      
      // 根據(jù)固釘元素,向上尋找滾動(dòng)容器
      scrollContainer.value = getScrollContainer(root.value)
      // 監(jiān)聽(tīng)滾動(dòng)容器的scroll事件
      on(scrollContainer.value, 'scroll', onScroll)
      // 監(jiān)聽(tīng)固釘元素的resize事件
      addResizeListener(root.value, updateState)
    })
    
    // 滾動(dòng)容器的scroll事件的響應(yīng)函數(shù)
    const onScroll = () => {
      // 更新固釘狀態(tài)
      updateState()
      
      emit('scroll', {
        scrollTop: state.scrollTop,
        fixed: state.fixed,
      })
    }
    
    // 更新固釘狀態(tài)函數(shù)
    const updateState = () => {
      const rootRect = root.value.getBoundingClientRect()
      const targetRect = target.value.getBoundingClientRect()
      state.height = rootRect.height
      state.width = rootRect.width
      state.scrollTop = scrollContainer.value === window ? document.documentElement.scrollTop : scrollContainer.value.scrollTop
      state.clientHeight = document.documentElement.clientHeight

      if (props.position === 'top') {
        if (props.target) {
          const difference = targetRect.bottom - props.offset - state.height
          // targetRect.bottom > 0 對(duì)應(yīng)的是讓固釘始終保持在容器內(nèi),超過(guò)范圍則隱藏
          state.fixed = props.offset > rootRect.top && targetRect.bottom > 0
          // 用于處理場(chǎng)景:滾動(dòng)過(guò)程中,target容器可視區(qū)域不足以顯示整個(gè)固釘,則固釘應(yīng)相應(yīng)偏移,只展示部分
          state.transform = difference < 0 ? difference : 0
        } else {
          state.fixed = props.offset > rootRect.top
        }
      } else {
        if (props.target) {
          const difference = state.clientHeight - targetRect.top - props.offset - state.height
          state.fixed = state.clientHeight - props.offset < rootRect.bottom && state.clientHeight > targetRect.top
          state.transform = difference < 0 ? -difference : 0
        } else {
          state.fixed = state.clientHeight - props.offset < rootRect.bottom
        }
      }
    }
    // 監(jiān)測(cè)固釘fixed狀態(tài)變化,并對(duì)外emit change事件
    watch(() => state.fixed, () => {
      emit('change', state.fixed)
    })
    
    // 計(jì)算屬性,通過(guò)固釘?shù)臓顟B(tài)自動(dòng)更新固釘?shù)臉邮?
    const affixStyle = computed(() => {
      if (!state.fixed) {
        return
      }
      const offset = props.offset ? `${props.offset}px` : 0
      const transform = state.transform ? `translateY(${state.transform}px)` : ''

      return {
        height: `${state.height}px`,
        width: `${state.width}px`,
        top: props.position === 'top' ? offset : '',
        bottom: props.position === 'bottom' ? offset : '',
        transform: transform,
        zIndex: props.zIndex,
      }
    })
}

2.3 實(shí)現(xiàn)總結(jié):

  • 通過(guò)監(jiān)聽(tīng)滾動(dòng)容器的scroll事件(及固釘自身的resize事件);
  • 事件響應(yīng)函數(shù)中動(dòng)態(tài)獲取固釘及target容器的DOM屬性并以此計(jì)算固釘?shù)臓顟B(tài);
  • 利用計(jì)算屬性自動(dòng)更新固釘?shù)臉邮剑?/li>

到此這篇關(guān)于Element Plus實(shí)現(xiàn)Affix 固釘?shù)奈恼戮徒榻B到這了,更多相關(guān)Element Affix 固釘內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Vue3封裝實(shí)現(xiàn)圖片查看器

    基于Vue3封裝實(shí)現(xiàn)圖片查看器

    這篇文章主要為大家詳細(xì)介紹了如何基于Vue3封裝實(shí)現(xiàn)一個(gè)圖片查看器,可以點(diǎn)擊圖片放大和關(guān)閉放大的圖片,感興趣的小伙伴可以了解一下
    2025-02-02
  • 詳解vue-meta如何讓你更優(yōu)雅的管理頭部標(biāo)簽

    詳解vue-meta如何讓你更優(yōu)雅的管理頭部標(biāo)簽

    這篇文章主要介紹了詳解vue-meta如何讓你更優(yōu)雅的管理頭部標(biāo)簽,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Vue中列表渲染指令v-for的基本用法詳解

    Vue中列表渲染指令v-for的基本用法詳解

    v-for指令是在模板編譯的代碼生成階段實(shí)現(xiàn)的,當(dāng)遍歷數(shù)組或?qū)ο髸r(shí)需要使用列表渲染指令v-for。本文主要為大家介紹了v-for指令的基本用法,希望對(duì)大家有所幫助
    2023-04-04
  • Vue3?PC端頁(yè)面開(kāi)發(fā)規(guī)范及說(shuō)明

    Vue3?PC端頁(yè)面開(kāi)發(fā)規(guī)范及說(shuō)明

    這篇文章主要介紹了Vue3?PC端頁(yè)面開(kāi)發(fā)規(guī)范及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 在vue項(xiàng)目中集成graphql(vue-ApolloClient)

    在vue項(xiàng)目中集成graphql(vue-ApolloClient)

    這篇文章主要介紹了在vue項(xiàng)目中集成graphql(vue-ApolloClient),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • vue中解決el-date-picker更改樣式不生效問(wèn)題

    vue中解決el-date-picker更改樣式不生效問(wèn)題

    在使用Vue.js進(jìn)行前端開(kāi)發(fā)的過(guò)程中,Element?UI?是一個(gè)非常流行的UI庫(kù),它提供了一套完整的組件來(lái)快速搭建美觀的用戶界面,但是我們經(jīng)常遇到一個(gè)問(wèn)題使用Element?UI提供的el-date-picker組件時(shí),嘗試自定義其樣式卻無(wú)法生效,所以本文給大家介紹如何解決這個(gè)問(wèn)題
    2024-10-10
  • vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決

    vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決

    這篇文章主要介紹了vue中循環(huán)請(qǐng)求接口參數(shù)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue使用echarts實(shí)現(xiàn)立體柱形圖

    vue使用echarts實(shí)現(xiàn)立體柱形圖

    這篇文章主要為大家詳細(xì)介紹了vue使用echarts實(shí)現(xiàn)立體柱形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Proxy中代理數(shù)據(jù)攔截的方法詳解

    Proxy中代理數(shù)據(jù)攔截的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Proxy中代理數(shù)據(jù)攔截的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-12-12
  • Vuex實(shí)現(xiàn)購(gòu)物車小功能

    Vuex實(shí)現(xiàn)購(gòu)物車小功能

    這篇文章主要為大家詳細(xì)介紹了Vuex實(shí)現(xiàn)購(gòu)物車小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評(píng)論

温泉县| 广德县| 耿马| 阳曲县| 秦安县| 泰州市| 衡阳县| 芒康县| 赤峰市| 海林市| 勃利县| 福建省| 贵定县| 临泽县| 宁武县| 永嘉县| 沛县| 海城市| 抚松县| 大余县| 石首市| 嘉峪关市| 略阳县| 泽普县| 阿瓦提县| 建瓯市| 明星| 独山县| 宜阳县| 虹口区| 三门县| 达尔| 高台县| 随州市| 平乡县| 阳朔县| 林芝县| 青川县| 肇东市| 栾城县| 五家渠市|