CSS 是怎样确定图像大小的?
本文转自奇舞周刊学习使用侵权删
先来看个例子,热热身。

上面这张图像的原始尺寸是:宽 54px 高 49px。
那么,在以下代码中,每张图像显示的最终尺寸是多少?
https://p1.ssl.qhimg.com/t01068da1826ad05875.png 是该图片的 url
图像由<img src="">指定,代码如下:
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png">
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" width="30" height="30">
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" width="30">
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" height="30">
显示的尺寸依次是...
宽 54px,高 49px
宽 30px,高 30px
宽 30px,高 30/(54/49)=27.22px
宽 30*(54/49)=33.06px,高 30px
图像由background-image指定,代码如下:
<style>
.img {
display: inline-block;
background-color: #eee;
background-image: url('https://p1.ssl.qhimg.com/t01068da1826ad05875.png');
background-repeat: no-repeat;
background-size: auto; /*auto 是默认值*/
}
</style>
<span class="img" style="width: 100px; height: 100px;"></span>
<span class="img" style="width: 30px; height: 30px;"></span>
<span class="img" style="width: 30px; height: 30px; background-size: 10px 10px;"></span>
<span class="img" style="width: 30px; height: 30px; background-size: contain;"></span>
<span class="img" style="width: 100px; height: 100px; background-size: cover;"></span>
显示的尺寸依次是...
宽 54px,高 49px
宽 54px,高 49px
宽 10px,高 10px
宽 30px,高 27.22px
宽 100px,高 100px
以上 9 道题,你都答对了吗?
确定图像大小的过程
为了方便讨论,我们先来认识四个术语:
固有尺寸:是固有宽度、固有高度和固有宽高比的集合。对于特定对象,这三个尺寸可能都存在,也可能都不存在。比如光栅图像同时拥有这三个,SVG 图像只有固有宽高比,CSS 渐变就没有任何固有尺寸。
指定大小:是通过width height background-size中的一个或多个指定的。
默认对象大小:是一个具有确定宽高的矩形。在既没有固有尺寸,也没有指定大小时生效。
具体对象大小:是对象最终显示的大小,即有明确宽度和高度值的矩形。
通常情况,计算图像大小的默认过程是:
优先使用指定大小,得到要显示的宽和高
如果只指定了一个宽度,或只指定了一个高度,那么
2.1 如果有固有宽高比,则用它和给出的那个,计算出来另一个
2.2 否则,就取固有尺寸里的
2.3 如果也没有固有尺寸,那就取默认对象大小的
如果没有指定大小
3.1 先用固有尺寸里的
3.2 如果没有固有尺寸,那就取默认对象大小的
初听起来有些绕,我们用刚才提到的例子具象下这个过程。
光栅图像是有三个固有尺寸的。以开头给出的 Logo 图像为例,它的固有尺寸分别是:
固有宽度 54px
固有高度 49px
固有宽高比 54/49
<img>
我们先来看用<img src="">指定的那四个:
demo1.
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png">
没有指定大小,那就用固有尺寸。所以,最终显示的尺寸是宽 54px,高 49px。
demo2.
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" width="30" height="30">
有指定的宽和高,所以,最终显示的尺寸是宽 30px,高 30px。
demo3.
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" width="30">
只有一个指定的宽,那就用固有宽高比计算出高来。所以,最终显示的尺寸是宽 30px,高 30/(54/49)=27.22px。
demo4.
<img src="https://p1.ssl.qhimg.com/t01068da1826ad05875.png" height="30">
只有一个指定的高,那就用固有宽高比计算出宽来。所以,最终显示的尺寸是宽 30*(54/49)=33.06px,高 30px。
以上四个示例的 UI 依次是:

background-image
接下来,看用background-image指定的五个。
在这个上下文里,背景区域的大小即图像的默认对象大小,background-size属性提供指定大小。
background-size有两个关键字contain和cover,它们分别对应包含约束和覆盖约束。
包含约束(contain constraint )遵循固有宽高比,宽高都小于等于背景区域,然后尽可能的大。
覆盖约束(cover constraint)遵循固有宽高比,宽高都大于等于背景区域,然后尽可能的小。
demo1.
<span class="img" style="width: 100px; height: 100px;"></span>
auto是background-size的默认值,意思是按图像的固有尺寸来,所以最终显示的尺寸是宽 54px,高 49px。
demo2.
<span class="img" style="width: 30px; height: 30px;"></span>
同上,auto按图像的固有尺寸来,所以最终显示的尺寸是宽 54px,高 49px。
demo3.
<span class="img" style="width: 30px; height: 30px; background-size: 10px 10px;"></span>
这里background-size: 10px 10px给出了具体的指定大小,所以最终显示显示的尺寸就是宽 10px,高 10px。
demo4.
<span class="img" style="width: 30px; height: 30px; background-size: contain;"></span>
根据contain的含义,包含约束要在背景框里尽可能的大。背景框宽 30px 高 30px,图像固有宽 54px 固有高 49px,所以包含约束取宽 30px,高根据固有宽高比算出来 30/(54/49)=27.22px,也就是指定大小是宽 30px 高 27.22px。对于背景区域未覆盖到的地方将会用背景色来填充。所以最终显示的尺寸是宽 30px 高 27.22px。
demo5.
<span class="img" style="width: 100px; height: 100px; background-size: cover;"></span>
根据cover的含义,覆盖约束要在大于等于背景框的前提下尽可能的小。背景框宽 100px 高 100px,图像固有宽 54px 固有高 49px,所以覆盖约束取高 100px,宽根据固有宽高比算出来 100*(54/49)=110.20px,也就是指定大小是宽 110.20px 高 100px。 对于超出背景区域的部分,会被裁切掉,所以最终显示的尺寸是宽 100px 高 100px。
以上五个示例的 UI 依次是:

