纯 CSS 实现高度与宽度成比例的效果

最近在做一个产品列表页面,布局如右图所示。页面中有若干个 item,其中每个 item 都向左浮动,并包含在自适应浏览器窗口宽度的父元素中。

item 元素的 CSS 定义如下:

.item {
float: left;
margin: 10px 2%;
width: 21%;
}

这时遇到的一个需求:在保持 item 元素宽高比恒定(如高是宽的 1.618 倍)的情况下,使得 item 元素可以和父元素同比缩放。 我们知道,如果当 item 元素是图片,同时需要保持的宽高比恰好为图片本身的宽高比时,可以设置 item 的 height 为 auto 即可轻松实现这个需求。然而当 item 元素不是图片或者要保持的宽高比和图片本身的宽高比不同时,这个需求显得很难直接用 CSS 实现。

为此我放弃 CSS,直接用 JavaScript 绑定 window 的 onresize 事件来动态获取每个 item 的宽度,从而计算并设置其高度。

我一直在使用这个解决方案,直到今天调整样式时,突然想到这个需求竟然是可以只使用 CSS 解决的。

首先需要知道,一个元素的 padding,如果值是一个百分比,那这个百分比是相对于其父元素的宽度而言的,即使对于 padding-bottom 和 padding-top 也是如此。

另外,在计算 Overflow 时,是将元素的内容区域(即 width / height 对应的区域)和 Padding 区域一起计算的。换句话说,即使将元素的 overflow 设置为 hidden,“溢出”到 Padding 区域的内容也会照常显示。

综上两条所述,我们可以使用 padding-bottom 来代替 height 来实现高度与宽度成比例的效果。因为 item 元素的宽度是其父元素宽度的 21%,所以我们将 padding-bottom 设置为它的 1.618 倍,即 33.98%。同时将其 height 设置为 0 以使元素的“高度”等于 padding-bottom 的值,从而实现需要的效果。

最后 item 元素的 CSS 样式为:

.item {
float: left;
margin: 10px 5%;
padding-bottom: 33.98%;
width: 21%;
height: 0;
}

页面效果见 http://jsfiddle.net/luin/25BbH/7/,拖动窗口调整页面宽度,item 元素始终保持恒定的宽高比。

具体快去http://zihua.li/2013/12/keep-height-relevant-to-width-using-css/了解,同时感谢楼主的分享。

demo:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div class="aaa" style="width:80%;height:0;padding-bottom: 45%;margin: 0 auto;">
            <img src="../style/img/login_bg1.jpg"/ style="width:100%;">
        </div>
    </body>
</html>

最新文章

  1. JS组件系列——两种bootstrap multiselect组件大比拼
  2. Ext 下拉列表模糊搜索
  3. 系统调用方式文件编程,王明学learn
  4. MagicalRecord 多表关联数据操作
  5. TS 流解码过程
  6. appium初探问题总结
  7. phpstudy 下开启openssl
  8. 1230.2——iOS准备(阅读开发者文档时的笔记)
  9. JAVASCRIPT——文字出现效果练习
  10. Linux下安装jdk1.8
  11. dll导入导出资源文件查看工具 InspectExe
  12. Android项目----dispathTouchEvent
  13. PAT (Advanced Level) 1112. Stucked Keyboard (20)
  14. 二分图最大匹配 Hopcroft-Karp算法模板
  15. IDEA 编译等级与源代码等级不一致问题
  16. Dalvik 虚拟机操作码
  17. 【Hadoop】2、Hadoop高可用集群部署
  18. CF1131D Gourmet choice(并查集,拓扑排序)
  19. bootstrap中的对话框-dialog-2
  20. swift语言的特征:类型系统与函数式编程:swift是面向类型和面向函数编程的语言

热门文章

  1. CSS border边框属性教程(color style)
  2. Python XML解析
  3. Spark交互式工具spark-shell
  4. 超全整理!Linux性能分析工具汇总合集
  5. Python之函数——基础篇
  6. (16/24) webpack打包后的调试方法
  7. rhel7配置yum的方法
  8. SqlServer——触发器
  9. 前台框架vue.js中怎样嵌入 Echarts 组件?
  10. spring coud feign