1. 浮动元素有什么特征?对父容器、其他浮动元素、普通元素、文字分别有什么影响?
- 浮动元素特征:使元素脱离文档流,按照指定方向发生移动,遇到父级边界或者相邻的浮动元素则停下。浮动样式可以应用在块元素及行内元素上。元素浮动之后不占据原来的位置。元素在一排显示,相邻间没空隙。应用在行内元素上时可以让其像行内元素一样设置宽高。
- 对父容器影响:如果父容器里全都是浮动元素,则会造成父容器高度塌陷。
- 对其他浮动元素影响:浮动元素按顺序排列,如果父容器宽度不够,浮动元素则向下移动直到碰到父容器边框或其他浮动元素。
- 对普通元素影响:普通元素无法察觉到浮动元素存在,浮动元素不会影响普通元素的位置,但是浮动元素可以覆盖普通元素。
- 对文字的影响:文字会察觉到浮动元素的存在,文字会被浮动元素挤开,会围绕浮动元素。
2. 清除浮动指什么? 如何清除浮动? 两种以上方法
- .clear:both 在父元素中添加一个无意义的div,并向其添加样式clear:both清除浮动,使得父容器撑起来
- BFC:利用某些属性清除格式上下文的特质,使父容器形成一个新的BFC.其便具有BFC包含浮动的特质,使高度撑起来。
- .clearfix:{*zoom:1} *表示针对于IE6,7,其原理是使父容器形成一个类似于BFC的特性
- .clearfix:after:{content:""; display:block; clear:both;} 本质是第一个
3. 有几种定位方式,分别是如何实现定位的,参考点是什么,使用场景是什么?
- inherit:继承父元素定位属性。
- static:默认值,没有定位,元素出现在正常的文档流中。参考点是文档流中的位置。
- relative:相对定位。相对于元素本身正常位置进行定位,通过top、bottom、left、right属性来设置偏移量。使用场景:为绝对定位设定参照物或对元素自身位置进行局部调整。
- absolute:绝对定位。相对于static定位以外的第一个祖先元素进行定位,若都没有发现则以html标签为参考进行定位。使用场景:当想让元素参照特定参照物进行定位时使用。
- fixed:固定定位。生成绝对定位元素,相对于viewport进行定位。
- sticky:对象在常态时遵循普通流。它就像是relative和fixed的合体,当在屏幕中时按常规流排版,当卷动到屏幕外时则表现如fixed。兼容性不佳,不常用。
4. z-index 有什么作用? 如何使用?
- z-index 只能设置在 position: static; 以外属性值的元素上。
- 当元素发生重叠时,z-index 决定了重叠的先后顺序。
- z-index 值大的元素会覆盖 z-index 值小的元素。
5. position:relative和负margin都可以使元素位置发生偏移?二者有什么区别
- position:relative 会保留元素原本的位置,它只是看起来移动了而已,其他元素会表现得定位元素仍然在之前的位置一样,它们的布局不会改变。
- 负 margin 会使元素整个移动,不保留它原本的位置,而是会完全移动到新的位置,而且会影响到它后面其他元素的布局。
6. BFC 是什么?如何生成 BFC?BFC 有什么作用?举例说明
- BFC 是指 block formatting context,即块级元素格式化上下文。本质上,它是指一个自包含的格式化空间,BFC 内部的元素和其外部的元素之间互不影响。
- 如何生成 BFC
- 根元素 html
- float 为 left | right 的元素
- overflow 为 hidden | auto |scroll 的元素
- display 为 table-cell | table-caption | inline-block | flex | inline-flex的元素
- position 为 absolute | fixed 的元素
- 作用
- 清除兄弟元素浮动后产生的元素 box 重叠的副作用,形成正适应两栏布局。
- 清除子元素浮动后产生的父容器高度塌陷的副作用,让浮动元素将父容器撑开。
- 防止父子元素之间的垂直 margin 重叠问题
7. 在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例
外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。
外边距合并外边距合并(叠加)是一个相当简单的概念。但是,在实践中对网页进行布局时,它会造成许多混淆。简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。请看下图:
CSS 外边距合并实例 1
亲自试一试当一个元素包含在另一个元素中时(假设没有内边距或边框把外边距分隔开),它们的上和/或下外边距也会发生合并。请看下图:
亲自试一试尽管看上去有些奇怪,但是外边距甚至可以与自身发生合并。假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并:
如果这个外边距遇到另一个元素的外边距,它还会发生合并:
CSS 外边距合并实例 4
这就是一系列的段落元素占用空间非常小的原因,因为它们的所有外边距都合并到一起,形成了一个小的外边距。外边距合并初看上去可能有点奇怪,但是实际上,它是有意义的。以由几个段落组成的典型文本页面为例。第一个段落上面的空间等于段落的上外边距。如果没有外边距合并,后续所有段落之间的外边距都将是相邻上外边距和下外边距的和。这意味着段落之间的空间是页面顶部的两倍。如果发生外边距合并,段落之间的上外边距和下外边距就合并在一起,这样各处的距离就一致了。
CSS 外边距合并的实际意义
如何不让相邻元素外边距合并
- 只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。
BFC会阻止垂直外边距(margin-top、margin-bottom)折叠
- 按照BFC的定义,只有同属于一个BFC时,两个元素才有可能发生垂直Margin的重叠,这个包括相邻元素,嵌套元素,只要他们之间没有阻挡(例如边框,非空内容,padding等)就会发生margin重叠。
- 因此要解决margin重叠问题,只要让它们不在同一个BFC就行了,但是对于两个相邻元素来说,意义不大,没有必要给它们加个外壳,但是对于嵌套元素来说就很有必要了,只要把父元素设为BFC就可以了。这样子元素的margin就不会和父元素的margin发生重叠