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

关于cssmargin,一些让你模棱两可的点

时间:2023-03-31 01:27:06 CSS

原文:https://www.smashingmagazine....已经收录在qq44924588...,更多往期好评文章已归类,还有很多我的文档和教程资料也都整理好了。欢迎来到星和完美。面试时可参考考点复习。我希望我们能在一起。当我们学习CSS时,我们大多数人首先学习的是CSS中盒子的各个部分的细节,它们被称为CSS盒子,模型。“盒子模型”中的元素之一是边距,盒子周围的透明区域将其他元素推离盒子内容。margin-top、margin-right、margin-bottom和margin-left属性以及一次设置所有四个属性的简写边距在CSS1中进行了描述。边距似乎是一件相当简单的事情,但是,在本文中,我们将看看与边距有关的一些令人困惑和有趣的事情。特别是边距如何相互作用,以及边距重叠效应。CSS盒子模型CSS盒子模型是指一个盒子的各个部分——content、padding、border和margin,它们之前是如何布局和交互的,如下:盒子的四个margin属性和maring的缩写都是在CSS1中定义。CSS2.1规范有一个演示框模型的插图,还定义了用于描述各种框的术语,包括内容框、填充框、边框框和边距框。现在有一个3级盒模型规范草案。本规范引用CSS2作为框模型和边距定义,因此我们将在本文的大部分内容中使用CSS2定义。边距重叠CSS1规范定义了边距,也定义了垂直边距重叠。如果您考虑到早期使用CSS作为文档格式化语言,则边距重叠是有道理的。边距重叠意味着当一个底部边距的标题后面跟着一个顶部边距的段落时,它们之间不会有太大的间隙。当两个边距重叠时,它们被组合在一起,两个元素之间的空间取较大的一个。较小的边距位于较大的边距内。在以下情况下边距重叠:完全空框父元素的相邻兄弟元素和第一个或最后一个子元素依次看到这些场景。AdjacentSiblingsOverlappingMargins最初的描述是为了演示相邻兄弟之间的边距如何重叠。除了下面提到的情况,如果两个元素在正常流中依次显示,第一个元素的底部外边距将与下面元素的顶部外边距重叠。在下面的示例中,有三个div元素。第一个div的顶部和底部边距均为50px。第二个div的上下边距为20px。第三个div的顶部和底部边距均为3em。前两个元素之间的边距为50px,因为顶部边距较小而底部边距较大。第二个元素和第三个元素的边距是3em,因为3em比第二个元素底部的边距20px大。htmlmargin-top:50px;margin-bottom:50px;

