保持宽高比

文章目录

在开发中,多少都会碰到一个需求,保持一个合适的宽高比,比如展示一些图片或者视频的时候,会需要保持合适的宽高比,比如 4:3 16:9 等等,本文介绍两种方式

padding

实现

  1. 利用 padding 实现这个需求的话,优点兼容性好,但是会复杂一点

  2. 我们直接看代码,如下:

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
        }
    
        .container {
          width: 100vw;
          height: 100vh;
          padding-top: 100px;
          overflow: hidden;
        }
    
        .box {
          margin: auto;
          width: 50%;
          height: 0;
          padding-bottom: 26%;
          background-color: skyblue;
        }
      </style>
    </head>
    
    <body>
      <div class="container">
        <div class="box"></div>
      </div>
    </body>
    
    </html>
  3. 直接看效果,如图:

  4. 那这个效果为什么可以实现呢,关键就在于这个 padding-bottom,要知道这个,我们首先就需要知道一点,padding 是怎么计算自己的值的,如图:

  5. 也就是说如果包含box的元素的宽度为 100px,那么 padding-bottom: 50% 的值就为 50px,我们看一下这里的 box 的数值,,如图:

  6. 在看上一下包含 box 元素的 container 元素的数值,如图:

  7. 使用这个 703 * 26% 是不是就和这个 182.77 的值相差无几啊,所以这个经过验证也是没有错的

  8. 当然一般情况下这个 box 和 container 的宽度应该是一致的,这里我是为了进行测试而书写的

填充

  1. 上述虽然实现了效果,但是存在一个问题,高度为 0,是不是无法承载其他元素了,实际上是可以存放元素的,但是会在某些情况下,css样式会起不到预期的效果,所以通常,我们会进行如下的操作,代码结果更改为如下:

    html 复制代码
    <div class="container">
        <div class="box-outer">
          <div class="box-inner">
            <div class="box-img">
              <img src="./1.jpg" />
            </div>
          </div>
    	</div>
    </div>
  2. 就是利用定位实现,css样式如下:

    css 复制代码
    .box-outer {
    	margin: auto;
    	width: 50%;
    }
    
    .box-inner {
    	width: 100%;
    	height: 0;
    	padding-bottom: 50%;
        background-color: skyblue;
        position: relative;
    }
    
    .box-img {
        position: absolute;
        inset: 0;
    	width: 120px;
    	height: 120px;
    	overflow: hidden;
    }
    
    .box-img img {
    	width: 100%;
    	height: 100%;
    	object-fit: cover;
    }
  3. 效果如图:

aspect-ratio

  1. 这是一个比较新的属性,可以非常方便的设置宽高比,使用的方式也非常简单 宽/高,如图:

  2. 使用如下:

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
        }
    
        .container {
          width: 100vw;
          height: 100vh;
          padding-top: 100px;
          overflow: hidden;
        }
    
    
        .box-img {
          margin: auto;
          width: 50%;
          /* 设置比例为 16:9 */
          aspect-ratio: 16 / 9;
          overflow: hidden;
        }
    
        .box-img img {
          width: 100%;
          height: 100%;
          object-fit: cover;
        }
      </style>
    </head>
    
    <body>
      <div class="container">
        <div class="box-img">
          <img src="./1.jpg" />
        </div>
      </div>
    </body>
    
    </html>
  3. 效果如图:

  4. 一样可以实现这样的效果,只不过兼容性有待提高,如图:

相关推荐
小羊没烦恼!17 分钟前
T-SQL查询高级—SQL Server索引中的碎片和填充因子
开发语言·前端·javascript·数据库·后端·python·web安全
定栓1 小时前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
小熊在忙fpga1 小时前
N32G430芯片的flash表示
前端·javascript·html
Data analyse4561 小时前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
todoitbo1 小时前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
会灭火的程序员1 小时前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB1 小时前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
Chloe.Zz1 小时前
一篇入门Agent
开发语言·前端·javascript
java1234_小锋1 小时前
【技术专题】HTML5 网页技术 - HTML5 表格标签
前端·html·html5
雪芽蓝域zzs2 小时前
JS 项目转 TS 项目(Vue3 + 若依这类后台项目)完整改造清单
前端·vue.js