찾다
웹 프론트엔드HTML 튜토리얼CSS2.1SPEC:视觉格式化模型之width属性详解(下)_html/css_WEB-ITnose

本文承接CSS2.1SPEC: 视觉格式化模型之width属性详解(上),继续分析CSS视觉格式化模型中width以及相关值的计算问题:


注:与上节不同,本节的demo中由于出现了float,absolute等定位方式,因此为了便于效果显示,所有的demo都把body的margin属性设为10px,并且增加了一个class为container的div元素,它具有10px的padding,3px的border,500px的width,并通过设置float:left,_zoom:1来形成一个BFC从而清除浮动。


2.2.5 非置换的浮动元素

我们知道,元素在设置了float属性之后,就具有了“收缩性”,此时在计算width值的时候也有一个特殊的算法,首先看CSS标准中的计算规则:


首先,margin-left、margin-right的auto值将被设为0。

然后,元素的宽度则根据"shrink-to-fit"方法来计算,我们看一下"shrink-to-fit"算法的计算过程:

[1]计算preferred-width:在 除非包含的内容有明确的换行符(比如有
标签时),否则就不换行的情况下,容纳其包含的内容所需要的宽度。

[2]计算preferred-min-width:在 能换行时(英文碰到空格或标点符号,出现了块级元素,当然也包含出现了
标签时)就换行的情况下,容纳所包含的内容需要的宽度。

[3]计算available-width:即利用2.2.3节中的公式:

available-width =width of containing block -  'margin-left' - 'border-left-width' - 'padding-left' - 'padding-right' - 'border-right-width' - 'margin-right,这里也包括所有滚动出去的宽度。

最终的width则为:min(preferred-width, max(preferred-min-width, available-width))。最终的公式可以总结为:最终的宽度以available-width为基准,同时保证不能大于preferred-width以及不能小于preferred-min-width


available-width应该还比较容易理解,但是preferred-width和preferred-min-width相对不好理解一下,我们通过DEMO来分析一下:

##DEMO 1 shrink-to-fit算法示例一

 

我们有如下代码:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>float</strong>: <strong>left</strong>;<strong>border</strong>: 1<strong>px solid </strong><strong>#f00</strong>;<strong>"</strong>><br />        dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd<br /></<strong>div</strong>><br /></<strong>div</strong>>
我们知道,英文在不出现空格或者标点符号的情况下是不允许换行的,而且这里的这个“单词”长度肯定超出了500px的长度,我们看一下效果:


分别标记一下各个宽度:


注:这个demo在IE6中的显示效果会有些不同,因为IE6下及时定义了框的width属性,但是还是有可能会被内容撑开,这个问题本文后面会进行介绍

由于英文单词不允许换行,所以在这里,preferred-min-width和preferred-width都是相同的,也就是说,这个"单词"有多长,那么这两个宽度值也是多少,在这里是756px(还有左右各1px的边框),而available-width很明显就是包含块的宽度了,这里是500px,带入shrink-to-fit的公式中计算即可得到最终的width值为756px。


##DEMO 2 shrink-to-fit算法示例二

我们对DEMO1中的代码进行下改动,也就是把DEMO1中的"单词"加几个空格:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>float</strong>: <strong>left</strong>;<strong>border</strong>: 1<strong>px solid </strong><strong>#f00</strong>;<strong>"</strong>><br />        ddddddddddddddddddd dddddddddddd ddddddddddd dddddddddddddddddddddddddddddddddddddddddddddd<br /></<strong>div</strong>><br /></<strong>div</strong>>
这样一来,就变成了一句英文句子了,并且在空白处时候允许换行,我们看最终的显示效果:


标记一下各个宽度:


 

把这个几个值带入公式计算,也不难得出最终的宽度值就是available-width,即500px

 


2.2.6 浮动置换元素

首先, margin-left、margin-right的auto值将被设为0。

而width属性的计算则与行内置换元素的计算方法相同,可参照2.2.2节中的介绍。


2.2.7 绝对定位的非置换元素

