CSS - img自适应宽高

使用CSS3属性object-fit,参考博客CSS3 object-fit属性

假设一个img为宽200px,高150px,不对img属性做任何处理,图片会被拉伸,如下图所示

为了不让图片被拉伸,可以居中显示在固定的宽高内(200px 150px),通常解决办法是写在一个div内,为div设置以下属性

background: url('xxx') center center no-repeat;
background-size: 100%;

在img中使用object-fit属性,可以达到同样得效果

width: 200px
height: 150px
object-fit: cover

图片会裁剪显示,如下图所示

object-fit还有其他属性值,具体用法参考文档

长宽相等的图片

.cover {
  position: relative;
  padding-bottom: 100%;
  width: 100%;
  height: 0;
  
  img {
    position: absolute;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}

 

### 解决方案 为了实现 `el-carousel` 组件的自适应,可以通过动态计算度并绑定到组件的 `height` 属性来完成。以下是几种常见的解决方案: #### 方法一:通过 CSS 单位设置固定比例度 可以利用现代浏览器支持的视口单位(如 `vh`, `vw`),直接在模板中定义 `height` 的值。 ```html <el-carousel class="carousel-container" loop height="25dvw" :interval="4000" indicator-position="outside"> <el-carousel-item v-for="item in carouselsList" :key="item.id"> <img class="img-container" :src="item.path" :alt="item.name"/> </el-carousel-item> </el-carousel> ``` 此方法简单易用,适用于内容度相对固定的场景[^1]。然而,如果图片或其他子元素的度不一致,则可能导致布局错乱。 --- #### 方法二:基于事件监听动态调整度 当轮播项的内容度可能发生变化时,可通过 JavaScript 动态获取当前显示内容的实际度,并将其赋值给父容器的 `height` 属性。 ```html <el-carousel ref="bannerCarousel" :interval="5000" arrow="always" @change="calcDivHeight" :height="carouselHeight + 'px'" :autoplay="bannerAutoPlay" > <el-carousel-item v-for="(item, index) in personCarouse" :key="index" :style="{ height: carouselHeight + 'px', overflow: 'hidden' }" > <div @click="goTo(item.webUrl)" :ref="'banner-div-' + index" style="background: transparent;" > <el-image style="width: 100%;" :src="item.imgUrl" fit="fill" :ref="'banner-img-' + index" @load="initDivHeight(index)" /> </div> </el-carousel-item> </el-carousel> ``` 在此方法中,`@load` 和 `@change` 事件分别用于初始化和切换时重新计算度[^2]。具体逻辑如下: - **`@load`**: 当每张图片加载完成后触发,调用函数测量其真实尺寸。 - **`@change`**: 轮播切换时更新目标区域的度。 配合 Vue 数据绑定机制,能够灵活应对多种复杂情况。 --- #### 方法三:全屏模式下的响应式设计 对于需要完全适配屏幕大小的情况,可采用以下方式: ```html <div class="swiper"> <el-carousel indicator-position="none" arrow="always" :height="bannerHeight + 'px'" > <el-carousel-item v-for="(item, index) in swiperlist" :key="index"> <a :href="item.bannerTargetUrl" :target="targetUrl(item.targetType)"> <img :src="item.bannerUrl" ref="image" @load="imageLoaded"/> </a> </el-carousel-item> </el-carousel> </div> ``` 同时,在脚本部分加入窗口缩放监听器以实时同步 banner 度变化[^3]: ```javascript export default { data() { return { bannerHeight: window.innerHeight * 0.8 // 初始占屏幕度的80% }; }, methods: { imageLoaded() { this.$nextTick(() => { const images = Array.from(this.$refs.image); let maxHeight = Math.max(...images.map(img => img.offsetHeight)); this.bannerHeight = maxHeight; }); } }, mounted() { window.addEventListener('resize', () => { this.bannerHeight = window.innerHeight * 0.8; }); }, beforeDestroy() { window.removeEventListener('resize'); } }; ``` 这种方法特别适合制作大屏展示类应用,能有效提升用户体验。 --- ### 总结 以上三种策略各有优劣: - 如果项目对性能要求较且内容结构稳定,推荐使用 **CSS 单位法**; - 对于动态数据驱动或者交互频繁的应用场景,建议优先考虑 **JavaScript 动态调整法**; - 若追求极致视觉效果则可以选择 **全屏响应式设计** 方案。 最终选择应依据实际业务需求权衡利弊决定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值