vue利用指令實現(xiàn)快速設(shè)置元素的高度
在項目中經(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 實現(xiàn)的指令,它將元素的邊界信息轉(zhuǎn)換為 CSS 變量,并將這些 CSS 變量應(yīng)用到元素的樣式上。
以下是代碼的詳細解釋:
setStyles函數(shù)用于設(shè)置元素的樣式。它接受一個元素和一個可選的配置對象作為參數(shù)。配置對象可以包含一個前綴選項,用于指定生成的 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選項,用于指定 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> 元素。下面是代碼的詳細解釋:
<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)點擊<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)點擊時會觸發(fā)一個函數(shù)。此外,它還使用了一個自定義指令來將元素的邊界信息轉(zhuǎn)換為 CSS 變量,并使用這些變量來設(shè)置元素的樣式。
到此這篇關(guān)于vue利用指令實現(xiàn)快速設(shè)置元素的高度的文章就介紹到這了,更多相關(guān)vue指令設(shè)置元素高度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue 前端實現(xiàn)登陸攔截及axios 攔截器的使用
這篇文章主要介紹了Vue 前端實現(xiàn)登陸攔截及axios 攔截器的使用,通過這個項目學(xué)習(xí)如何實現(xiàn)一個前端項目中所需要的 登錄及攔截、登出、token失效的攔截及對應(yīng) axios 攔截器的使用。需要的朋友可以參考下2019-07-07
vue 單頁應(yīng)用和多頁應(yīng)用的優(yōu)劣
這篇文章主要介紹了vue 單頁應(yīng)用和多頁應(yīng)用的優(yōu)劣,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-10-10
vue使用高德地圖實現(xiàn)添加點標(biāo)記和獲取點擊位置信息的示例代碼
這篇文章主要介紹了vue使用高德地圖實現(xiàn)添加點標(biāo)記和獲取點擊位置信息的示例代碼,文中補充介紹了高德vue-amap使用(一)標(biāo)記點位獲取地址及經(jīng)緯度,本文結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友參考下吧2024-01-01
vue init webpack 建vue項目報錯的解決方法
今天小編就為大家分享一篇vue init webpack 建vue項目報錯的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

