CSS中碰到的一些坑

目录

一、外边距(margin)合并

二、margin-top塌陷

三、内联元素及内联块元素间隙问题

四、清除浮动


一、外边距(margin)合并

当两个垂直的外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者,而不是二者之和。解决方法如下:

1、利用这种特性

2、只设置一边的外边距,一般只设置margin-top,这样垂直方向只有一个边距

3、将元素浮动或者定位,浮动或者定位时外边距不会合并

二、margin-top塌陷

当盒子嵌套时,可以是一个盒子嵌套一个盒子或者一个盒子嵌套多个同级的盒子,内部盒子设置的margin-top加到外面的盒子上,导致内部的盒子margin-top设置失败;内部多个同级的盒子时,第一个盒子的margin-top加到外面的盒子上,而同级其他盒子会正常显示magin-top。例如:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>magin-top塌陷</title>
	<style type="text/css" media="screen">
		body{
			margin:0;
			padding: 0;
		}
		.con{
			width: 300px;
			height: 300px;
			/*border:1px solid #000;*/
			/*margin: 100px auto;*/
			text-align: center;
			/*font-size:0px;*/
			background-color: gray;
			/*overflow: hidden;*/
		}

		.con div{
			width: 100px;
			height: 100px;
			background-color: gold;
			margin-top: 20px;
			line-height: 100px;
			/*display: inline-block;*/
			text-align: center;
			/*font-size: 14px;*/
		}


	</style>
</head>
<body>
	<div class="con">
		<div>1</div>
		<div>2</div>
	</div>
</body>
</html>

例子中外部盒子未设置margin-top,内部盒子设置了margin-top,但最终页面显示内部第一个盒子没有margin-top,设置的margin-top跑到外部盒子上面了,而第二个盒子margin-top正常

解决方法:

1、外部盒子设置一个边框

2、外部盒子设置overflow:hidden

(overflow:hidden 内容会被修剪,并且其余内容是不可见的,此属性还有清除浮动、清除margin-top塌陷的功能。)

3、使用伪元素类:


.clearfix:before{
    content: '';
    display:table;
}

三、内联元素及内联块元素间隙问题

内联元素,也可以称为行内元素,布局中常用的标签如:a、span、em、b、strong、i等等都是内联元素

内联块元素,也叫行内块元素,是新增的元素类型,现有元素没有归于此类别的,img和input元素的行为类似这种元素,但是也归类于内联元素,我们可以用display属性将块元素或者内联元素转化成这种元素

内联元素及内联块元素在代码出现换行时,盒子之间会产生间隙。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css" media="screen">
	    body{
	    	margin: 0px;
	    }
		.box{
			width: 600px;
			height: 200px;
			margin: 0px auto;
			border:1px solid #333;
			/*父元素可以用text-align属性设置子元素水平对齐方式*/
			text-align: center;
			/*用line-height属性值设置垂直对齐方式*/
			line-height: 200px;
			overflow: hidden;
			/*2、将内联元素的父级设置font-size为0,内联元素自身再设置font-size*/
			/*font-size: 0;*/
		}
		.box a{
			background-color: gold;
			font-size: 16px;
			text-decoration: none;
			/*试试转变行内块*/
			/*display: inline-block;*/
		}

		.demo1{
	</style>
</head>
<body>
	<div class="box">
		<!-- 如何去掉内联块元素的间隙 -->
		<!-- /*1、去掉内联元素之间的换行*/ -->
		<a href="#">这是第1个aaaaaa标签</a><a href="#">这是第1个a标签</a>
		<a href="#">这是第1个a标签</a>
		<a href="#">这是第1个a标签</a>
		<a href="#">这是第1个a标签</a>
 
	</div>

</body>
</html>

解决方法:

1、去掉子元素之间的换行

2、将父级元素设置font-size=0,子元素设置font-size

3、子元素浮动也可以去掉间隙,浮动可以让行内元素或者块元素转行成行内块元素,跟display: inline-block转化不同的是 不会因为换行产生间隙

四、浮动

在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动。

清除浮动方法

方法一:使用带clear属性的空元素

在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用<br class="clear" />或<hr class="clear" />来进行清理。

.news {
  background-color: gray;
  border: solid 1px black;
  }

.news img {
  float: left;
  }

.news p {
  float: right;
  }

.clear {
  clear: both;
  }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
<div class="clear"></div>
</div>

优点:简单,代码少,浏览器兼容性好。
缺点:需要添加大量无语义的html元素,代码不够优雅,后期不容易维护。

方法二:使用CSS的overflow属性

给浮动元素的容器添加overflow:hidden;overflow:auto;可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1。在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。

.news {
  background-color: gray;
  border: solid 1px black;
  overflow: hidden;
  *zoom: 1;
  }

.news img {
  float: left;
  }

.news p {
  float: right;
  }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
</div>

方法三:给浮动的元素的容器添加浮动

给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

方法四:使用邻接元素处理

什么都不做,给浮动元素后面的元素添加clear属性。

.news {
  background-color: gray;
  border: solid 1px black;
  }

.news img {
  float: left;
  }

.news p {
  float: right;
  }

.content{
  clear:both;
  }

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
<div class="content">***</div>
</div>

注意这里的div.content有内容。其实这种方法跟方法一类似

方法五:使用CSS的:after伪元素

结合 :after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout。
给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。

.news {
  background-color: gray;
  border: solid 1px black;
  }

.news img {
  float: left;
  }

.news p {
  float: right;
  }

.clearfix:after{
  content: ""; 
  display: table; 
  clear: both; 
  }

.clearfix {
  /* 触发 hasLayout */ 
  zoom: 1; 
  }

<div class="news clearfix">
<img src="news-pic.jpg" />
<p>some text</p>
</div>

通过CSS伪元素在容器的内部元素最后添加了一个看不见的空格,并且赋予clear属性来清除浮动。需要注意的是为了IE6和IE7浏览器,要给clearfix这个class添加一条zoom:1;触发haslayout。

总结

通过上面的例子,我们不难发现清除浮动的方法可以分成两类:

一是利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素,其实利用 :after 伪元素的方法也是在元素末尾添加一个内容为一个点并带有 clear: both 属性的元素实现的。

二是触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使到该父元素可以包含浮动元素,关于这一点。

在网页主要布局时使用:after伪元素方法并作为主要清理浮动方式;

在小模块如ul里使用overflow:hidden;(留意可能产生的隐藏溢出元素问题);

如果本身就是浮动元素则可自动清除内部浮动,无需格外处理;

正文中使用邻接元素清理之前的浮动。

建议使用相对完美的:after伪元素方法清理浮动,文档结构更加清晰。

 

结合前面的maring塌陷,约定俗成的产生了一个成熟的样式类,clearfix

.clearfix:after,.clearfix:before{ content: "";display: table;}
.clearfix:after{ clear:both;}
.clearfix{zoom:1;}

暂时就记录这么多吧,以后再补充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章