如題,當圖片尺寸小於容器時,直接按圖片原尺寸顯示就行了,可是當圖片尺寸大於容器時,就要設法縮放圖片以徹底裝入容器,圖片要儘量的匹配容器尺寸,並保持寬高比例(圖片不能拉伸或擠壓變形)。css
background-size: contain
background-size
是 CSS3 中的樣式屬性,屬性值 contain
表示圖像在保持原有比例的同時縮放到容器的可用空間的尺寸,以使其寬度和高度徹底適應容器尺寸,完整顯示出來。html
.box {
width: 420px;
height: 300px;
background: url(https://cdn.pixabay.com/photo/2019/07/27/09/05/red-panda-4366264__340.jpg) no-repeat;
background-size: contain; /* 關鍵 */
border: 1px solid #ccc;
}
複製代碼
<div class="box"></div>
複製代碼
object-fit: contain
若是 DOM 結構由於某種限制,不能使用背景圖片,而只能使用 <img>
插入圖片,這種場景能夠使用 object-fit: contain
CSS 聲明,這裏的屬性值 contain
和 background-size
的 contain
效果相似。事實上 object-fit
屬性可做用在可替換元素上,如 video、iframe 等,不限於圖片。canvas
注意:IE 不支持這個屬性ide
.box > img {
width: 100%;
object-fit: contain;
}
複製代碼
<div class="box">
<img src="https://cdn.pixabay.com/photo/2019/07/27/09/05/red-panda-4366264__340.jpg">
</div>
複製代碼
當沒法使用上面兩種自動化縮放的解決方案時,咱們得經過 JavaScript 來手動計算圖片的實際渲染尺寸。(例如 canvas 繪圖這種場景)ui
const temp = {
dWidth: 0
dHeight: 0
};
if (boxWidth >= imgWidth && boxHeight >= imgHeight) { // 照片小於等於容器尺寸
temp.dWidth = imgWidth;
temp.dHeight = imgHeight;
} else {
if (imgWidth >= imgHeight) { // 寬度優先
temp.dWidth = boxWidth;
temp.dHeight = imgHeight * boxWidth / imgWidth;
} else { // 高度優先
temp.dHeight = boxHeight;
temp.dWidth = imgWidth * boxHeight / imgHeight;
}
// 縮放後依然大於容器
if (temp.dWidth > boxWidth) {
temp.dHeight = temp.dHeight * boxWidth / temp.dWidth;
temp.dWidth = boxWidth;
} else if (temp.dHeight > boxHeight) {
temp.dWidth = temp.dWidth * boxHeight / temp.dHeight;
temp.dHeight = boxHeight;
}
}
console.log(temp);
複製代碼
完整演示 Demo:codepen.io/wingmeng/pe…url