一、高度塌陷问题
解决方案
1、给父元素设置高度
不足:如果子元素大于父元素,则会溢出。
2、 给父元素设置清除浮动,运用overflow属性
3、 使用空标签
(1) <div style=”clear:both”></div>
(2) <div class=”box”></div>
<style>
.box{
clear:both;
}
</style>
不足:出现多余代码,代码累积。
4、 通过 after 伪类,在父元素后面添加
例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>高度塌陷</title>
<style>
.box1{
height: 300px;/*方案一*/
border: 10px solid red;
overflow: hidden; /*方案二:设置清除浮动*/
}
.box2{
width: 100px;
height: 300px;
background-color: #33CCFF;
float: left;
}
.box3{
width: 100px;
height: 300px;
background-color: #33CCFF;
}
/*方案四:通过after伪类*/
.box1:after{
content:"asd"; /*内容*/
display: block; /*将行内元素变为块级元素*/
clear:both; /*清除浮动*/
}
</style>
</head>
<body>
<div class="box1">
<div class="box2">box2</div>
<div style="clear:both"></div> <!--方案三:设置空标签-->
</div>
<div class="box3">box3</div>
</body>
</html>
二、定位
什么是 定位:是将指定元素摆放到页面的任意位置。
(通过定位可以任意的摆放元素)
通过 position 属性来定位元素的
(一)相对定位(relative)
1、定义与运用
开启元素定位时( position 的属性值是一个 非 static 的值)
这个时候,可以通过left、right、top、bottom四个属性来设置元素的偏移量。
left: 元素相对于其定位位置的 左 侧偏移量
right: 元素相对于其定位位置的 右 侧偏移量
top: 元素相对于其定位位置的 上 侧偏移量
bottom: 元素相对于其定位位置的 下 侧偏移量
2、特点
元素的 position 属性位置设置为 relative 时,则开启了元素的相对定位
(1)当开启了元素的相对定位时,如果不设置偏移量,元素不发生任何变化。
(2)相对定位是相对于元素在文档流中原来的位置进行定位的。
(3)相对定位可以使我们的元素提升一个层级,即可以覆盖。
(4)相对定位不会让元素脱离文档流。
3、margin 与相对定位的对比
(1)通过 margin 来实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>相对定位</title>
<style type="text/css">
.box1,.box2,.box3,.box4{
width: 100px;
height: 100px;
border: 5px solid #000000;
background-color: #bfa;
}
/*通过 margin 实现 box2 的移动太麻烦,还会牵扯到 box3 的位置变换,不方便*/
.box2{
margin-left: 100px;
margin-top: 100px;
}
.box3{
margin-top: -100px;
}
.box4{
margin-left: 105px;
margin-bottom: 110px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
<div class="box4">box4</div>
</body>
</html>
(2)通过 相对定位 来实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>相对定位</title>
<style type="text/css">
.box1,.box2,.box3,.box4{
width: 100px;
height: 100px;
border: 5px solid #000000;
background-color: #bfa;
}
.box3{
position: relative;
top: -100px;
}
.box2{
position: relative;
left:200px;
top: -110px; /*对比坐标轴来理解,原本是距下边往上移动100px,本应写作 bottom,但可以用top的负值来表示
,两者是等价的。这里写成 110px 是因为有边框*/
}
.box4{
position: relative;
left:105px;
bottom: 110px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
<div class="box4">box4</div>
</body>
</html>
4、小练习
代码即上面比较中的代码
结果:
(二)绝对定位(absolute)
1、特点
当我们 position 属性设置为 absolute 时,开启了绝对定位
(1)当开启绝对定位时,会使元素脱离文档流
(2)开启绝对定位后,如果不设置偏移量,元素的位置不会发生变化
(3)开启绝对定位后,元素提升一个层级
(4)绝对定位是相当于离他最近的开启了定位的祖先元素进行定位的。 如果其祖先元素没有开启相对定位,则会相当于浏览器窗口进行定位。
(5)绝对定位会改变元素的属性,即行内元素可以变成块级元素。
2、小练习
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>绝对定位</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.box1,.box2,.box3,.box4{
width: 100px;
height: 100px;
border: 5px solid #000000;
background-color: #bfa;
}
.main1{
position: relative;
}
.box3{
position: absolute;
top: 110px;
width: 200px;
height: 200px;
background-color: #7cb4ed;
}
.main{
position: relative;
}
.box2{
position: absolute;
left: 220px;
bottom: 0px;
}
.box4{
position: absolute;
left: 105px;
top: 220px;
}
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="main">
<div class="box2">box2</div>
</div>
<div class="main1">
<div class="box3">box3</div>
</div>
<div class="box4">box4</div>
</body>
</html>
效果如下:
注意: 一般情况下,开启的元素的绝对定位,都会同时开启父元素的相对定位。
(三)固定定位(fixed)
1、特点
当元素的 position 属性设置为 fixed 时候,则开启了元素的固定定位
(1)固定定位也是一种绝对定位,它的大部分特点和绝对定位一样
(2)不同的是:
a. 固定定位 永远 是相对于 浏览器 窗口进行定位的。
b.固定定位会 固定 在浏览器的某一个位置,不会随滚动条滚动。
三、导航栏
(一)一级导航
实例一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>一级导航</title>
<style text="text/css">
*{
margin: 0;
padding: 0; /*消除浏览器默认的内外边距*/
}
.nav{
width: 1000px;
list-style: none;
margin: 50px auto 0;
overflow: hidden;
}
.nav li{
float: left;
width: 25%; /*占一整列(1000px)的1/4 ,不建议用250px表示,因为一旦列表宽度发生变化,布局就会混乱*/
}
.nav a{
display: block; /*将行内元素变为块级元素*/
color: white;
width: 100%;
text-align: center;
background-color: #246aee;
padding: 5px 0;
text-decoration: none;
font-weight: bold;
}
.nav a:hover{
background-color: crimson;
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="#">首页</a></li>
<li><a href="#">新闻</a></li>
<li><a href="#">练习</a></li>
<li><a href="#">关于</a></li>
</ul>
</body>
</html>
效果如下:
实例二:项目升级
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>一级导航</title>
<style text="text/css">
*{
margin: 0;
padding: 0;
}
.nav{
width: 1000px;
list-style: none;
margin: 50px auto 0;
overflow: hidden;
}
.nav li{
float: left;
width: 25%; /*占一整列(1000px)的1/4 ,不建议用250px表示,因为一旦列表宽度发生变化,布局就会混乱*/
}
.nav a{
display: block; /*将行内元素变为块级元素*/
color: white;
width: 100%;
text-align: center;
background-color: #246aee;
padding: 5px 0;
text-decoration: none;
font-weight: bold;
}
.nav a:hover{
background-color: crimson;
}
.nav1{
width: 1000px;
list-style: none;
margin: 0px auto;
overflow: hidden;
}
.nav1 li{
float: left;
width: 25%; /*占一整列(1000px)的1/4 ,不建议用250px表示,因为一旦列表宽度发生变化,布局就会混乱*/
}
.nav1 a{
display: block; /*将行内元素变为块级元素*/
color: white;
width: 100%;
text-align: center;
background-color: #246aee;
padding: 5px 0;
text-decoration: none;
font-weight: bold;
}
.nav1 a:hover{
background-color: crimson;
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="#">首页</a></li>
<li><a href="#">新闻</a></li>
<li><a href="#">练习</a></li>
<li><a href="#">关于</a></li>
</ul>
<ul class="nav1">
<li><a href="#">首页</a></li>
<li><a href="#">新闻</a></li>
<li><a href="#">练习</a></li>
<li><a href="#">关于</a></li>
</ul>
</body>
</html>
效果如下:
(二)二级导航
实例一:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>二级菜单</title>
<style type="text/css">
.nav{
list-style: none;
background-color: #c5cce5;
width: 1000px;
margin: 50px auto 0; /*列表距离浏览器上方 50px,左右居中*/
}
/*.nav:after{*/
/*content: "";*/
/*display: block;*/
/*clear: both;*/
/*}*/
.nav li{
width: 20%; /* 每个 li 占整个列表的五分之一,这种表达方式即使把列表的宽度改变,它也会按比例分配*/
float: left; /*使列表下的五个大的 li 向左浮动*/
/*position: relative;*/
}
.nav li a{
display: block;
color: #1833ee;
font-weight: bold; /*字体加粗*/
width: 100%; /*占每个 li 的全部,每个 li 又是列表的 1/5*/
padding: 10px;
text-decoration: none;
background-color: #c9c7cc;
text-align: center; /*字体居中*/
}
.nav li a:hover{
background-color: #b8ee28;
color:#FF9600;
}
.nav2 li{
float: none; /* 控制每个 小列表下的 li 不受大列表 .nav li 向左浮动的影响,取消向左浮动*/
}
.nav2{
list-style: none; /*取消列表的形式*/
display: none;
}
.nav2 li a{
width: 200px;
background-color: #FF9600;
margin: 2px;
}
.nav li:hover .nav2{
display: block; /*当鼠标滑动至大列表 li 上时,二级菜单 nav2 显示*/
/*position: absolute;*/
/*top: 40px;*/
/*left: 0px;*/
}
.nav3 li{
float: none;
}
.nav3{
list-style: none;
display: none;
}
.nav3 li a{
width: 200px;
background-color: #FF9600;
margin: 2px;
}
.nav li:hover .nav3{
display: block;
/*position: absolute;*/
/*top: 40px;*/
/*left: 0px;*/
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="#">首页</a></li>
<li><a href="#">课程大厅</a>
<ul class="nav2">
<li><a href="#">java</a></li>
<li><a href="#">jquery</a></li>
<li><a href="#">js</a></li>
</ul>
</li>
<li><a href="#">学习中心</a>
<ul class="nav3">
<li><a href="#">java</a></li>
<li><a href="#">jquery</a></li>
<li><a href="#">js</a></li>
</ul>
</li>
<li><a href="#">关于我们</a></li>
<li><a href="#">练习</a></li>
</ul>
</body>
</html>
效果如下:
实例二:项目升级(综合练习)
不成熟的书写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>中英文变换</title>
<style>
.nav{
list-style: none;
background-color: #c5cce5;
width: 500px;
margin: 40px auto 0;
}
.nav li{
width: 20%;
float: left;
overflow: hidden; /*清除浮动——控制鼠标放上去之后会显示多余中文字部分*/
}
.nav li a{
display:block;
color: black;
text-decoration: none;
background-color: #c5cce5;
text-align: center;
}
.nav li span{
display: none; /*暂时隐藏 span 的内容*/
}
.nav li a:hover{
color: white;
background-color: red; /*当鼠标滑动到 a 标签上面时 显示的字体颜色、背景颜色*/
margin-top: -20px; /*当 鼠标移至 a 标签上时,这一行为可以使英文字覆盖中文字,即改变a 标签中文字的位置
,与英文字重叠,达到效果*/
}
.nav a:hover span{
display: block; /*当鼠标滑动至 a 标签上时 span 的内容显示,此时显示是紧接在中文字下方的 */
}
p{
position: relative; /* 相对定位 —— 元素相对于原来的位置进行定位——控制红条的位置*/
top: 22px;
width: 550px;
border: 6px solid red;
left: 20px;
margin: auto;
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="#">首页<span>Home</span></a></li>
<li><a href="#">课程大厅<span>Course</span></a></li>
<li><a href="#">学习中心<span>Learning</span></a></li>
<li><a href="#">关于我们<span>About</span></a></li>
<li><a href="#">练习<span>Exercise</span></a></li>
</ul>
<p></p>
</body>
</html>
效果如下:
注意: 最下面的红线,可以通过建立一个空的 p 标签,然后增加他的宽度 border 即可实现。