为了方便显示,我们为container设置了100px的height值,另外需要明确的是,对于绝对定位的元素来说,如果它的包含块是一个块容器框产生,那么包含块的宽度是这个框的padding edge所形成;如果是一个行内元素,那么由包围其行框的区域形成;另外还有可能是初始包含块,具体可参照《CSS2.1SPEC:视觉格式化模型之包含块》的3.3节。

在本节和下一节中,需要首先明确一个概念"static position":

the term "static position" (of an   element) refers, roughly, to the position an element would have had in the normal 

flow. 

也就是,"static position"是指正常流中的第一个元素应该所处的位置(该元素的position属性为"static",并且没有float),这个元素其实是一个假想的元素。

此外,"left"值指的是包含块的左边缘到绝对定位元素所产生的框的左外边距边缘(left margin edge)的距离。"right"指的是包含块的右边缘到绝对定位元素所产生的框的右外边距的边缘(right margin edge)的距离。

我们用下面的demo演示一下包含块的direction为默认的ltr情况下的"static position":

##DEMO 3 "static position"说明

代码如下:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>width</strong>: 100<strong>px</strong>;<strong>height</strong>: 100<strong>px</strong>;<strong>background</strong>: <strong>#34538b</strong>;<strong>"</strong>><br />        static posotion演示<br /></<strong>div</strong>><br /></<strong>div</strong>>

我们的container有10px的padding,对于正常流中的块级元素来说,在水平方向上,默认就是紧贴包含块的content area左侧的,而这个位置和content area的padding edge的距离就是padding-left。

标准中还指出,用户代理不一定必须去计算这个假想的box的尺寸。


另外, 这一节的内容都必须基于以下等式:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block


=》 IF :       left,right和width的值 都是auto,那么首先将margin-left、margin-right的auto设为0,如果包含块的direction属性为ltr,则把left值设为"static position"的位置,并按照下面的 规则3计算width和right的值;如果包含块的direction属性为rtl,则把right值设为"static position"的位置,并按照下面的

规则1

计算left和width的值。 [1]

=》ELSE IF:left,right和width的值都不是auto,如果margin-left和margin-right都是auto,则它们将会拥有相同的值并且必须使得等式成立,从而实现居中效果。但如果这样得出的margin值为负值,那么在包含块的direction属性为ltr的情况下需要将margin-left置为0,并且按照等式计算margin-right的值;反之则将margin-right的值置为0,然后按照等式计算margin-left的值。 [2]

=》ELSE IF:margin-left或者margin-right只有一个为auto,那么就按照等式计算auto值。[3]

=》ELSE IF:所有的值都不为auto(过约束),那么在包含块的direction属性为ltr的情况下,忽略right值,并按照等式重新计算right;反之则忽略left的值,并按照等式重新计算。[4]

=》ELSE IF:上面的几种情况如果都不符合,那么就先把margin的所有auto值置为0,然后按照下面的规则进行计算。[5]

规则:

 

[1]:如果left和width是auto,那么先按照"shrink-to-fit"算法计算width值,然后再根据等式计算left值。

 

[2]: 如果left和right都是auto,但是width不是auto,那么如果包含块的direction属性为ltr,则把left置为"static position"的位置,然后再根据等式求right值;反之,则把right置为"static position"的位置,然后再根据等式求left值。

 

[3]: 如果width和right是auto,那么首先根据"shrink-to-fit"算法计算width值,然后再根据等式计算right值

 

[4]: 标准原文中的4,5,6条规则其实可以归结为一条,即如果left,right和width只有一个auto值,那么直接根据等式计算auto值。


绝对定位元素的width计算相对复杂一些,我们通过几个demo来看一下:

##DEMO 4 width,left和right都为auto的情况

代码如下:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>height</strong>: 100<strong>px</strong>;<strong>background</strong>: <strong>#34538b</strong>;<strong>position</strong>: <strong>absolute</strong><strong>"</strong>><br />        绝对定位演示<br /></<strong>div</strong>><br /></<strong>div</strong>>

      

在demo4中,我们定义了一个绝对定位的元素,并且width,left和margin都是默认的auto值,可以看到元素的width是按照"shrink-to-fit"得出的,而left值被设置为了static position的位置,这里其实就是包含块的padding-left:10px。置于right值,虽然浏览器的调试工具并没有给出具体right值的used value,但还是有理由相信浏览器会根据标准中的规则计算相应的值。


