CSS3 object-fit 和 object-postion 实现图片居中缩放

object-fit

最近在复习VUE,准备面试,在看了 “VUE实例” 的时候发现了这个属性,搜索了一下发现效果挺好。

不用 object-fit 实现 cover 效果

以前的时候,做用户头像或者新闻栏的时候,用到的图片基本默认都是使用 fill 填充到整个容器中的。如果图片比例和容器比例差太多,就会产生形变。以前的做法是外面嵌套一个 div 并 设置 overflow : hidden,然后内部容器使用 JS 进行判断,对于小的边设置 100%,另一个设置 auto。这样才能达到充满又不变形的效果。而现在只需要使用 object-fit : cover 这一条配置就可以实现上面繁杂的判断内容了。

示例代码如下

<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<style>
div {
	width: 30rem;
	height: 30rem;
	border: 1px solid red;
	margin: 2rem;
	/** 隐藏超出的内容 */
	overflow: hidden;
	/** 用来居中 **/
	display:flex;
	justify-content:center;
	align-items:center;
}
.cover-width {
	width: 100%;
	height: auto;
}
.cover-height {
	width: auto;
	height: 100%;
}
</style>
<script>
window.()=>{
	const imgs = document.getElementsByTagName("img");
	for(const img of imgs) {
		img.classList.add("cover-" + (img.naturalWidth < img.naturalHeight ? "width" : "height"));
	}
}
</script>
</head>
<body>
	<div>
		<img src="seiya1.jfif"/>
	</div>
	<div>
		<img src="seiya2.jfif"/>
	</div>
</body>
</html>

CSS3 object-fit 和 object-postion 实现图片居中缩放

内容区域(内容盒子)

下图是浏览器调试工具里显示的盒模型。content-box 即内容盒子,指的是虚线框内部的区域。img 元素的 src 所填充的区域不会超过这个内容区域。
CSS3 object-fit 和 object-postion 实现图片居中缩放

可选的值范围

描述
fill 默认值。拉伸并填满整个内容区域
contain 保持原有尺寸比例,进行缩放,保证替换内容尺寸一定可以在容器里面放得下。因此,此参数可能会在容器内留下空白。
cover 保持原有尺寸比例,进行缩放,保证替换内容尺寸一定大于容器尺寸,宽度和高度至少有一个和容器一致。因此,此参数可能会让内容的部分区域不可见
none 不进行任何处理,保持内容原始尺寸
scale-down 使用 none 或 contain 中最终呈现的尺寸更小的那个

代码示例(VUE)

<!DOCTYPE html>
<html>
<html>
<head>
<meta charset="utf8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
#app {
	display: flex;
	justify-content: space-around;
	align-content: space-around;
	flex-wrap: wrap;
}
h1 {
	font-size: 5rem;
	text-align: center;
}
img {
	border: 2px solid red;
	width: 40rem;
	height: 40rem;
}
img:nth-child(2n+1) {
	border-color: blue;
}
</style>
</head>
<body>
<div id="app">
	<div v-for="value in objectFits">
		<!-- 当 value 是 0,false,"",NaN,null,undefined 的时候都会被判定为 false -->
		<h1>{{ value || "原图" }}</h1>
		<img src="seiya1.jfif" :style="{objectFit: value}"/>
		<img src="seiya2.jfif" :style="{objectFit: value}"/>
	</div>
</div>
<script>
new Vue({
	el: "#app",
	data: {
		objectFits : ['','fill','contain','cover','none','scale-down'],
		color: 'red'
	}
});
</script>
</body>
</html>
</html>

CSS3 object-fit 和 object-postion 实现图片居中缩放

object-position

object-position 和 background-position 可选的值是一样的。用来定义图片相对当前元素的位置。可选值如下:

可选的值范围

描述
top left
top center
top right
center left
center center
center right
bottom left
bottom center
bottom right
如果仅规定了一个关键词,那么第二个值将是 center
x% y% 第一个值是水平位置,第二个值是垂直位置
左上角是 0% 0%,右下角是100% 100%
如果仅规定了一个值,另一个值将是 50%
xpos ypos 第一个值是水平位置,第二个值是垂直位置
左上角是 0 0。单位是像素(0px 0px)或任何其它 CSS 单位。
如果仅规定了一个值,另一个将是50%
可以混合使用 % 和 position 值