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

vue利用指令實(shí)現(xiàn)快速設(shè)置元素的高度

 更新時間:2024年03月11日 08:52:26   作者:pe7er  
在項(xiàng)目中經(jīng)常有需要將列表的高度設(shè)置成剩余可視區(qū)域的高度,本文主要來和大家介紹一下如何通過指令和css變量的方式快速設(shè)置列表高度,希望對大家有所幫助

在項(xiàng)目中經(jīng)常有需要將列表的高度設(shè)置成剩余可視區(qū)域的高度,一般的做法是用ref獲取后,計算元素的top,然后通過v-bind()將top注入到style中

cn.vuejs.org/api/sfc-css-features.html#v-bind-in-css

height: calc(100vh - v-bind(top))

下面介紹一種通過指令和css變量的方式快速設(shè)置列表高度的方法,下面是代碼示例。

import type { DirectiveBinding, Directive } from 'vue'

const PREFIX = '--bounding-info-'
interface IOptions {
  prefix?: string
}

const setStyles = (el: HTMLElement, options: IOptions = {}) => {
  const { prefix = PREFIX } = options
  const boundingClientRectInfo = el.getBoundingClientRect()
  const { width, height, top, right, bottom, left, x, y } = boundingClientRectInfo
  const rawStylesStr = el.getAttribute('style')
  const rawStyles = rawStylesStr ? rawStylesStr.split(';').filter((item) => !!item && !item.includes(prefix)) : []
  const bindingStyles = [
    {
      name: 'width',
      value: width
    },
    {
      name: 'height',
      value: height
    },
    {
      name: 'top',
      value: top
    },
    {
      name: 'right',
      value: right
    },
    {
      name: 'bottom',
      value: bottom
    },
    {
      name: 'left',
      value: left
    },
    {
      name: 'x',
      value: x
    },
    {
      name: 'y',
      value: y
    }
  ].map((item) => `${prefix}${item.name}: ${item.value}px`)
  const newStyles = rawStyles.concat(bindingStyles)
  el.setAttribute('style', newStyles.join(';'))
}
const boundingInfoToCssVar: Directive = {
  mounted(el: HTMLElement, binding: DirectiveBinding) {
    setStyles(el, binding.arg as IOptions)
  },
  updated(el: HTMLElement, binding: DirectiveBinding, vnode, prevVnode) {
    setStyles(el, binding.arg as IOptions)
  }
  // beforeUnmount(el: HTMLElement, binding: DirectiveBinding) {
  //   console.log(el)
  // }
}

export const name = 'BoundingInfoToCssVar'
export default boundingInfoToCssVar

使用方法

<div
  v-if="activated"
  v-bounding-info-to-css-var:[boundingInfoOptions]
  style="font-size: 12px"
  :style="styles"
  @click="closeHandle"
  class="overflow"
/>

<script lang="ts" setup>
const boundingInfoOptions = { prefix: '--bounding-info-' }
</script>

<style lang="less">
.overflow {
  height: calc(100vh - var(--bounding-info-top));
}
</style>

這是一個使用 Vue.js 實(shí)現(xiàn)的指令,它將元素的邊界信息轉(zhuǎn)換為 CSS 變量,并將這些 CSS 變量應(yīng)用到元素的樣式上。

以下是代碼的詳細(xì)解釋:

setStyles函數(shù)用于設(shè)置元素的樣式。它接受一個元素和一個可選的配置對象作為參數(shù)。配置對象可以包含一個前綴選項(xiàng),用于指定生成的 CSS 變量的前綴。

  • 函數(shù)內(nèi)部首先獲取元素的邊界信息,包括寬度、高度、上邊界、右邊界、下邊界、左邊界、水平偏移量和垂直偏移量。
  • 然后,它從元素的現(xiàn)有樣式中提取出不包含指定前綴的樣式,并將其存儲在rawStyles數(shù)組中。
  • 接下來,它根據(jù)邊界信息生成一組 CSS 變量,并將其存儲在bindingStyles數(shù)組中。每個 CSS 變量的名稱都以指定的前綴開頭,后面跟著對應(yīng)的邊界信息名稱,值為邊界信息的值,單位為像素。
  • 最后,它將原始樣式和生成的綁定樣式合并成一個新的樣式字符串,并將其設(shè)置回元素的style屬性中。

boundingInfoToCssVar指令用于將邊界信息轉(zhuǎn)換為 CSS 變量。它包含mountedupdated兩個生命周期鉤子函數(shù)。

  • mounted函數(shù)在指令首次綁定到元素時被調(diào)用,它調(diào)用setStyles函數(shù)來設(shè)置元素的樣式。
  • updated函數(shù)在指令的綁定值發(fā)生變化時被調(diào)用,它也調(diào)用setStyles函數(shù)來更新元素的樣式。

代碼最后導(dǎo)出了指令的名稱和定義,以便在其他地方使用。

使用這個指令時,可以在模板中使用v-bounding-info-css-var指令來綁定一個對象,該對象可以包含一個prefix選項(xiàng),用于指定 CSS 變量的前綴。例如:

<!-- 此處的元素將具有帶有 --my-prefix- 前綴的 CSS 變量 -->
<div v-bounding-info-css-var="{ prefix: '--my-prefix-' }"></div>

