实现固定宽高比盒子的几种方案的总结

1,541 阅读1分钟

刚入职的时候,没有公司七牛上传图片的权限,页面嵌入图片的时候不能使用img标签,只能写一个盒子把图片写成背景属性,但是这样也失去了图片的自适应特性。为了可以让背景图片也能灵活适应,可以先根据图片的宽高比实现一个固定宽高比的盒子,然后background-size:100%,也能让图片不变形,所以总结了几种常见使用的固定宽高比的方案

padding-top or padding-bottom

方法简单,使用性很强,适用于大部分场景

div class="aspectration" data-ratio="16:9">
     <div class="content"></div>
</div>
.aspectration {
    height: 0;
    width: 100%;
}

.aspectration[data-ratio="16:9"] {
    padding-top: 56.25%;
}

结合calc

.aspectration[data-ratio="16:9"] {
    padding-top:  calc(100% * 9 / 16);
}

结合伪元素

.aspectration:after { 
    content: ""; 
    display: block; 
    width: 1px; 
    margin-left: -1px; 
} 
.aspectration[data-ratio="16:9"]:after {
    padding-top: 56.25%; 
}

css新特性 CSS Grid Layout

直接上代码

.aspectration {  
    display: grid; 
    grid-template-columns: repeat(16, 6.25vw); 
    grid-auto-rows: 6.25vw; 
    
} 
.aspectration[data-ratio="16:9"] .content { 
    grid-column: span 16; 
    grid-row: span 9;
}

未来的新标准 aspect-ratio

尚未支持,可以借助PostCSS Aspect Ratio,实现基础跟第一种padding方式相同

总结:padding方式的实现适用性最为广泛,兼容性更好,相当于一种hack,网格实现比较复杂,只在现代浏览器支持,aspect-ratio方式最为优雅,语义更加明显,是未来的趋势。


参考自大漠老师的《css实现长宽比的几种方案