总结
理解四个尺寸
固有尺寸:固有宽度、固有高度、固有宽高比
指定大小:width height background-size
默认对象大小:依据不同的上下文而定
具体对象大小:它就是最终要显示的大小
计算图像大小的过程,即算图像最终要显示的大小,也就是算它最终的“具体对象大小”
根据固有尺寸 + 指定大小 + 默认对象大小,计算具体对象大小
使用的优先级:指定大小 > 固有尺寸 > 默认对象大小
两种比较常见的指定大小约束:包含约束、覆盖约束
当计算出的“具体对象大小”和图像的“固有尺寸”不一致时,图像就要调整自身,以匹配“具体对象大小”
图像超出背景区域的部分,会被裁剪掉;覆盖不全的部分,会用背景色来填充
当是<img>时,也有个相应的属性可以调整图像大小,即 object-fit
调整图像大小的属性background-size
CSS 是怎样确定图像大小的?的更多相关文章
- CSS 图像大小
CSS 图像大小 虽然在HTML中,img标签有属性height.width设置高和宽,在工作中却使用得非常少,通常使用CSS来控制大小. 给盒子设置属性height.width限制大小.单位通常是像 ...
- CSS的模板资源+编辑图像大小
模板资源 源码之家搜登录页面,链接:https://www.mycodes.net/190/10144.htm (或者搜门户网站 模板之家,里面页面更强大!) 编辑图像大小 然 ...
- 如何在 HTML 中调整图像大小?
了解在 HTML 中调整图像大小的不同技术.何时应避免在浏览器端调整大小,以及在 Web 上操作和提供图像的正确方法. 如果您的图像不适合布局,您可以在 HTML 中调整其大小.在 HTML 中调整图 ...
- C#中如何调整图像大小
在本篇文章中,我将介绍如何在C#中来调整你想要的图像大小.要实现这一目标,我们可以采取以下几个步骤: 1.首先要获取你想要调整大小的图像: string path = Server.MapPath(& ...
- [译]Android调整图像大小的一些方法
翻译自 某大神在Stack Overflow里的自问自答 (一般我们将Bitmap翻译为位图,但为了更好理解,在本文中我将它翻译成图像): 我们在开发的时候,经常需要从服务器中加载图像到客户端中,但有 ...
- Matlab绘图基础——图形绘制的插值 以及 图像大小的重采样
使用说明:图形绘制时的插值 interp1 %1-D data interpolation interpft %使用fft算法插值 %将原数据x转换到频率域,再逆转换回来更密集的数据采样 ...
- IE对CSS样式的数量和大小的限制
项目中遇到的问题,css写的样式无法渲染,各种百度后发现大概是这个原因: IE对CSS样式的数量和大小的限制 文档中只有前31个link或style标记关联的CSS能够应用. 从第32个开始,其标记关 ...
- AForge,Emgu.CV抓拍图像大小
原文:AForge,Emgu.CV抓拍图像大小 2017年,忙忙碌碌地过去了,象往年一样,依然没有时间上CSDN,博客园. 这一年是打工以来最辛苦的一年. 这一年用了不少自己没有接触过的东西.如人脸识 ...
- COS数据处理WebP压缩 | 减少70%图像大小
当前网络中,图片仍是占用流量较大的一部分,在网站的视觉效果和加载速度之间,我们始终面临着两难选择. 一个网站的内容,不仅仅只有文字,图片.动图.视频等众多元素都在帮助用户从我们的网站获取更多的信息,当 ...
随机推荐
- Centos 7 安装openjdk8
一.使用yum命令搜索支持jdk版本 yum search java|grep jdk 二.使用yum安装jdk8 yum install -y java--openjdk 三.检查是否成功 java ...
- 2019牛客暑期多校训练营(第七场)E F H I
E Find the median 题意:每次往序列中增加连续的[l,r]的数,每加入一次就询问当前序列的中位数. 解法:此题没有要求在线,那么直接离线+线段树+二分就可以了.求出每个端点之后排序得到 ...
- 函数传递是如何让HTTP服务器工作的
var http = require("http"); http.createServer(function(request, response) { response.write ...
- 23.倒计时器CountDownLatch
门闩是concurrent包中定义的一个类型,是用于多线程通讯的一个辅助类型. 门闩相当于在一个门上加多个锁,当线程调用await方法时,会检查门闩数量,如果门闩数量大于0,线程会阻塞等待. 当线程调 ...
- string.format()详解
java中: 从 Java 5.0 开始,String 类新增了一个强大的字符串格式化方法 format().这个方法到现在用的人还是不多,实在是一种浪费.本文带你快速过一遍这个方法的功能,将来你要用 ...
- Linux进程管理之ps的使用
主题Linux进程管理之ps工具的使用 一ps工具的介绍 ps: process state 进程状态ps - report a snapshot of the current processesL ...
- POJ 2528(线段树+离散化+特殊离散化)网上博客很少有人真正写对!!! 是POJ数据太水...
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- iconfont字体图标的使用方法
转载于https://www.cnblogs.com/hjvsdr/p/6639649.html 我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了 ...
- [CSP-S模拟测试51]题解
错失人生中第一次AK的机会…… A.attack 支配树板子题.考场上发明成功√ 首先支配树上两点路径之间的点都是必经之点,根据这个性质我们就可以yy出建树的方法.跑拓扑,在每个点(设为$x$)即将入 ...
- [NOIP模拟测试30]题解
A.Return 出题人大概是怕自己的中文十级没人知道,所以写了这么一个***题面.可能又觉得这题太水怕全场A掉后自己面子过不去,于是又故意把输出格式说的含糊不清.(鬼知道"那么输出-1&q ...