這樣,元素的邊界信息將被轉(zhuǎn)換為帶有指定前綴的 CSS 變量,并應(yīng)用到元素的樣式上。

這段代碼是一個使用 Vue.js 的示例,它包含一個具有條件渲染和一個自定義指令 v-bounding-info-to-css-var 的 <div> 元素。下面是代碼的詳細(xì)解釋:

<div
  v-if="activated"
  v-bounding-info-to-css-var:[boundingInfoOptions]
  style="font-size: 12px"
  :style="styles"
  @click="closeHandle"
  class="list"
 />
  • v-if="activated":這是一個條件渲染指令,只有當(dāng) activated 變量的值為 true 時,這個 <div> 元素才會被渲染。
  • v-bounding-info-to-css-var:[boundingInfoOptions]:這是一個自定義指令,它接受一個參數(shù) boundingInfoOptions,這個參數(shù)會被傳遞給指令的處理函數(shù)。
  • style="font-size: 12px":這是一個內(nèi)聯(lián)樣式,用于設(shè)置 <div> 元素的字體大小為 12px
  • :style="styles":這是一個 v-bind 指令,它將 styles 變量綁定到 <div> 元素的 style 屬性上。
  • @click="closeHandle":這是一個事件監(jiān)聽指令,當(dāng)點(diǎn)擊 <div> 元素時,會觸發(fā) closeHandle 函數(shù)。
  • class="list":這是一個類名,用于給 <div> 元素添加一個名為 list 的類。
const boundingInfoOptions = { prefix: '--bounding-info-' }

boundingInfoOptions:這是一個對象,它包含了自定義指令 v-bounding-info-to-css-var 所需的參數(shù)。在這個例子中,prefix 是一個參數(shù),它的值為 --bounding-info-。

.list { height: calc(100vh - var(--bounding-info-top)); }

.list:這是一個類選擇器,用于選擇具有 list 類的元素。

height: calc(100vh - var(--bounding-info-top));:這是一個 CSS 樣式聲明,它使用了 calc 函數(shù)來計算元素的高度。100vh 表示視窗的高度,var(--bounding-info-top) 表示一個變量,它的值是由自定義指令 v-bounding-info-to-css-var 設(shè)置的上邊界距離。通過減去上邊界的距離,得到了元素的高度。

總的來說,這段代碼的目的是在一個具有特定條件(activated 為 true)的情況下,渲染一個 <div> 元素。這個元素具有一些樣式,并且當(dāng)點(diǎn)擊時會觸發(fā)一個函數(shù)。此外,它還使用了一個自定義指令來將元素的邊界信息轉(zhuǎn)換為 CSS 變量,并使用這些變量來設(shè)置元素的樣式。

到此這篇關(guān)于vue利用指令實(shí)現(xiàn)快速設(shè)置元素的高度的文章就介紹到這了,更多相關(guān)vue指令設(shè)置元素高度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+springboot上傳大文件的實(shí)現(xiàn)示例

    vue+springboot上傳大文件的實(shí)現(xiàn)示例

    本文主要介紹了vue+springboot上傳大文件的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue如何使用HMAC-SHA256簽名算法

    vue如何使用HMAC-SHA256簽名算法

    這篇文章主要介紹了vue使用HMAC-SHA256簽名算法的相關(guān)知識,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Vue.extend 登錄注冊模態(tài)框的實(shí)現(xiàn)

    Vue.extend 登錄注冊模態(tài)框的實(shí)現(xiàn)

    這篇文章主要介紹了Vue.extend 登錄注冊模態(tài)框的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • axios+Vue實(shí)現(xiàn)上傳文件顯示進(jìn)度功能

    axios+Vue實(shí)現(xiàn)上傳文件顯示進(jìn)度功能

    這篇文章主要介紹了axios+Vue上傳文件顯示進(jìn)度效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 通過vue-cli3構(gòu)建一個SSR應(yīng)用程序的方法

    通過vue-cli3構(gòu)建一個SSR應(yīng)用程序的方法

    這篇文章主要介紹了通過vue-cli3構(gòu)建一個SSR應(yīng)用程序,以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
    2018-09-09
  • vue項(xiàng)目中將element-ui table表格寫成組件的實(shí)現(xiàn)代碼

    vue項(xiàng)目中將element-ui table表格寫成組件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue項(xiàng)目中將element-ui table表格寫成組件的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-06-06
  • Vue按照順序?qū)崿F(xiàn)多級彈窗效果 附Demo

    Vue按照順序?qū)崿F(xiàn)多級彈窗效果 附Demo

    這篇文章主要介紹了Vue按照順序?qū)崿F(xiàn)多級彈窗效果 附Demo,通過實(shí)例代碼介紹了單個彈窗和多級彈窗的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • vue中的錨點(diǎn)定位問題

    vue中的錨點(diǎn)定位問題

    這篇文章主要介紹了vue中的錨點(diǎn)定位問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue中key使用的問題示例解析

    vue中key使用的問題示例解析

    這篇文章主要為大家介紹了vue中key使用的問題示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Element-UI 使用el-row 分欄布局的教程

    Element-UI 使用el-row 分欄布局的教程

    這篇文章主要介紹了Element-UI 使用el-row 分欄布局的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論