##DEMO 5 width,left和right都不为auto的情况

我们把demo4中的代码修改一下,为绝对定位元素设置显式的width,left和right值,并且为margin-left和margin-right设置auo值:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>width</strong>:100<strong>px</strong>;<strong>height</strong>: 100<strong>px</strong>;<strong>background</strong>: <strong>#34538b</strong>;<strong>position</strong>: <strong>absolute</strong>;<strong>left</strong>: 0<strong>px</strong>;<strong>right</strong>: 0<strong>px</strong>;<strong>margin-left</strong>: <strong>auto</strong>;<strong>margin-right</strong>: <strong>auto</strong>;<strong>"</strong>><br />        绝对定位演示<br /></<strong>div</strong>><br /></<strong>div</strong>>

可以明显看到,在width,left和right都不为auto,并且水平margin为auto时,会按照平分margin-left和margin-right的方式布局,从而也可以达到元素居中的效果。

注:IE6/7并不会按照这个规则计算margin值,而是直接将margin的auto置为0然后再进行计算。


我们再修改一下代码,看一下只有一个margin值为auto时的情况:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>width</strong>:100<strong>px</strong>;<strong>height</strong>: 100<strong>px</strong>;<strong>background</strong>: <strong>#34538b</strong>;<strong>position</strong>: <strong>absolute</strong>;<strong>left</strong>: 0<strong>px</strong>;<strong>right</strong>: 0<strong>px</strong>;<strong>margin-left</strong>: <strong>auto</strong>;<strong>margin-right</strong>: 0<strong>px</strong>;<strong>"</strong>><br />        绝对定位演示<br /></<strong>div</strong>><br /></<strong>div</strong>>
我们把margin-right置为0px,而把margin-left置为auto,显示效果如下:


可以看到,margin-left值是根据公式计算得出的值。

注:IE6/7同样还是把margin的auto值置为0,然后等于是在过约束的条件下进行计算,right的值就要被重新计算了,显示效果如下:


这样同时验证了过约束条件下的right或left值被重新计算的规则。


绝对定位元素的width及left,margin-left,margin-right,right值的计算问题稍显复杂,但是如果理解清楚之后也是比较好理解的,建议大家都通过实验来验证一下。另外,IE6/7不管在哪一种情况下就会将margin值置为0的特点也要务必牢记。


2.2.8 绝对定位的置换元素

绝对定位的置换元素在计算时,上一节中关于"static position"以及等式都是适用的,但是计算逻辑并不相同,具体如下:

=》 IF :       width是根据 “行内置换元素width值计算规则”计算得到。而如果margin-left和margin-right的计算值都为auto时,它们的使用值由如下规则计算得出。 [1]

=》ELSE IF:left,right的计算值都是auto,那么在包含块的direction属性为ltr的情况下需要将left置为"static position"的left位置;反之则把right值置为"static position"的right位置。 [2]

=》ELSE IF:left或right为auto,那么将margin-right和margin-left的auto值置为0。[3]

=》ELSE IF:此时如果margin-right和margin-left都为auto,则它们将会拥有相同的值并且必须使得等式成立,从而实现居中效果。但如果这样得出的margin值为负值,那么在包含块的direction属性为ltr的情况下需要将margin-left置为0,并且按照等式计算margin-right的值;反之则将margin-right的值置为0,然后按照等式计算margin-left的值。[4]

=》ELSE IF:此时如果只有一个值为auto,那么则按照等式计算auto值[5]

=》ELSE IF:此时如果形成了过约束,那么在包含块的direction属性为ltr的情况下,忽略right值,并按照等式重新计算right;反之则忽略left的值,并按照等式重新计算。[6]

这几个例子我们就不通过demo来实证了,大家可以亲自敲一敲代码来实验一下,当然IE6/7还是会把margin-left和margin-right的auto置为0。


2.2.9 非置换的行内块

display属性为"inline-block"的元素形成了一个行内块,基于我们已经了解过的规则,对于行内块,在计算margin-left,margin-right和width时就比较容易了,事实上,它的计算规则和浮动元素的计算规则是基本相同的。


