原理

  1. 元素的padding值如果使用百分比,那这个百分比是相对于父元素宽度而言的,padding-top和padding-bottom指定百分比时也是相对于父元素高度而言;
  2. IE盒模型中,width = content + padding + border,因此只设置padding也会使元素在页面上占据一部分区域;chromium内核浏览器大多采用IE盒模型而非W3C标准盒模型;

验证

写两个元素,父元素宽高200px,子元素padding为20%,可以在调试器里看到,四边padding都是20px;

<!DOCTYPE html>
<html>
<head><style type="text/css">.outter {width: 200px;height: 200px}.inner {padding: 10%;}</style>
</head>
<body><div class="outter"><div class="inner"></div></div>
</body>
</html>

截图里,.outter是父元素,右下角盒模型是.inner;
思考:为什么.inner的盒模型中,content区域是160*0?

应用

实现保持宽高比

以实现宽高比为 11:9 为例。宽高比11:9,则高为宽的0.8181(=9/11),所以设置padding-top为81.81%,这样inner占据的高度就是outter宽度的81.81%。如下图,可以看到inner的高度为163.61=200*81.81%,实现了inner在页面中占据的空间宽高比为9/11。

但此时如果在inner内部放入其他元素的话,会因为padding-top的存在,导致元素无法从outter的顶部开始排列,如下图。

这时候需要为inner设置position:relative; 然后在inner内部设置一个容器宽高为100%,position:absolute; 元素放在inner内部容器中,即可从outter的顶部开始排列元素;

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">.outter {width: 200px;height: 200px}.inner {padding-top: 81.81%;position: relative;}.inner>.inner-content {width: 100%;height: 100%;position: absolute;top: 0;left: 0;}img {width: 100%;height: 100%;}</style></head>
<body><div class="outter"><div class="inner"><div class="inner-content"><img src="https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268/sign=2e12f29caa4bd11304cdb03462aea488/377adab44aed2e736d5390c38001a18b86d6faa3.jpg"></div></div></div><h1>ok</h1>
</body>
</html>


这里需要注意,如果inner-content中内容过多导致高度超出inner-content的height,会直接渲染到页面上,而不占据多余的页面空间(因为inner-content已经拉出文档流),有可能会遮挡outter下面的内容。因此需要根据情况设置inner-content的overflow:hidden; 或 overflow:auto;

Vue中,实现保持宽高比的组件

根据以上的实现方式,可以自定义一个vue组件,用于保持宽高比。

<template><div class="outter" :style="formattedRatioStyle"><div class="inner"><div class="inner-content"><slot></slot>  </div></div></div>
</template><script>export default {data() {return {};},props: ['ratio', 'overflow', 'overflowX', 'overflowY'],computed: {formattedRatioStyle() {let ratio = this.ratio;if (ratio == null || Number.isNaN(ratio)) {ratio = 100;}if (typeof ratio !== 'string' || !ratio.endsWith('%')) {ratio = ratio + '%';}return `padding-top: ${ratio};`;},formattedContentStyle() {const styles = [];if (this.overflow) {styles.push('overflow:' + this.overflow);}if (this.overflowX) {styles.push('overflow-x:' + this.overflowX);}if (this.overflowY) {styles.push('overflow-y:' + this.overflowY);}return styles.join(';');},}}
</script><style scoped lang="scss">.outter {width: 100%;height: 0;position: relative;.inner {width: 100%;height: 100%;position: absolute;top: 0;left: 0;}}
</style>

使用

<aspect-ratio ratio="81.81" overflow="auto"></aspect-ratio>

