Vue3/2 組件寬高比固定時基于寬度自適應的一種思路

現(xiàn)實問題

我們在寫Vue組件時想诅,我們希望當組件的父級寬度一定時纪吮,組件能根據(jù)固定的寬高比例進行自適應狡赐,或者一些背景的自適應腐螟,以提高組件的復用性愿汰。

實現(xiàn)思路

  1. 在當前組件最外層元素設置ref
  2. 組件Props中傳入?yún)?shù)width(當傳入值為100% 父級組件存在寬度時乐纸,高度即是自適應衬廷。),并通過一個computed變量和v-bind方法綁定至最外層元素CSSwidth中汽绢。
  3. 在組件的onMounted生命周期中通過ref獲取當前組件的clientWidth(此生命周期中吗跋,組件已渲染完畢)。再通過ref去修改style中的height達到一個寬高比固定的自適應。
  4. Vue2無法使用v-bind綁定CSS變量跌宛,但是可通過一個computed計算出樣式和 :style綁定樣式中酗宋。

Vue3 + TS 實現(xiàn)代碼

此樣例中的background也是通過傳入的兩個變量計算漸變獲得。

組件代碼如下:

<template>
<!-- ref綁定 -->
<div ref="card" class="card-container">

</div>
</template>

<style lang="scss" scoped>
.card-container {
    width: v-bind(width);  // 綁定width
    border-radius: 8px;
    background: v-bind(background);  // 綁定background
}
</style>

<script lang="ts" setup>
import { ref, onMounted, Ref, computed } from 'vue';

const props = defineProps({
    // 傳入高度
    width: {
        type: String,
        default: '200px'
    },
    // 背景漸變開始的顏色
    beginColor: {
        type: String,
        default: '#4996FF'
    },
    // 背景漸變結束的顏色疆拘,用于linear-gradient
    endColor: {
        type: String,
        default: '#358CFF'
    }
})

// 綁定HTML元素
const card: Ref<null> | Ref<HTMLElement> = ref(null);

// computed綁定傳入寬度
const width =  computed(() => {
    return props.width;
})

// computed 計算背景
const background = computed(() => {
    return `linear-gradient(104.37deg,${props.beginColor} 4.7%, ${props.endColor} 100%)`;
})

onMounted(() => {
    if(!card.value ) return
    // 獲取渲染完成的元素寬度
    const nowWidth = (card as Ref<HTMLElement>).value.clientWidth;
    // 更改元素高度蜕猫,此處比例 16 : 9
    (card as Ref<HTMLElement>).value.style.height = `${nowWidth / 16 * 9}px`;
})

</script>

代碼效果

測試代碼:

<template>
<div class="width-fit-cards">
    <div v-for="(item,index) in 4" :style="{width: `${(index + 1) * 100}px`}" class="width-card" >
        <width-fit-card width="100%"/>
    </div>
</div>
</template>

<style lang="scss" scoped>
.width-fit-cards {
    display: flex;
    .width-card + .width-card {
        margin-left: 20px;
    }
}
</style>

<script lang="ts" setup>
// 引入組件
import widthFitCard from './widthFitCard.vue';

</script>

測試效果

測試效果.png

Vue2

Vue2通過以下代碼綁定CSS樣式:

 computed: {
        getCardStyle() {
            return {
                width: this.width
            }
        }
    }
<div :style="getCardStyle" ref="card" class="card-container">
</div>

具體可以自行實現(xiàn)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哎迄,隨后出現(xiàn)的幾起案子回右,更是在濱河造成了極大的恐慌,老刑警劉巖漱挚,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔烁,死亡現(xiàn)場離奇詭異,居然都是意外死亡旨涝,警方通過查閱死者的電腦和手機蹬屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白华,“玉大人慨默,你說我怎么就攤上這事〕挠悖” “怎么了业筏?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸟赫。 經(jīng)常有香客問我蒜胖,道長,這世上最難降的妖魔是什么抛蚤? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任台谢,我火速辦了婚禮,結果婚禮上岁经,老公的妹妹穿的比我還像新娘朋沮。我一直安慰自己,他們只是感情好缀壤,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布樊拓。 她就那樣靜靜地躺著,像睡著了一般塘慕。 火紅的嫁衣襯著肌膚如雪筋夏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天图呢,我揣著相機與錄音条篷,去河邊找鬼骗随。 笑死,一個胖子當著我的面吹牛赴叹,可吹牛的內(nèi)容都是我干的鸿染。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乞巧,長吁一口氣:“原來是場噩夢啊……” “哼涨椒!你這毒婦竟也來了?” 一聲冷哼從身側響起摊欠,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤丢烘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后些椒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡掸刊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年免糕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忧侧。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡石窑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚓炬,到底是詐尸還是另有隱情松逊,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布肯夏,位于F島的核電站经宏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驯击。R本人自食惡果不足惜烁兰,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徊都。 院中可真熱鬧沪斟,春花似錦、人聲如沸暇矫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽李根。三九已至槽奕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朱巨,已是汗流浹背史翘。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琼讽。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓必峰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钻蹬。 傳聞我的和親對象是個殘疾皇子吼蚁,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容