vue利用指令實(shí)現(xiàn)快速設(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 變量。它包含mounted
和updated
兩個生命周期鉤子函數(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)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Vue.extend 登錄注冊模態(tài)框的實(shí)現(xiàn)
這篇文章主要介紹了Vue.extend 登錄注冊模態(tài)框的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12axios+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)用程序,以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。2018-09-09vue項(xiàng)目中將element-ui table表格寫成組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue項(xiàng)目中將element-ui table表格寫成組件的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06Vue按照順序?qū)崿F(xiàn)多級彈窗效果 附Demo
這篇文章主要介紹了Vue按照順序?qū)崿F(xiàn)多級彈窗效果 附Demo,通過實(shí)例代碼介紹了單個彈窗和多級彈窗的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2024-05-05