首先,margin-left和margin-right的auto值被置为0;

然后,width值根据“shrink-to-fit"算法计算得到。


2.2.10 行内块置换元素

行内块置换元素的计算方法与2.2.2节行内置换元素的计算方法是完全相同的


3 min-width和max-width


在文章的开头部分曾提到,我们通过上述规则计算得出的width值只是一个tentative value,即暂定的一个值,原因就在于最终width的使用值可能还会受到min-width,和max-width值的影响,下面我们来介绍一下min-width和max-width。


3.1 min-width和max-width属性剖析

CSS标准中对min-width和max-width的定义如下:


These two properties allow authors to constrain content widths to a certain range.

这两个属性的作用就是可以让开发者将一个框的width限定在一个范围中,即[min-width:max-width]范围内。与width属性相同,这两个属性也不适用于行内非置换元素,表格行和表格行组,并且都不具有继承性,可以取绝对的长度值,也可以使用百分比,这些与width属性都是相似的,同时两个属性都不允许负值。


另外,min-width的默认值为0,即所有元素的width都不能小于0;max-width的默认值为none,即不限定元素width的最大值。


3.2 min-width,max-width的使用

min-width和max-width对于width使用值的具体影响如下:

[1]:首先根据第二节中介绍的规则计算得出width值以及相关的margin,left和right值。

[2]:如果计算得出的width值大于max-width,那么就把max-width作为width的使用值,再带入计算规则中计算一遍。

[3]:如果计算得出的width值小于了min-width,那么就把min-width作为width的使用值,再带入计算规则中计算一遍。

下面通过一个实例来实证一下,这里以max-width为例:

##DEMO 6  

max-width的使用

 

代码如下:

<<strong>div </strong><strong>class=</strong><strong>"container"</strong>><br /><<strong>div </strong><strong>style=</strong><strong>"</strong><strong>height</strong>: 100<strong>px</strong>;<strong>background</strong>: <strong>#34538b</strong>;<strong>max-width</strong>: 400<strong>px</strong>;<strong>"</strong>><br />        max-width演示<br /></<strong>div</strong>><br /></<strong>div</strong>>

我们为div定义max-width为400px,如果我们没有定义这个属性的话,由于width值在这里是auto,因此width值应该和包含块的content edge宽度相同,即为500px,但由于我们限定了max-width,并且500px>400px,所以最终width值的使用值就为400px,再把这个值带入到2.2.3节的规则中,就形成了一个过约束的条件,因此忽略margin-right值根等式重新计算,最终得到margin-right:100px。


 


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
HTML, CSS 및 JavaScript의 미래 : 웹 개발 동향HTML, CSS 및 JavaScript의 미래 : 웹 개발 동향Apr 19, 2025 am 12:02 AM

HTML의 미래 트렌드는 의미론 및 웹 구성 요소이며 CSS의 미래 트렌드는 CSS-In-JS 및 CSShoudini이며, JavaScript의 미래 트렌드는 WebAssembly 및 서버리스입니다. 1. HTML 시맨틱은 접근성과 SEO 효과를 향상시키고 웹 구성 요소는 개발 효율성을 향상 시키지만 브라우저 호환성에주의를 기울여야합니다. 2. CSS-in-JS는 스타일 관리 유연성을 향상 시키지만 파일 크기를 증가시킬 수 있습니다. CSShoudini는 CSS 렌더링의 직접 작동을 허용합니다. 3. Webosembly는 브라우저 애플리케이션 성능을 최적화하지만 가파른 학습 곡선을 가지고 있으며 서버리스는 개발을 단순화하지만 콜드 스타트 ​​문제의 최적화가 필요합니다.

HTML : 구조, CSS : 스타일, 자바 스크립트 : 동작HTML : 구조, CSS : 스타일, 자바 스크립트 : 동작Apr 18, 2025 am 12:09 AM

웹 개발에서 HTML, CSS 및 JavaScript의 역할은 다음과 같습니다. 1. HTML은 웹 페이지 구조를 정의하고, 2. CSS는 웹 페이지 스타일을 제어하고 3. JavaScript는 동적 동작을 추가합니다. 그들은 함께 현대 웹 사이트의 프레임 워크, 미학 및 상호 작용을 구축합니다.

