像uniapp image标签一样对图片进行缩放和裁剪
- 0 前言提示
- 1 实现
- 1.1 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
- 1.2 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。
- 1.3 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。
- 1.4 宽度不变,高度自动变化,保持原图宽高比不变
- 1.5 高度不变,宽度自动变化,保持原图宽高比不变
- 1.6 不缩放图片,只显示图片的不同区域
- 2 完整代码
0 前言提示
在使用uniapp开发时觉着image标签的mode属性非常的使用,符合多种开发场景,并且最近有在整理object-fit
和object-position
的笔记,正好利用css属性按照image标签对于图片的缩放和裁剪处理,总结一套自己的经验。
模式 | 值 | 说明 |
---|---|---|
缩放 | scaleToFill | 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 |
缩放 | aspectFit | 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。 |
缩放 | aspectFill | 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。 |
缩放 | widthFix | 宽度不变,高度自动变化,保持原图宽高比不变 |
缩放 | heightFix | 高度不变,宽度自动变化,保持原图宽高比不变 |
裁剪 | top | 不缩放图片,只显示图片的顶部区域 |
裁剪 | bottom | 不缩放图片,只显示图片的底部区域 |
裁剪 | center | 不缩放图片,只显示图片的中间区域 |
裁剪 | left | 不缩放图片,只显示图片的左边区域 |
裁剪 | right | 不缩放图片,只显示图片的右边区域 |
裁剪 | top left | 不缩放图片,只显示图片的左上边区域 |
裁剪 | top right | 不缩放图片,只显示图片的右上边区域 |
裁剪 | bottom left | 不缩放图片,只显示图片的左下边区域 |
裁剪 | bottom right | 不缩放图片,只显示图片的右下边区域 |
1 实现
整体效果图
以下css全是设置给img标签的
1.1 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
width: 200px;
height: 200px;
/* 核心 */
object-fit: fill;
1.2 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。
width: 200px;
height: 200px;
/* 核心 */
object-fit: contain;
1.3 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。
width: 200px;
height: 200px;
/* 核心 */
object-fit: cover;
1.4 宽度不变,高度自动变化,保持原图宽高比不变
width: 200px;
height: auto;
1.5 高度不变,宽度自动变化,保持原图宽高比不变
width: auto;
height: 200px;
1.6 不缩放图片,只显示图片的不同区域
width: 200px;
height: 200px;
object-fit: none;
/* 核心 */
object-position: X轴位置 Y轴位置;
比如只显示图片的顶部区域object-position: center bottom;
比如只显示图片的左上边区域object-position: left top;
比如只显示图片的右下边区域object-position: right bottom;
2 完整代码
<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.box {width: 900px;height: auto;display: grid;grid: auto-flow minmax(300px, max-content) / repeat(3, 300px);column-gap: 5px;row-gap: 20px;margin: 0 auto;}.box>div {display: grid;place-items: center;place-content: center;background: #000;}.box>div>span {color: #fff;min-height: 30px;text-align: center;margin-top: 10px;}.box>div>img {background: #aaa;}.basic {width: 200px;height: 200px;}.fixed-width {width: 200px;height: auto;}.fixed-height {height: 200px;width: auto;}</style>
</head><body><div class="box"><div><span>不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素</span><img class="basic" src="./image/big.jpg" alt="" srcset="" style="object-fit: fill" /></div><div><span>保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来</span><img class="basic" src="./image/big.jpg" alt="" srcset="" style="object-fit: contain" /></div><div><span>保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取</span><img class="basic" src="./image/big.jpg" alt="" srcset="" style="object-fit: cover" /></div><div><span>宽度不变,高度自动变化,保持原图宽高比不变</span><img class="fixed-width" src="./image/tall.jpg" alt="" srcset="" /></div><div style="grid-column: 2 / span 2;"><span>高度不变,宽度自动变化,保持原图宽高比不变</span><img class="fixed-height" src="./image/big.jpg" alt="" srcset="" /></div><div><span>不缩放图片,只显示图片的顶部区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: center top;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的底部区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: center bottom;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的中间区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: center center;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的左边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: left center ;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的右边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: right center;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的左上边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: left top;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的右上边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: right top;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的左下边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: left bottom;object-fit: none;" /></div><div><span>不缩放图片,只显示图片的右下边区域</span><img class="basic" src="./image/tall.jpg" alt="" srcset=""style="object-position: right bottom;object-fit: none;" /></div></div>
</body></html>