css实现保持元素宽高比相关推荐

  1. html图片固定高宽比显示,科技常识:CSS背景图片固定宽高比自适应调整的实现方法...

    今天小编跟大家讲解下有关CSS背景图片固定宽高比自适应调整的实现方法 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关CSS背景图片固定宽高比自适应调整的实现方法 的相关资料,希望小伙伴们看 ...

  2. html背景图片div设置宽自动,CSS背景图片固定宽高比自适应调整的实现方法

    标签可以使图片在保持宽高比不变的情况下自动调整.我们讨论的是div的背景图片实现固定宽高比自适应调整的方法.这里的图片不是< img>标签一样通过src引入,而是通过css的backgro ...

  3. CSS实现元素固定宽高比

    概要 最近项目中有遇到一种场景需要元素以固定宽高比且元素的宽度占父元素的固定百分比的情况,简而言之就是元素的宽度是随浏览器而变化,元素的高度是随元素的宽度变化的. 实现方式一:使用aspect-rat ...

  4. css 大图保持宽高比压缩,CSS实现自适应下保持宽高比

    在项目中,我们可能经常使得自己设计的网页能自适应.特别是网站中的图片,经常要求在网页放大(或缩小)时,宽高同时放大(或缩小),而且不变形(即保持正常的长宽比).为了不变形,常用的方法就是设置width ...

  5. CSS实现固定宽高比响应式布局(附实例分析)

    更多文章可关注我的个人博客:https://seven777777.github.io/myblog/ 在日常开发过程中,有一些前端业务场景可能需要让元素在尺寸变化的同时,保证宽高比不变,所以在此记录 ...

  6. 如何使用纯CSS实现固定宽高比div?

    在很多场景下,我们都需要一个固定长宽比的div作为容器.直接使用js动态设置固然可行,但在页面大小变化时就不得不通过触发onresize事件来动态设置,十分不便.此文旨在于探讨使用纯CSS实现固定长宽 ...

  7. css 大图保持宽高比压缩,css 保持宽高比缩放

    参考 需求简介: 在大的div中放九个小div, 小div需要保持4:3的宽高比, 小div中会有图片, 图片按照4:3拉伸 下图效果是div1:1 , 图片宽度100%, 高度自适应 思路 1, 使 ...

  8. CSS Transform让百分比宽高布局元素水平垂直居中

    CSS Transform让百分比宽高布局元素水平垂直居中 很早以前了解过当元素是固定宽度和高度的时候,水平垂直高居中的方法可以设置margin的负值来使其居中,这个负值是元素的宽和高的一半,比如宽高 ...

  9. css+svg实现的定宽高比

    最近看到一篇关于css实现固定宽高比的思路, 最近也接触了一下svg的viewBox的属性, 想到了这是很好的撑开物. 原来相同, 只是撑开的方式不同, 使用svg而不是padding svg的vie ...

最新文章

  1. 加快促进大数据与实体经济深度融合发展
  2. ASP.NET MVC 过滤器(三)
  3. JDBC、分层(分包)
  4. error while loading shared libraries: libopencv_core.so.3.4: cannot open 报错解决方法
  5. iPhone 的 Push(推送通知)功能原理浅析
  6. Ambari实现HTTPS登陆
  7. DLL程序组件Microsoft Reporting Services Barcode Custom Report Item
  8. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台...
  9. 较全的正则字符、规则汇总
  10. 【会议预告】第七届上海国际皮革展览会
  11. wps设置默认打开方式
  12. excel分类_Excel 的10个神奇功能,你会用几个?
  13. 异常点检测isolationforest
  14. 一步搞定IP地址查询:这个在线工具帮你快速掌握设备的位置信息!
  15. django项目 html报表和excel报表写入并通过邮件发送到outlook和QQ邮箱
  16. WZOI-297数的三次方根
  17. 网站备案靠谱吗_域名快速备案靠谱吗
  18. 什么牌子的蓝牙耳机适合玩游戏?2023延迟最低的蓝牙耳机排行
  19. java timertask 初始化_定时器实现方式之TimerTask、Timer
  20. Wireshark抓不到包的解决方法

热门文章

  1. 双鹤药业:增发渐近,看好未来 买入
  2. 《MySQL技术内 幕 InnoDB存储引擎》读书笔记
  3. Linux主机名变成bogon解决办法
  4. SSL/TLS协议的运行原理浅析—https通信过程及CA证书诠释
  5. 集群共享session;shiro实现session共享;springboot实现redis共享session;
  6. URLConnection(二)
  7. 微信推出微信小商店卖货小程序
  8. 校园-职场,学生-打工人,我们在一起1000天啦
  9. 等值连接mysql_MySQL的左连接、右连接、等值连接
  10. 基于预训练模型的金融事件分析及应用