图片自适应容器的几种方法

一、图片容器固定宽和高(主要适用于PC端)

1、使用max-width: 100%、max-height: 100%

html:

  <!-- 图片容器固定宽高 max-width/max-height-->
  <p>图片容器固定宽高 max-width/max-height</p>
  <div class="fixed-size-container">
    <img src="https://img12.360buyimg.com/img/jfs/t18304/318/2619441393/498742/cebbd504/5b0384fcNb1e9bbe3.png" />
  </div>

css:

.fixed-size-container {
  width: 300px;
  height: 150px;
  border: 1px solid #ddd;
}

.fixed-size-container img{
  margin: 0 auto;
  display: block;
  max-width: 100%;
  max-height: 100%;
}

2、使用background-image设置背景图片

html:

  <!-- 图片容器固定宽高 背景图片-->
  <p>图片容器固定宽高 背景图片</p>
  <div class="fixed-size-container-bg">
  </div>

css:

.fixed-size-container-bg {
  margin-top: 20px;
  width: 300px;
  height: 150px;
  border: 1px solid #ddd;
  background-image: url('https://img12.360buyimg.com/img/jfs/t18304/318/2619441393/498742/cebbd504/5b0384fcNb1e9bbe3.png');
  background-position: center;
  background-repeat: no-repeat;
  background-size: contain;
}

3、使用css3的属性:object-fit

html:

  <!-- 图片容器固定宽高 object-fit:contain -->
  <p>图片容器固定宽高 object-fit:contain</p>
  <div class="fixed-size-container-object-fit">
    <img src="https://img12.360buyimg.com/img/jfs/t18304/318/2619441393/498742/cebbd504/5b0384fcNb1e9bbe3.png" />
  </div>

css:

.fixed-size-container-object-fit {
  margin-top: 20px;
  width: 300px;
  height: 150px;
  border: 1px solid #ddd;
}

.fixed-size-container-object-fit img{
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

4、使用js计算图片比例,最大限度让图片占满容器

html:

  <!-- 图片容器固定宽高 使用js计算图片比例,最大限度自适应容器 -->
  <p>图片容器固定宽高 使用js计算图片比例,最大限度自适应容器</p>
  <div class="fixed-size-container-js-compute">
    <img src="https://img12.360buyimg.com/img/jfs/t18304/318/2619441393/498742/cebbd504/5b0384fcNb1e9bbe3.png" id="jsComputedImg"/>
  </div>

css:

.fixed-size-container-js-compute {
  margin-top: 20px;
  position: relative;
  width: 300px;
  height: 300px;
  overflow: hidden;
}

js:



/**
 * 获取自定义图片缩放样式
 * @param {*} containerWidth 容器宽度
 * @param {*} containerHeight 容器高度
 * @param {*} imgWidth 图片原始宽度
 * @param {*} imgHeight 图片原始高度
 * @returns
 */
function getAdaptImgScaleStyle(
  containerWidth,
  containerHeight,
  imgWidth,
  imgHeight
) {
  let scale;
  if (imgWidth < imgHeight) {
    scale = containerHeight / imgHeight;
  } else {
    scale = containerWidth / imgWidth;
  }
  return `
    position: absolute;
    width: unset;
    height: unset;
    left: 50%;
    top: 50%;
    transform: translate3d(-50%, -50%, 0) scale(${scale});
    transform-origin: center;
    max-width: unset!important;
  `;
}

document.getElementById('jsComputedImg').addEventListener('load', (e) => {
  const {width, height} = e.target;
  e.target.style = getAdaptImgScaleStyle(250, 150, width, height)
})

二、图片容器没有固定宽和高(场景使用主要是移动端)

1、使用paddding/margin的百分比值

  • 直接对图片容器设置padding/margin的百分比值(缺点:无法设置max-height值)
  • 对图片容器的伪元素(:before或者:after)设置padding/margin的百分比值(优点:兼容性比较好,也能设置max-height值)
    html:
  <!-- 容器没有固定宽高 图片占满容器 img: 宽*高:107*60-->
   <div class="padding-container1">
    <img src="http://m.360buyimg.com/img/s120x60_jfs/t1/198179/18/9397/244165/614b1966Eedc1cdb1/11129d04484cffff.jpg" />
  </div>

  <!-- 容器没有固定宽高 图片占满容器 img: 宽*高:720*1280-->
  <div class="padding-container2">
    <img src="http://m.360buyimg.com/img/jfs/t1/122296/30/16264/542718/6146e92aE52b6f41b/b450a73167a26ecb.jpg" />
  </div>

css:

/** 直接对图片容器设置padding的百分比值,容器占满屏幕**/
.padding-container1 {
  position: relative;
  padding-top: xx%;   /** xx% = 图片的原始高宽比 **/
  background-color: red;
}
.padding-container1 img {
  position: absolute;
  top: 0;
  width: 100%;
}

/** 直接对图片容器设置margin的百分比值,容器占满屏幕**/
.padding-container1 {
  position: relative;
  margin-top: xx%;   /** xx% = 图片的原始高宽比 **/
  background-color: red;
}
.padding-container1 img {
  position: absolute;
  top: 0;
  width: 100%;
}

/** 对图片容器的伪元素(:before或者:after)设置padding的百分比值, 容器只占屏幕的一半 **/
.padding-container2 {
  position: relative;
  background-color: red;
}
.padding-container2:before {
  content: '';
  padding: 0 50% 88.88% 0; /** 图片原始高/宽的比例** 设置宽度50%,88.88% =  50% * 1280 / 720 (720*1280是图片的原始宽高)
  display: block;
}
.padding-container2 img {
  position: absolute;
  top: 0;
  width: 100%;
}

/** 对图片容器的伪元素(:before或者:after)设置margin的百分比值, 容器只占屏幕的一半 **/
.padding-container2 {
  position: relative;
  overflow: hidden; /** 去掉margin折叠 **
  background-color: red;
}
.padding-container2:before {
  content: '';
  margin: 0 50% 88.88% 0; /** 图片原始高/宽的比例** 设置宽度50%,88.88% =  50% * 1280 / 720 (720*1280是图片的原始宽高)
  display: block;
}
.padding-container2 img {
  position: absolute;
  top: 0;
  width: 100%;
}

2、https://juejin.cn/post/6882574726099632136

3、实现等宽高比的容器

html:

  <div class="padding-container">
  </div>

css:

.padding-container {
  width: 50%;
  padding-top: 50%; 
  background-color: red;
}
posted @ 2021-09-23 20:53  sminocence  阅读(945)  评论(0编辑  收藏  举报