内容简介:在阅读那么本篇笔记主要解决下面几个问题:w3c css2.2中对
在阅读 CSS2 visual formatting model details
时,里面出现了大量的关于 replaced element
和 non-replaced element
的概念。 visual formatting model details
中将element在 inline-level and block-level
和 replaced and non-replaced
两个不同的维度展开描述。因此,如果我们想要深入理解CSS的内部世界,那么理解 replaced element
的概念就是必不可少的了。
那么本篇笔记主要解决下面几个问题:
replaced element intrinsic dimensions replaced element replaced element
什么是 replaced element
w3c css2.2中对 replaced element
有一段简短的描述(来源于 3.conformance: Requirements and Recommendations
):
An element whose content is outside the scope of the CSS formatting model, such as an image, embedded document, or applet. For example, the content of the HTML IMG element is often replaced by the image that its “src” attribute designates. Replaced elements often have intrinsic dimensions: an intrinsic width, an intrinsic height, and an intrinsic ratio. For example, a bitmap image has an intrinsic width and an intrinsic height specified in absolute units (from which the intrinsic ratio can obviously be determined). On the other hand, other documents may not have any intrinsic dimensions (for example, a blank HTML document).
从这段基本的描述中,我们可以总结出什么:
-
replaced element
的content处于CSS formatting model控制之外。 -
常见的
replaced element
比如image
,embedded document
,applet
-
replaced element
通常包含intrinsic dimensions
: intrinsic width, intrinsic height, intrinsic ratio 。但是并不是所有的replaced element
都同时包含这三个属性值。 -
推论:
replaced element
之所以冠以replaced
的形容词,是因为这类element的内容会被指向的外部资源给replace掉。
上述的描述中引入一个新的名词 intrinsic dimensions
. 那么,我们来看一看什么事 intrinsic dimensions
.
什么是 intrinsic dimensions
从文字意义上来看, intrinsic dimensions
表示的是 内部尺寸
。
另外,w3c CSS2.2中同样对 intrinsic dimensions
给出了一段简短的描述:
The width and height as defined by the element itself, not imposed by the surroundings. CSS does not define how the intrinsic dimensions are found. In CSS 2 only replaced elements can come with intrinsic dimensions. For raster images without reliable resolution information, a size of 1 px unit per image source pixel must be assumed.
从上面的定义中我们可以总结出几点:
-
CSS2中只有
replaced element
有intrinsic dimensions
. -
replaced element
的width
和height
都由element
自己定义.
但是,我们光从上面的定义中很难真正的理解 intrinsic dimensions
.
因此我们再来看CSS3, CSS Image Values and Replaced Content Module Level 3 5.1小节
有更加精确的定义:
The term intrinsic dimensions refers to the set of the intrinsic height, intrinsic width, and intrinsic aspect ratio (the ratio between the width and height), each of which may or may not exist for a given object.
These intrinsic dimensions represent a preferred or natural size of the object itself; that is, they are not a function of the context in which the object is used. CSS does not define how the intrinsic dimensions are found in general.
Raster images are an example of an object with all three intrinsic dimensions. SVG images designed to scale might have only an intrinsic aspect ratio; SVG images can also be created with only an intrinsic width or height. CSS gradients, defined in this specification, are an example of an object with no intrinsic dimensions at all. Another example of this is embedded documents, such as the <iframe>
element in HTML. An object cannot have only two intrinsic dimensions, as any two automatically define the third.
If an object (such as an icon) has multiple sizes, then the largest size (by area) is taken as its intrinsic size. If it has multiple aspect ratios at that size, or has multiple aspect ratios and no size, then the aspect ratio closest to the aspect ratio of the default object size is used. Determine this by seeing which aspect ratio produces the largest area when fitting it within the default object size using a contain fit; if multiple sizes tie for the largest area, the wider size is chosen as its intrinsic size.
上面的definition主要包含4大块内容:
-
术语
intrinsic dimensions
通常指代intrinsic height
,intrinsic width
,intrinsic aspect ratio(width / height)
三种值的集合。但是对于不同replaced element
中的object
来讲,这三种value不一定都会存在。 -
intrinsic dimensions
表示的是引入object
的自己的natural size
,也就意味着这是和context
无关的。通常来讲,CSS并不会定义如何获得intrinsic dimensions
.
这里如果仔细的话,我们这里使用了 element
和 object
两个名词。使用两个不同的名词是有一定的目的的。首先我们在 html specific replaced element
中了解到 html
中的 replaced element
可以是 <audio>
, <img>
, <canvas>
, <embed>
, <iframe>
, <input>
, <object>
, <video>
这几种。另外我们在什么是 replaced element
小节中推论到, replaced element
之所以冠以 replaced
的形容词,是因为这类element的内容会被指向的外部资源给replace掉。所以这里就使用了 element
和 object
两个名词, object
表示引入的外部资源本身,资源本身会有自己固定的的 dimensions
。 Note
:但是,这并不意味着我们无法使用 CSS
来控制 html element
的外部展示,CSS控制 replaced element
的布局和 intrinsic dimension
两者并不冲突。具体细节可以看下面 concrete object size
的算法。
-
主要是几个例子。
raster image
这个object
同时拥有3个intrinsic dimensions value
。SVG iamges
可能只拥有一个intrinsic aspect ratio
或者intrinsic width
或者intrinsic height
.CSS gradient
3种intrinsic dimension value
都没有。 -
主要是一些边界情况,比如如果一个
object
有多个size
。那么该选择哪一个?规范中是largest size
将会作为该object
的intrinsic size
.如果有多个aspect ratio
值,那么最接近ratio of the default object size
的aspect ratio
将会被选择。如果default object size
使用contain fit
的话,产生最大area的aspect ratio
将会被选择。
但是,这些定义对于我们实际开发当中有什么用呢? 换个角度来讲,就是我们在实际开发中, replaced element
的布局与尺寸该如何来计算呢?
要给出上面的答案,我们可能还需要知道更多相关的名词:
specified sizeThe specified size of an object is given by CSS, such as through the ‘width’ and ‘height’ or ‘background-size’ properties. The specified size can be a definite width and height, a set of constraints, or a combination thereof. concrete object size The concrete object size is the result of combining an object's intrinsic dimensions and specified size with the default object size of the context it's used in, producing a rectangle with a definite width and height. default object size The default object size is a rectangle with a definite height and width used to determine the concrete object size when both the intrinsic dimensions and specified size are missing dimensions.
有上面的定义可以知道:
-
specified size
: specified size
由CSS指定,比如通过
width
、height
、background-size
属性。 specified size 可以是有限的width和height, constraints集合或者两者的结合。 - concrete object size : concrete object size 由 object's intrinsic dimensions , specified size 和 default object size 这三者决定,产生一个有 definite width and height 的矩形。
- default object size : default object size 是一个有 definite height and width 的矩形。
理解了上面三种 size
的定义,我们开始来看看在规范的 5.2 CSS Object Negotiation
中 Objects in CSS 的size
是如何被决定并且渲染的:
-
When an image or object is specified in a document, such as through a ‘url()’ value in a ‘background-image’ property or an src attribute on an
<img>
element, CSS queries the object for its intrinsic dimensions. -
Using the
intrinsic dimensions
, thespecified size
, and thedefault object size
for the context the image or object is used in, CSS then computes aconcrete object size
. (See the following section.) This defines the size and position of the region the object will render in. - CSS asks the object to render itself at the concrete object size. CSS does not define how objects render when the concrete object size is different from the object's intrinsic dimensions. The object may adjust itself to match the concrete object size in some way, or even render itself larger or smaller than the concrete object size to satisfy sizing constraints of its own.
- Unless otherwise specified by CSS, the object is then clipped to the concrete object size.
-
第一步,当
image or object
在document当中被指定(比如background-image
通过url()
或者<img>
element通过src
来指定),CSS会先去查找object
的intrinsic size
. -
第二步,浏览器根据
intrinsic dimensions
,specified size
, 和default object size
来计算出concrete object size
(具体计算方法看下面). -
第三步,CSS通知
object
根据concrete object size
来渲染自己。CSS并没有规定当concrete object size
和intinsic dimensions
不一样的时候该如何渲染。object
可能会自己调整自己来适应concrete object size
或者为了满足自己的sizing constraints来大于或小于concrete object size
。 -
第四步,除非CSS另有指定,不然
object
会被剪切为concrete object size
大小。
下面我们展开来讲解一下第二步- 如何确定 concrete object size
。在规范 5.3. Concrete Object Size Resolution
中介绍了 Default Sizing Algorithm
:
-
如果
specified size
是有限的width
和height
,那么concrete object size
的值就是specified size
. -
如果
specified size
只有width
或height
其中一个。那么concrete object size
的相同属性的值为specified size
提供。另外一个值由以下方式来计算:-
如果该object拥有
intrinsic aspect ratio
, 那么concrete object size
将使用intrinsic aspect ratio
来计算。 -
否则的话,我们再看缺少的dimension是否在
object
的intrinsic dimensions
中存在,如果存在,则取用该值。 -
否则的话,
concrete object size
缺少的dimension则取用default object size
.
-
如果该object拥有
-
如果
specified size
没有任何的constraints:-
如果object有
intrinsic height
或者intrinsic width
,那么该concrete object size
由intrinsic size
来决定。 -
否则的话,
concrete object size
则被当做是相对于default object size
的contain constraint
。
-
如果object有
另外,我们需要了解两个常见的 specified sizes
: contain constraint
和 cover constraint
.两者都是通过 constraint rectangle
和 object's intrinsic aspect ratio
来决定 concrete object size
的大小。
-
contain constraint
:concrete object size
将会被设置为一个根据object's intrinsic aspect ratio
计算出来的最大的rectangle,并且该rectangle的width或height都各自比constraint rectangle
的wdith
和height
小或相等。 -
cover constraint
:concrete object size
会被设置成一个根据object's intrinsic aspect ratio
计算出来的最小的rectangle,并且该rectangle的width或height都各自比constraint rectangle
的width
和height
大或相等。 -
在上面两种情况下,如果object没有
intrinsic aspect ratio
,那么concrete object size
就是specified constraint rectangle.
HTML中有哪些元素可以被称为 replaced element
从上面的内容,我可以知道 replaced element
的定义和计算细节。那么HTML中有哪些元素可以被称为 replaced element
呢?
这个我们得从 HTML standard 14.4 replaced element
中来看。
规范中主要将 replaced element
分为两大类:
-
Embedded content(嵌入内容):
-
首先,
<embed>
,<iframe>
,<video>
这三种元素被看作是replaced elements
. -
对于
<canvas>
元素来讲,如果<canvas>
中代表的是 embedded content ,那么该<canvas>
元素也被当作 replaced element (比如<canvas>
中的content是 bitmap )。否则的话,<canvas>
会被看作是普通的 rendering model 中的元素。 -
对于
<object>
元素来讲,和<canvas>
一样得分为两种情况。<object>
中展示的是 image, plugin, nested browsing context(比如iframe) 时被看做是 replaced element .其他情况下被认为是普通元素。 -
对于
<audio>
来讲,通常browser会对这类元素有对应的 user interface ,如果<audio>
的 user interface 被展示,那么<audio>
就会被认为是replaced element
.
-
首先,
-
Images: HTML 当中中 images 主要分为2种:
<img>
和<input type="image">
user agent 主要按照下面的规则来render上面两种元素:-
如果该元素展示的 image
: 那么 user agent
将认为该元素是
replaced element
,并且根据CSS来render。 -
如果该element不展示 image
,但是该element包含
intrinsic dimensions
(比如来自dimension attributes 或CSS rules)- 该element被认为是replaced element
:- user agent 认为image在将来会是肯用的并且会在适当的时候被render
-
或者 element没有
alt attribute
-
或者当前
document
处于quirks mode
.
-
如果
<img>
element表示的是一些文本并且user agent不希望其发生改变: 该元素被看做是non-replaced phrasing element
-
如果
<img>
element表示的是nonthing,并且user agent不希望其发生改变:该元素被看做是empty inline element
-
如果
input element
不展示image并且user agent不希望其发生改变:那么该element被看做是replaced element
(元素包含一个button,button的内容是element的可替换内容)。
-
如果该元素展示的 image
: 那么 user agent
将认为该元素是
Note:1. 对于 embed, iframe, img, object
元素或者 <input type="image">
元素的 align attribute
等于 center or middle
时,该element的 vertical-align
将会被设定为value(element的vertical middle和parent element baseline 对齐)。
以上所述就是小编给大家介绍的《深入前端之replaced element》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 前端进阶系列(第2期):深入理解JavaScript数据类型转换
- 【2019 前端进阶之路】深入 Vue 响应式原理,活捉一个 MVVM(超详细!)
- 从 IIFE 聊到 Babel,带你深入了解前端模块化发展体系
- 深入解析 Node.js 的 console.log[每日前端夜话0x73]
- 【1】JavaScript 基础深入——数据类型深入理解与总结
- 深入理解 Java 函数式编程,第 5 部分: 深入解析 Monad
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。