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

CSS盒模型和外边框合并的问题

时间:2023-04-03 01:15:39 HTML

盒模型我们可以把布局中的所有东西都想象成一个盒子,盒子里面有小盒子,小盒子里面有小盒子...所以布局里面的所有东西基于盒子。即使是一个很小的元素p也可以抽象成一个盒子。你现在脑子里有很多问题,没关系,继续读下去。以下是标准箱模型。(Imagesource)我们通常给元素添加的宽度和高度,实际上是在加宽和加高内容区域。当我们增加内外边距时,内容区域的大小不会改变,但整体大小会改变。如果我们为元素添加一个1像素的框架,那么我们所能看到的就是框架内部的内容(内边距+内容区域)。如果我们给元素添加背景,背景也会应用到这个区域,外边距是不可见的,它是用来分隔元素的。虽然边距是看不见的,但是当我们计算元素的总宽或总高时,我们需要加上边距。即:totalheight=margin-top+border+padding-top+height+padding-bottom+border+margin-bottomwidthtotal=margin-left+border+padding-left+width+padding-right+border+margin-right如果只在视觉上固定帧的大小,不添加边距进行计算。这里和《精通CSS 高级web标准解决方案(第二版)》有不同意见。(P39-P40,我觉得书上有错误)outermargins的mergingproblem什么是merging,意思就是outermargins会有重叠。取两者中最大的作为区间合并问题。合并问题的前提是有两个或两个以上的块元素在竖直方向以粗体文字相遇时,margin会被折叠分开普通流,两个或两个以上,块元素,竖直,很容易理解。这次相遇需要仔细解释。什么是相遇?简单来说,就是两种元素相遇。这次相遇是真正的相遇。如果有框架或其他障碍物,则不会发生折叠!具体分为:Ⅰ:父元素的上边距和第一个子元素的上边距大致是图中的效果:即父元素的margin-top与第一个子元素的margin-top相交第一个子元素,看代码:HTML:

CSS:/*为了让效果更明显,添加主体的背景色*/body{background-color:#ccc;}.father{background-color:blue;高度:100px;宽度:100px;margin-top:20px;}.son{background-color:red;高度:20px;宽度:20px;:20px;}效果图:可以看到,红色方块本来应该比蓝色方块低20px,但是被合并了!这种合并有时是一种便利,但在其他情况下,它会成为某个地方的错误。所以后面会讲到如何消除这种浮动。Ⅱ:父元素的bottommargin和最后一个子元素的bottommargin是父元素的margin-bottom和最后一个子元素的margin-bottom的重叠部分。跟上一个差不多,就不多说了。Ⅲ:相邻兄弟元素相邻兄弟是两个相邻元素margin-top和margin-bottom的合并。margin为40px的情况:
.block1{background-color:red;高度:50px;宽度:50px;margin-bottom:20px;}.block2{background-color:blue;高度:50px;宽度:50px;margin-top:20px;}实际渲染:可以看出相邻的兄弟元素确实合并了。Ⅳ:空元素,其上边距与下边距一致本段与下一段的距离为20px

这段和上面一段的距离会是20px

这样第一段的距离第一个p元素和第三个p元素之间是20px防止自动合并从定义上看这个问题就很好理解了。我们可以从合并的前提出发,探索几种防止合并的方法:第一种方法:去掉普通流position:absolute;浮动:左/右;第二种方法:成为非块元素第一篇文章已经提到可以使用display:inline;将块元素转换为行内元素。注意:虽然理论上用这个方法可以实现,但是对于除图片以外的行内元素不能设置宽高,margin-topmargin-bottom也会失效,所以我觉得在里面实现不了实践。其实除了行内元素和块级元素,还有一种元素inline-block,它结合了两者的优点。(后面会有专门的文章总结。)所以也可以用display:inline-block来实现。避免相遇最重要的前提是两个元素相遇才能融合。我们只需要将它们分开!那么相交的两个边距之间可以是什么呢?我给出了两种情况的图表。从这里可以清楚的看出,这种方法只能用在父子的情况下。而且方法也很明显:在父元素上设置padding或border!对于父子元素,还有一种方式:清除浮动,overflow:hiddenoverflow:auto,不清楚为什么可以清除浮动。clearfloating属性是为父子元素的方法设置的。注意,如果有负margin,合并后的margin是最大正margin加上最小负margin(绝对值最大的那个)。比如upper元素的bottommargin是20px,而lower元素的topmargin是-20px,那么最终的值就是0px。实际情况下,可以直接写margin-bottom或者margin-top来避免这种情况。非块元素如何显示?为此,我专门写了一篇文章:内联元素详解(你一定不知道的)(一样的后面会连上)更新2017.12.03第一版2017.12.03第二版,修改布局,修改一些重要的理解,增加新的查询。2017.12.15第三版,修改了版面,增加了一些新的想法