美文网首页
Vue3/2 组件宽高比固定时基于宽度自适应的一种思路

Vue3/2 组件宽高比固定时基于宽度自适应的一种思路

作者: 跟着Damon写代码 | 来源:发表于2022-05-05 22:58 被阅读0次

现实问题

我们在写Vue组件时,我们希望当组件的父级宽度一定时,组件能根据固定的宽高比例进行自适应,或者一些背景的自适应,以提高组件的复用性。

实现思路

  1. 在当前组件最外层元素设置ref
  2. 组件Props中传入参数width(当传入值为100% 父级组件存在宽度时,高度即是自适应。),并通过一个computed变量和v-bind方法绑定至最外层元素CSSwidth中。
  3. 在组件的onMounted生命周期中通过ref获取当前组件的clientWidth(此生命周期中,组件已渲染完毕)。再通过ref去修改style中的height达到一个宽高比固定的自适应。
  4. Vue2无法使用v-bind绑定CSS变量,但是可通过一个computed计算出样式和 :style绑定样式中。

Vue3 + TS 实现代码

此样例中的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>

具体可以自行实现

相关文章

  • Vue3/2 组件宽高比固定时基于宽度自适应的一种思路

    现实问题 我们在写Vue组件时,我们希望当组件的父级宽度一定时,组件能根据固定的宽高比例进行自适应,或者一些背景的...

  • NGUI UIRoot自适应

    宽高比 主流屏幕基本都大于1.7,故NGUI3.7以前只有以高度为基准自适应。即高度保持不变,宽度变化的方式自适应...

  • 设计一种自适应的React卡片列表组件

    本文介绍一种用React实现的自适应的卡片列表组件,该组件根据卡片的宽度与间隔自动适应不同容器的宽度对卡片进行排列...

  • provide inject在vue2和vue3中的使用

    vue2父组件 vue2子组件 vue3父组件 vue3子组件 vue3官方详细使用provide inject地...

  • 前端面试必会题目

    1. 上下左右居中 2. 两栏,左边栏宽度固定100px,右边栏宽度自适应 思路:左边栏宽度固定,设置左浮动,右边...

  • CSS-布局5-Calc三列布局

    1、实现效果   Calc实现三列布局,中间自适应,左右固定宽度。 2、实现思路   中间宽度 计算出来 : ca...

  • 对于页面适配,应该用px还是rem?

    css单位:%,px,em,rem,vw,vh等 eg:设置一个矩形的宽高比为16:9,并且岁屏幕宽度自适应时,除...

  • 移动h5自适应布局

    移动h5自适应布局 问题一,分辨率Resolution适配:不同屏幕宽度,html元素宽高比和字体大小,元素之间的...

  • 借助padding-bottom实现“适应性矩形”

    背景:在页面布局的时候,有时会需要一个特定宽高比的矩形作为页面元素的容器,而且它的宽度是自适应的(要随着页面宽度而...

  • CSS常见布局

    双列布局:一列固定宽度,另外一列自适应宽度实现思路:浮动元素 + 普通元素margin(右边时自适应同理) 三列布...

网友评论

      本文标题:Vue3/2 组件宽高比固定时基于宽度自适应的一种思路

      本文链接:https://www.haomeiwen.com/subject/phxayrtx.html