相关文章推荐
讲道义的甘蔗  ·  java ...·  3 月前    · 
安静的油条  ·  Hive 完美解析 Json ...·  1 年前    · 
朝气蓬勃的紫菜  ·  node.js - electron ...·  1 年前    · 

css 浮动、定位、BFC

1.浮动

浮动元素的特征:

  • 浮动元素的框可以向左或者向右移动,直到它的外边缘碰到父元素包含框或者另一个浮动元素的边框为止;
  • 浮动元素不在文档普通流之中,因此文档普通流中的块级元素感知不到浮动元素的存在。

浮动对其他元素的影响

a.对父容器的影响:造成父元素的塌陷

浮动元素脱离文档流向左或者向右移动,直到边框碰到父元素的边缘,它无法撑开其父元素.

b.对其他浮动元素的影响:

浮动元素都向某个方向移动,直到其边框碰到其他元素的边框,如果包含框太窄,无法容纳多个浮动元素,那么其浮动元素向下移动,直到拥有足够的空间,如果浮动元素的高度不同,那么它们向下移动时可能被其他浮动元素卡住。

c.对普通元素的影响:

  • 如果兄弟元素为块级元素,该元素会忽视浮动元素的而占据它的位置,并且元素会处在浮动元素的下层(并且无法通过z-index属性改变他们的层叠位置),但它的内部文字和其他行内元素都会环绕浮动元素。
  • 如果兄弟元素为内联元素,则元素会环绕浮动元素排列

d.对文字的影响:

浮动元素旁边的文字框被缩短,从而给浮动元素留出空间,文字框围绕浮动元素。

e.对子元素的影响:

当一个元素浮动时,在没有清除浮动的情况下,它无法撑开其父元素,但它可以让自己的浮动子元素撑开它自身,并且在没有定义具体宽度情况下,使自身的宽度从100%变为自适应(浮动元素display:block)

清除浮动:

清除浮动指的是运用clear属性去解决浮动父容器高度塌陷的问题,clear属性规定元素的哪一侧不允许其他浮动元素。
···
<style>
body{
border: 1px solid brown;
}
.container{
border: 1px solid grey;
margin: 50px 30px;
width: 1000px;
background-color: pink;
}
.box1{
float: left;
width: 200px;
height: 30px;
background-color: #f00;
}
.box2{
float: left;
width: 200px;
height: 40px;
background-color: #0f0;
}
.box3{
float: left;
width: 200px;
height: 50px;
background-color: #00f;
}
</style>
</head>
<body>
<div class="container">
<div class="box1">1</div>
<div class="box2">2</div>
<div class="box3">3</div>
<div class="clear">1</div>
</div>
</body>
</html>
···




9.png

方法一:添加新的元素 、应用 clear:both;

清除浮动方法2:BFC(Block Format Content)清理浮动,BFC可以阻止垂直外边距折叠、不会重叠浮动元素、可以包含浮动。因此清理浮动在BFC的语境下就是“包含浮动”,也即让父容器形成BFC就可以。

.clear{
            clear: both;
    </style>




10.png

方法二:使用伪元素::after(推荐使用)

.container ::after{
            content:"";
            display: block;
            clear: both;
        }




11.png

方法三:形成BFC块级排版上下文;

用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文,但是如果一个块级元素 设置了float:left,overflow:hidden或position:absolute样式,就会为这个块级元素生成一个独立的块圾上下文。就像在window全局作用域内,声明了一个function就会生成 一个独立的作用域一样,新开僻的BFC像是开僻了一个新的小宇宙,使这个块圾元素内部的排版完全独立隔绝。
2.独立的块级上下文可以包裹浮动流,全部浮动子元素也不会引起容器高度塌陷,也就是说包含块会把浮动元素的高度也计算在内,顺便达到了清除浮动的目的。
···
.container{
overflow: hidden;
}
···





12.png

注意:BFC可以包含浮动,但是使用BFC清除浮动可能有副作用,比如使用float的时候会使父容器长度缩短,而且还有个重要缺陷——父容器float解决了其塌陷问题,那么父容器的父容器怎么办?overflow属性会影响滚动条和绝对定位的元素;position会改变元素的定位方式。所有如果使用BFC清除浮动,还要考虑修复其可能产生的副作用。

2.BFC

BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。

哪些元素会生成BFC?

1、根元素
2、float属性不为none
3、position为absolute或fixed
4、display为inline-block, table-cell, table-caption, flex, inline-flex
5、overflow不为visible

BFC的特性

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠每个元素-
  • 的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即--- 使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算。

BFC的作用:

1.外边距合并

外边距合并指的是,两个在普通文档流中的“相邻”元素外边距相遇的时候发生合并的情况。这个所谓的“相邻”可以是父子关系相邻,兄弟关系相邻,甚至如果一个元素内部没有东西,自身的上下边距相遇时都会发生外边距合并。

合并的结果为: 当两个外边距都是正数时,取两者之中的较大者;当两个外边距都是负数时,取两者之间绝对值较大者;当两个外边距一正一负时,取的是两者的和。

外边距合并的具体情况:

a.父子关系的合并

假如说,父元素和子元素在正常的文档流当中。而且父元素没有边框或者padding,那么父子之间就会发生外边距合并。
(简单的解决方法:

  • 1.给父元素加边框;
    给父元素加了边框之后,它们的margin就被边界线隔离开来,就不会发生外边距合并。它们就会各归各位,父元素有父元素的外边距,子元素有子元素的外边距
  • 2.设置父元素的padding
    给父元素设置了padding之后,也能够阻止父子的外边距相融合,所以也可以防止父子元素的外边距合并。)

b.兄弟关系的合并:

如果两个兄弟元素在正常的文档流当中,会产生外边距合并。
(简单的解决方案:只设置一个外边距)

c.自身的合并

一个元素如果里面没有东西,也没有边框和padding,那么它自身的外边距就会融合,也会发生外边距合并
(简单的解决方案:
1.给自身加边框;2.给自身加padding)

阻止相邻元素外边距合并:

另外的方法创建BFC:
1.设置float属性不为none;
2.设置position为absolute或fixed;
3.设置display为inline-block, flex, 或者inline-flex
4.设置:overflow不为visible
但是设置这些属性,要了解它们的副作用并修复

<html>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
  <div id="header">
    <div>  <h1>hello world</h1></div>
   <div class="detail">
  <div class="footer1">
<!--     footer1 -->
    <div class="footer2">
    footer2
</body>
</html>
#header{
  background-color: red;
  margin-bottom:40px ;
/*   border:1px solid #333 */
    /* padding: 1px; */
 overflow: hidden;
  /* float: left;
  width: 100%; */
  /* display: inline-block;
  width: 100%; */
 /*  position: absolute; */
#header h1{
  margin-top: 50px;
.detail{
  /* float: left;
  clear: both; */
  overflow: hidden;
  margin-top: 30px;
  margin-left: 30px;
  background-color: #00f;
.footer1{
  background-color: #0f0;
  margin: 30px;
.footer2{
  background-color: yellow;




14.png

2.包含浮动:计算BFC的高度时,浮动元素也参与计算

</head>
<header>
  <h1>hello world</h1>
      <li><a href="">1</a></li>
      <li><a href="">2</a></li>
      <li><a href="">3</a></li>
</header>
</body>
body{
  background-color: grey;
  margin: 0;
header{
    background-color: red;
    overflow:hidden;
  list-style: none;
  background-color: pink;
  float: left;