当前位置: 首页 > Web前端 > CSS

【HelloCSS】第2章——CSS逻辑属性与盒模型

时间:2023-03-31 12:05:30 CSS

作者:陈大羽头github:KRISACHAN在【HelloCSS】CSS语法与工作流语法规则及基本渲染流程第一章中介绍了CSS。本文将分享CSS的逻辑属性和盒子模型。在开始这篇文章之前先问大家一个问题:为什么Flexbox和Gridbox的排列规则是用start和end而不是常规的top,right,bottom,left?不要急着往下翻,我们先想一想。这个问题将由鱼头在文章中给出答案。欢迎您带着这个问题往下读。如果你已经知道答案,你也可以检查它是否与你知道的答案一致。CSS的逻辑属性2017年5月18日,W3C的CSS工作组发布了CSS逻辑属性和值Level1的第一份公开工作草案。)可以提取。这些逻辑抽象概念需要在不同的书写方式下映射到左或右、上或下等物理概念。一些CSS布局可能依赖于这些常见的逻辑概念。这个CSS模块给出逻辑属性和值,用于以逻辑方式控制布局(而不是基于物理坐标、书写方向、维度映射等)。该模块源自CSS21中有关逻辑属性和值的特性。W3C中国里面的内容就是上面复制粘贴的。对于前端,我们已经习惯使用top,right,bottom,left来定义我们的HTML元素,这和我们的物理概念是一致的。但是对于CSS这种原本为服务于图形显示而诞生的语言,其实并不匹配。你为什么这么说?writing-modewriting-mode:定义块级元素中文本的水平或垂直排列以及文本的行进方向。writing-mode有以下5个改变HTML文本书写规则的值(SVG中用到的还有几个,本文不再赘述):writing-mode:horizo??ntal-tb;writing-mode:horizo??ntal-tb定义内容从左到右水平流动,从上到下垂直流动。下一条水平线位于上一条线的下方。writing-mode:vertical-rl;writing-mode:vertical-rl定义内容从上到下垂直流动,从右到左水平流动。下一条垂直线位于上一条线的左侧。writing-mode:vertical-lr;writing-mode:vertical-lr定义内容从上到下垂直流动,从左到右水平流动。下一条垂直线位于上一条线的右侧。书写模式:sideways-rl;(仅限Firefox41+实现)writing-mode:sideways-rl定义内容从上到下垂直流动,所有字形,即使是垂直脚本中的字形,都设置为右侧。书写模式:sideways-lr;(仅限Firefox41+实现)writing-mode:sideways-lr内容从上到下垂直流动,所有字形,甚至是垂直脚本中的字形,都设置在左侧。以上效果请看DEMO源码:lr;}.wm-srl{书写模式:sideways-rl;}.wm-slr{书写模式:sideways-lr;}.text-content{宽度:200px;填充:20px;边框:1px实心;显示:内联块;垂直对齐:顶部;padding-right:100px;书写模式:horizo??ntal-tb;

书写模式:vertical-rl;
书写模式:vertical-lr;
书写模式:sideways-rl;
writing-mode:sideways-lr;图标如下:从上图中我们设置padding-right时:100px;,不同的书写规则有不同的显示效果。一开始,HTML和CSS只服务于英语国家,但随着互联网的发展,不同书写规则的国家逐渐流行起来。我们原来的CSS逻辑属性按照物理逻辑分为top(上)、right(右)、bottom(下)、left(左)。那么在按照这个规则修改text属性的时候,就会出现上述不符合语法规则的状态。可能是因为这个原因,W3C发布了新的逻辑属性和值。新旧逻辑属性与新旧CSS逻辑属性是两种完全不同的模型。我们先来看一下新旧逻辑属性对比图(图片来自medium):左旧右新从上图我们可以知道新旧逻辑属性的对应关系为如下:旧逻辑属性和新逻辑属性margin-topmargin-block-startmargin-rightmargin-inline-endmargin-bottommargin-block-endmargin-leftmargin-inline-startborder-topborder-block-startborder-rightborder-inline-endborder-bottomborder-block-endborder-leftborder-inline-startpadding-toppadding-block-startpadding-rightpadding-inline-endpadding-bottompadding-block-endpadding-leftpadding-inline-startwidthinline-sizeheightblock-size从上表可以看出,属性中的Y轴方向改为block,X轴方向的属性改为inline。对于不同语系的国家,书写顺序可能会有很大的不同,也就是说block和inline的方向是不一样的。例如:在英语国家padding-inline-start=padding-left在阿拉伯语padding-inline-start=padding-right在日本padding-inline-start=padding-top这意味着旧的逻辑属性,在一些国家会变得不合理.CSS定位CSS定位属性变化如下:old逻辑属性new逻辑属性topinset-block-startbottominset-block-endleftinset-inline-startrightinset-inline-end示例如下:/*old逻辑属性*/.popup{position:fixed;顶部:0;底部:0;左:0;right:0;}/*新的逻辑属性*/.popup{position:fixed;插入块开始:0;/*top-英文*/inset-block-end:0;/*底部-英文*/inset-inline-start:0;/*left-英语*/inset-inline-end:0;/*right-inEnglish*/}/*新的逻辑属性支持简写*/.popup{position:fixed;插图:0000;/*top,right,bottom,left-英文*/}插图:(图片来自medium):CSSfloatingfloatingfloat的属性也被改变了。旧的逻辑属性和新的逻辑属性float:leftfloat:inline-startfloat:rightfloat:inline-endtext-aligntext-align属性也发生了变化。旧逻辑属性和新逻辑属性text-align:lefttext-align:starttext-align:righttext-align:enddirection除了writing-mode,还有一个排版属性叫做direction,和writing-mode类似,但是不同的是writing-mode是控制网页的布局方向,direction是控制文字的对齐方向。属性如下:方向:ltr;默认值,以便文本和其他元素从左到右显示。方向:rtl;使文本和其他元素从右到左显示。吐槽一下,看到这里的抠图小子们,赶紧跑路重构,等正式开启这个属性,就真的GG了。但是我觉得应该有一个属性来选择性的启用物理属性或者逻辑属性,否则对于前端来说就是一场灾难!CSSboxmodel基本盒模型(CSSbasicboxmodel)当浏览器渲染一棵渲染树时,浏览器的渲染引擎根据基本盒模型(CSSbasicboxmodel)将所有元素划分为矩形,这些盒子的外观和属性是确定的通过CSS。我们在浏览器控制台输入以下代码可以看到页面的每个元素都被一个矩形包裹起来,这些是盒子$$('*').forEach(e=>{e.style.border='1pxsolid';})示意图如下:每个框由四部分组成:内容(content)框(box)内容,显示标签中的所有文字、图案或其他内容。padding盒子内部的填充,样式是透明的,主要负责扩大盒子内部区域的大小。外边距(margin)是框(box)外的区域,样式透明,负责隔离相邻元素。边框(border)盒子(box)的边框,负责隔离外边距和内边距。盒子模型的值盒子模型有三个值:content-boxcontent-box是标准的盒子模型。盒子的宽高只包含盒子本身的宽高属性。计算规则:width=widthheight=heightborder-boxborder-box是盒模型的可选属性之一。框的宽度和高度包括内容、填充和边框。当文档处于Quirks模式时,这也是InternetExplorer使用的框模型。计算规则:width=width+border+paddingheight=height+border+paddingpadding-boxpadding-box是一个非标准属性,曾经在Firefox中实现过,但是在Firefox50中删除了。padding-box的width和height属性包括内容和填充,但不包括边框和边距。插图:让我在这里投诉。我不知道为什么没有边距框。虽然意义不大,但实现起来的效果估计也是很诡异的。但是作为一个强迫症晚期患者,失去一个属性总感觉不爽。视觉格式化模型(visualformattingmodel)CSS的视觉格式化模型(visualformattingmodel)是基于基本框模型(CSSbasicboxmodel)将文档(doucment)中的元素转换成框的实际算法。官方的说法是:它指定了用户代理如何处理介质中的文档树(documenttree)。每个盒子的布局由以下因素决定:盒子大小盒子类型:内联盒子(inline)、内联级盒子(inline-level)、原子内联级盒子(atomicinline-level)、块盒子(block)定位:普通流、浮动、绝对定位文档树中当前框的子元素或兄弟元素视口(viewport)的大小和位置框内图片的大小其他外部因素视觉格式化模型的计算根据矩形的边界,此矩形称为包含块。通常,(元素的)生成框将扮演其后代元素的包含块的角色;我们称之为:(元素的)框架为其后代节点构建包含块。包含块是一个相对的概念。例子如下:
hi
上面的代码是一个例子,div和table都包含块。div是table的包含块,table也是td的包含块,不是绝对的。插图:(图片来自w3help):boxgenerationboxgeneration是CSS可视化格式化模型的一部分,用于从文档元素生成box。框的类型取决于CSS显示属性。块级元素当元素的显示为块、列表项或表格时,它就是块级元素。Block-levelboxesBlock-levelboxes用于描述它与它的父元素和兄弟元素之间的关系。每个块级框都参与块格式化上下文的创建。每个块级元素都会生成至少一个块级框,即主块级框(principalblock-levelbox)。主块级框包含后代元素生成的框和内容,也会参与定位方案。块级盒同时也是块容器盒的称为块盒。匿名框在某些情况下需要可视化格式化时,需要添加一些辅助框。这些框不能被CSS选择器选中,即所有可继承的CSS属性值都是inherit,所有不可继承的CSS属性值都是initial。因此得名匿名盒。内联元素当元素显示为内联、内联块或内联表时,它就是内联级元素。显示时可以与其他内联级内容一起显示为多行。行内框行内级元素生成行内级框,它们也参与创建行内格式化上下文。匿名内联框类似于块框,CSS引擎有时会自动创建一些内联框。这些行内框不能被选择器选中,所以它们是匿名的。它们从父元素继承那些可继承的属性,其他属性保持初始默认值。行框行框由内联格式化上下文创建,用于显示一行文本。在块盒内,线盒总是从块盒的一侧延伸到另一侧。当有浮动元素时,行框从左浮动元素的右边缘延伸到右浮动元素的左边缘。run-inbox(CSS2.1标准中移除)run-inbox可以通过display:run-in设置,可以是blockbox也可以是inlinebox,具体取决于后面的box。类型。定位规则框形成后,CSS引擎需要对它们进行定位以完成布局。定位使用的规则如下:普通流普通流中,盒子会被顺序放置。在块格式上下文中,框是垂直排列的。在行内格式化上下文中,框是水平排列的。浮动:当一个盒子的浮动不为无,且位置为静态或相对时,盒子被定位为浮动。float:left:框将定位到当前行框的起始位置(左侧)。float:right:框将定位在当前行中框的结束位置(右侧)。绝对定位:如果元素的位置是绝对的或固定的,则该元素是绝对定位的。使用绝对定位,盒子完全从当前流中移除并且与其没有进一步的连接。参考资料:W3C中国新CSS逻辑属性!w3help可视化格式化模型(Visualformattingmodel)MDN可视化格式化模型包含块(Containingblock)结论本文主要介绍新旧CSS逻辑属性的现状以及盒模型的具体情况。文中还有一些内容没有过多介绍,比如块格式化上下文、行内格式化上下文等具体名称,将在后续文章中介绍。到时候我会详细讲解,希望大家多多关注鱼头的【HelloCSS】系列。一开始鱼头我问了大家一个问题,就是:为什么flexboxes和gridboxes用start和end作为排列规则,而不是常规的top,right,bottom,left?通过这篇文章的分享,你对这个问题有了答案吗?鱼头,我会在下篇文章开头分享答案,希望大家多多关注本系列文章。【HelloCSS】系列【HelloCSS】是以CSS基本概念为主题的系列文章,旨在帮助大家更深入地理解CSS,提升CSS在开发者心目中的地位。由于本人鱼头水平有限,文笔水平有限,如果您发现文章中有不合理或不正确的地方,欢迎指出。我将不胜感激;如果您通过文章有什么想法或疑问,希望您能积极留言,我们共同探讨;如果你通过这一系列的文章有所收获,这会让鱼头大喜过望!如果你也喜欢CSS,喜欢讨论技术,或者对本文或本系列有什么意见或建议,非常欢迎你加鱼头微信好友一起讨论。当然,鱼头也希望和大家聊聊生活和爱好。谈论一切。鱼头微信公众号是:krisChans95,也可以扫描二维码加好友,备注“顺丰”即可