HTML의 미래 : 웹 디자인의 진화 및 트렌드HTML의 미래 : 웹 디자인의 진화 및 트렌드Apr 17, 2025 am 12:12 AM

HTML의 미래는 무한한 가능성으로 가득합니다. 1) 새로운 기능과 표준에는 더 많은 의미 론적 태그와 WebComponents의 인기가 포함됩니다. 2) 웹 디자인 트렌드는 반응적이고 접근 가능한 디자인을 향해 계속 발전 할 것입니다. 3) 성능 최적화는 반응 형 이미지 로딩 및 게으른로드 기술을 통해 사용자 경험을 향상시킬 것입니다.

HTML vs. CSS vs. JavaScript : 비교 개요HTML vs. CSS vs. JavaScript : 비교 개요Apr 16, 2025 am 12:04 AM

웹 개발에서 HTML, CSS 및 JavaScript의 역할은 다음과 같습니다. HTML은 컨텐츠 구조를 담당하고 CSS는 스타일을 담당하며 JavaScript는 동적 동작을 담당합니다. 1. HTML은 태그를 통해 웹 페이지 구조와 컨텐츠를 정의하여 의미를 보장합니다. 2. CSS는 선택기와 속성을 통해 웹 페이지 스타일을 제어하여 아름답고 읽기 쉽게 만듭니다. 3. JavaScript는 스크립트를 통해 웹 페이지 동작을 제어하여 동적 및 대화식 기능을 달성합니다.

HTML : 프로그래밍 언어입니까 아니면 다른 것입니까?HTML : 프로그래밍 언어입니까 아니면 다른 것입니까?Apr 15, 2025 am 12:13 AM

Htmlisnotaprogramminglanguage; itisamarkuplanguage.1) htmlstructuresandformatswebcontentusingtags.2) itworksporstylingandjavaScriptOfforIncincivity, WebDevelopment 향상.

HTML : 웹 페이지 구조 구축HTML : 웹 페이지 구조 구축Apr 14, 2025 am 12:14 AM

HTML은 웹 페이지 구조를 구축하는 초석입니다. 1. HTML은 컨텐츠 구조와 의미론 및 사용 등을 정의합니다. 태그. 2. SEO 효과를 향상시키기 위해 시맨틱 마커 등을 제공합니다. 3. 태그를 통한 사용자 상호 작용을 실현하려면 형식 검증에주의를 기울이십시오. 4. 자바 스크립트와 결합하여 동적 효과를 달성하기 위해 고급 요소를 사용하십시오. 5. 일반적인 오류에는 탈수 된 레이블과 인용되지 않은 속성 값이 포함되며 검증 도구가 필요합니다. 6. 최적화 전략에는 HTTP 요청 감소, HTML 압축, 시맨틱 태그 사용 등이 포함됩니다.

텍스트에서 웹 사이트로 : HTML의 힘텍스트에서 웹 사이트로 : HTML의 힘Apr 13, 2025 am 12:07 AM

HTML은 웹 페이지를 작성하는 데 사용되는 언어로, 태그 및 속성을 통해 웹 페이지 구조 및 컨텐츠를 정의합니다. 1) HTML과 같은 태그를 통해 문서 구조를 구성합니다. 2) 브라우저는 HTML을 구문 분석하여 DOM을 빌드하고 웹 페이지를 렌더링합니다. 3) 멀티미디어 기능을 향상시키는 HTML5의 새로운 기능. 4) 일반적인 오류에는 탈수 된 레이블과 인용되지 않은 속성 값이 포함됩니다. 5) 최적화 제안에는 시맨틱 태그 사용 및 파일 크기 감소가 포함됩니다.

HTML, CSS 및 JavaScript 이해 : 초보자 안내서HTML, CSS 및 JavaScript 이해 : 초보자 안내서Apr 12, 2025 am 12:02 AM

WebDevelopmentReliesonHtml, CSS 및 JavaScript : 1) HtmlStructuresContent, 2) CSSSTYLESIT, 및 3) JAVASCRIPTADDSINGINTERACTIVITY, BASISOFMODERNWEBEXPERIENCES를 형성합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경