margin-top:20px;-bottom:20px;
margin-top:3em;margin-bottom:3em;
css.wrapper{border:5pxdottedblack;}.example1{margin:50px050px0;}.example2{margin:20px020px0;}.example3{margin:3em03em0;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,无衬线字体;保证金:2em3em;}.box{背景颜色:rgb(55,55,110);白颜色;填充:20px;border-radius:.5em;}运行效果:如果A框为空,则完全为空框,因此其顶部和底部边距可能会相互重叠。在下面的示例中,类为空的元素的顶部和底部外边距各为50px,但是第一项和第三项之间的外边距不是100px,而是50px。这是由两个边距重叠引起的。将内容放入空框中将防止边距被合并。htmldivclass="wrapper">一个盒子另一个盒子css.wrapper{border:5pxdottedblack;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,sans-serif;保证金:2em3em;}.box{背景颜色:rgb(55,55,110);白颜色;border-radius:.5em;}.empty{margin:50px050px0;}运行效果:父元素与第一个或最后一个子元素margin重叠,让人猝不及防,因为有时候不是很直观。在下面的例子中,有一个div类wrapper,给这个div一个红色的轮廓,这样你就可以看到它在哪里。这个div中三个子元素的外边距都是50px。但是你会发现实际效果是第一项和最后一项与父元素的边距平齐,就好像子元素和父元素之间没有50px的边距一样。html项目1项目2项目3css.wrapper{outline:1pxsolidred;}.box{margin:50px;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,sans-serif;保证金:2em3em;}.box{背景颜色:rgb(55,55,110);白颜色;填充:20px;border-radius:.5em;}运行效果:这是因为子节点上的margin会跟随父节点两边的margin相互重叠,以至于最终都在父节点之外。如果您使用DevTools检查第一个子元素,您可以看到这一点,显示的黄色区域是边距。Onlyblockelementmarginoverlap在CSS2中,marginoverlap只规定在垂直方向,即元素的上下外边距。因此,上面的左右边距不重叠。值得注意的是,边距仅在块的方向上重叠,例如段落之间。防止边距重叠如果一个元素是绝对定位的或浮动的,它的边距将永远不会重叠。但是,假设你在上面的例子中遇到了几种情况,你如何防止边距重叠呢?例如,一个完全空的框,如果它有边框或填充,它的顶部和底部边距将不会重叠。在下面的示例中,1px填充被添加到空框。现在空框上方和下方有50px的边距。html一个盒子另一个盒子css.wrapper{border:5pxdottedblack;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,sans-serif;保证金:2em3em;}.box{背景颜色:rgb(55,55,110);白颜色;border-radius:.5em;}.empty{边距:50px050px0;padding:1px;}运行效果:这是有逻辑的,如果盒子是完全空的,没有边框和padding,基本上是看不见的。它可能是CMS中标记为空的段落元素。如果您的CMS添加了额外的段落元素,您可能不希望它们在其他段落之间产生较大的间隙,因此边距重叠是有道理的。对于父元素和第一个或最后一个子元素边距重叠,如果我们给父元素添加边框,子元素的边距仍然在里面。....wrapper{border:5pxdottedblack;}...同样,这种行为有一些逻辑。如果出于语义目的包装元素,但这些元素未显示在屏幕上,那么您可能不希望它们在显示中引入较大的边距。当网络主要是文本时,这很有意义。当我们使用元素来布局设计时,其重叠行为没有多大意义。创建格式化上下文(BFC)BFC(BlockFormattingContext)格式化上下文是网页中盒模型布局的一种CSS渲染方式,指的是一个独立的渲染区域或隔离的独立容器。BFC防止边距重叠。如果我们查看父元素和第一个或最后一个子元素的示例,将display:flow-root添加到wrapper元素将创建一个新的BFC,从而防止margin合并....wrapper{outline:1pxsolid红色的;display:flow-root;}...display:flow-root是CSS3的新属性,用于创建无副作用的BFC。将overflow属性的值设置为auto会产生相同的效果,因为这也会创建一个新的BFC,尽管它也可能会创建一些在某些情况下不需要的滚动条。flex和grid容器flex和grid容器为其子容器建立flex和grid格式化上下文,因此它们也防止边距重叠。还是以上面的例子为例,把wrapper改成flex布局:....wrapper{outline:1pxsolidred;显示:弹性;flex-direction:column;}...网站的marginstrategy会因为margin而重叠。如果能找到一种一致的方式来处理网站上的边距,那就太好了。最简单的方法是只在元素的顶部或底部定义边距。这样就很少遇到边距重叠的问题,因为有边距的边总是和没有边距的边相邻。此解决方案并不能解决您可能遇到的问题,因为子元素的外边距会与父元素重叠。这个特殊问题往往不太常见,但了解它发生的原因可以帮助您找到解决方案。对此,一个理想的解决方案是为元素设置display:flow-root,但有些浏览器不支持。可以使用overflow来创建BFC,或者将父元素设置为flex容器。当然也可以设置padding来解决。百分比边距当您在CSS中使用百分比时,它必须是元素的百分比。使用百分比设置的边距(或填充)始终是父元素的行内大小(水平书写模式下的宽度)的百分比。这意味着当使用百分比时,元素周围的填充将是相同的大小。下例中有一个200px宽的dang,里面是一个类名框的div,它的边距值为10%,也就是20px(200*10%)。html我有10%的利润率。css*{box-sizing:border-box;}.wrapper{border:5px黑色虚线;width:200px;}.box{背景色:rgb(55,55,110);白颜色;填充:20px;边界半径:.5em;margin:10%;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,sans-serif;margin:2em3em;}我们在整篇文章中都在讨论垂直边距,然而,现代CSS倾向于与流程相关,而不是考虑事物的物理方式。所以当我们谈论垂直边距时,我们实际上是在谈论块维度的边距。如果我们处于水平书写模式,这些边距将是顶部和底部,但在垂直书写模式下,这些边距将是右侧和左侧。一旦你使用逻辑的、与流程相关的方向,谈论一个块的开始和结束比谈论一个块的顶部和底部更容易。为了简化这个过程,CSS引入了逻辑属性和值规范。这将与流相关的属性映射到物理属性。margin-top=margin-block-startmargin-right=margin-inline-endmargin-bottom=margin-block-endmargin-left=margin-inline-start有两个新的快捷键,你可以设置两个块或两个在同时内联块。margin-blockmargin-inline在下面的例子中,使用这些流相关的关键字,然后改变框的书写模式,你可以看到边距如何跟随文本方向:html水平-tb书写模式的盒子。垂直-rl书写方式的框。css*{box-sizing:border-box;}.??wrapper{border:5pxdottedblack;inline-size:200px;}.horizo??ntal-tb{书写模式:horizo??ntal-tb;margin-bottom:1em;}.vertical-rl{writing-mode:vertical-rl;}.box{background-color:rgb(55,55,110);白颜色;填充:20px;边界半径:.5em;保证金块开始:30px;保证金块结束:10px;边距内联开始:2em;margin-inline-end:5%;}body{font:1.4em/1.3"GillSans","GillSansMT",Calibri,sans-serif;margin:2em3em;}要了解更多信息,您可以阅读MDN上有关逻辑属性和值的更多信息。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。交流文章每周更新。可以微信搜索“大千世界”立即阅读更新(比博客早一两篇),本文GitHubhttps://github.com/qq44924588...已收录,本人整理了一篇我的很多文件。欢迎加星和改进。可以参考考点面试复习。另外,关注公众号,后台会回复福利,可以看到福利,你懂的。