应用案例

1、学成在线案例(四、CSS 浮动)

页面展示:

学成在线,是典型的企业级网站。

学习学成网的目的,是为了整体感知企业级网站布局流程,带着大家复习以前的知识。

5.1 准备素材和工具

  • 学成在线PSD源文件
  • 开发工具 = PS(切图) + sublime(代码) + chrome(测试)

5.2 结构与样式分离

先把我们的前期准备工作做好, 我们本次采取结构与样式相分离思想。

  1. 创建 study 目录文件夹 (用于存放我们这个页面的相关内容)。

  2. 用vscode打开study目录文件夹.

  3. study 目录内新建 images 文件夹,用于保存图片。

  4. 新建首页文件 index.html(以后我们的网站首页统一命名规定为 index.html )。

  5. 新建 style.css 样式文件。我们本次采用外链样式表。

  6. 将样式引入到我们的 HTML 页面文件中。

  7. 样式表写入清除内外边距的样式,来检测样式表是否引入成功。

5.3 页面布局整体思路

为了提高网页制作的效率,布局时通常有以下的整体思路,具体如下:

​ 1.必须确定页面的版心(可视区),我们测量可得知。

​ 2.分析页面中的行模块,以及每个行模块中的列模块。其实页面布局第一准则.

​ 3.一行中的列模块经常浮动布局, 先确定每个列的大小,之后确定列的位置. 页面布局第二准则

​ 4.制作 HTML 结构。我们还是遵循,先有结构,后有样式的原则。结构永远最重要.

​ 5.所以, 先理清楚布局结构,再写代码尤为重要. 这需要我们多写多积累.

5.4 CSS 属性书写顺序(重点)

  1. 布局定位属性
  2. 自身属性
  3. 文本属性
  4. 其他属性

5.5 页面制作

确定版心

​ 这个页面的版心是 1200像素 ,每个版心都要水平居中对齐,所以,我们可以定义版心为公共类:

1
2
3
4
.w {
width: 1200px;
margin: auto;
}

5.5.1 header头部制作

结构图如下:

  • 1号是版心盒子 header 1200 * 42 的盒子水平居中对齐, 上下给一个margin值就好了。
  • 版心盒子 里面包含 2号盒子 logo 图标
  • 版心盒子 里面包含 3号盒子 nav 导航栏
  • 版心盒子 里面包含 4号盒子 search 搜索框
  • 版心盒子 里面包含 5号盒子 user 个人信息
  • 注意,要求里面的 4个子盒子 必须都浮动

导航栏注意点:

实际开发中,重要的导航栏,我们不会直接用链接a ,而是用 li 包含链接(li+a)的做法

​ 1.li+a 语义更清晰,一看这就是有条理的列表型内容。

​ 2.如果直接用a,搜索引擎容易辨别为有堆砌关键字嫌疑(故意堆砌关键字容易被搜索引擎有降权的风险),从而影响网站排名

注意:

​ 1.让导航栏一行显示, 给 li 加浮动, 因为 li 是块级元素, 需要一行显示.

​ 2.这个nav导航栏可以不给宽度,将来可以继续添加其余文字

​ 3.因为导航栏里面文字不一样多,所以最好给链接 a 左右padding 撑开盒子,而不是指定宽度

4号盒子search的细节:

​ search 搜索框的意思: 一个 search 大盒子里面包含 2个 表单

​ 技巧:input和button都,属于行内块元素,会有缝隙,使用浮动,可以去缝隙。

5.5.2 banner制作

结构图如下:

  • 1号盒子是通栏的大盒子banner, 不给宽度,给高度,给一个蓝色背景。
  • 2号盒子是版心 w, 要水平居中对齐。
  • 3号盒子版心内,左对齐 subnav 侧导航栏。
  • 4号盒子版心内,右对齐 course 课程。

  • subnav 盒子 背景色 黑色半透明
  • 重要的导航栏,li 包 a ,行高45px
  • a里面包含文字和span,span右浮动
  • 当鼠标经过a ,a里面的内容(文字和span)变蓝色
5.5.2.2 course课程表模块 (右侧的)

结构图如下:

  • 1号盒子 是 228 * 300 的盒子 右浮动 注意 浮动的元素 不会有外边距塌陷的问题
  • 1号盒子内 分为 上下 两个 子盒子
  • 2号子盒子是 上部分 我们命名为 course-hd (hd 是 head 的简写 头部的意思,我们经常用)
  • 3号子盒子是 下部分 我们命名为 course-bd (bd 是 body 的简写 主体的意思,我们经常用)

5.5.3 精品推荐小模块

结构图如下:

  • 复习点: 因为里面三个盒子都要垂直居中,我们利用 继承性,给 最大的盒子 一个垂直居中的代码就好了,还记得 那些 样式可以继承吗??? font- line- text- color

  • 大盒子水平居中 goods 精品 ,注意此处有个盒子阴影

  • 1号盒子是标题 H3 左侧浮动

  • 2号盒子 里面放链接 左侧浮动 goods-item 距离可以控制链接的 左右外边距(注意行内元素只给左右内外边距)

  • 3号盒子 右浮动 mod 修改

5.5.4 精品推荐大模块

结构图如下:

  • 1号盒子为最大的盒子 box 版心水平居中对齐
  • 2号盒子为上面部分 box-hd -- 里面 左侧标题H3 左浮动 右侧 链接 a 右浮动
  • 3号盒子为底下部分 box-bd --- 里面是无序列表 有 10个 小li 组成
  • 小li 外边距的问题, 这里有个小技巧。 给box-hd 宽度为 1215 就可以一行装开5个 li了
  • 复习点:我们用到清除浮动,因为 box-hd 里面的盒子个数不一定是多少,所以我们就不给高度了,但是里面的盒子浮动会影响下面的布局,因此需要清除浮动。

5.5.5 底部模块制作

结构图如下:

  • 1号盒子通栏大盒子 底部 footer 给高度 底色是白色

  • 2号盒子版心水平居中

  • 3号盒子版权 copyright 左对齐

  • 4号盒子 链接组 links 右对齐

2、综合案例:学成在线-hot 模块添加(五、定位)

2. 1 案例截图

2.2 案例分析

  1. 一个大的 li 中包含 一个课程图片,课程介绍文字信息,还有hot的小图标;
  2. hot图片重叠在课程图片上面—— 脱标,不占位置,需要使用绝对定位
  3. hot图片重叠li的右上方 —— 需要使用边偏移确定准确位置。

2.3 案例小结

  1. 子绝父相 —— 子元素使用绝对定位父元素使用相对定位
  2. 与浮动的对比
    • 绝对定位:脱标,利用边偏移指定准确位置
    • 浮动:脱标,不能指定准确位置,让多个块级元素在一行显示

课堂练习:模拟老师的随堂案例完成哈根达斯案例(5 分钟)。

结构修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 修改.box-bd里面的li标签内容,添加一个hot图标 -->

<li>
<!-- 添加hot小图片 -->
<em>
<img src="images/hot.png" alt="">
</em>
<img src="images/pic.png" alt="">
<h4>
Think PHP 5.0 博客系统实战项目演练
</h4>
<div class="info">
<span>高级</span> • 1125人在学习
</div>
</li>

样式修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.box-bd ul li {
/* 子绝父相 */
/* 父元素相对定位 */
position: relative;
float: left;
width: 228px;
height: 270px;
background-color: #fff;
margin-right: 15px;
margin-bottom: 15px;

}
.box-bd ul li > img {
width: 100%;
}
.box-bd ul li h4 {
margin: 20px 20px 20px 25px;
font-size: 14px;
color: #050505;
font-weight: 400;
}
.box-bd ul li em {
/* 子元素绝对定位 */
position: absolute;
top: 4px;
right: -4px;
}

3、 综合案例 - 淘宝轮播图(五、定位)

5.1 效果图

5.2 布局分析

5.3 步骤

  1. 大盒子我们类名为: tb-promo 淘宝广告

  2. 里面先放一张图片。

  3. 左右两个按钮 用链接就好了。 左箭头 prev 右箭头 next

    ​ 左按钮样式(border-radius:左上,右上,右下,左下),

    ​ 右按钮定位,提取左右按钮共同的样式代码(并集选择器)

  4. 底侧小圆点ul 继续做。 类名为 promo-nav

    ​ 中间长方形椭圆 ul的定位(水平居中,离底部15px)

    ​ 长方形需要五个小圆点,ul无序列表,li浮动,椭圆中小圆点的样式

5.4 知识点:圆角矩形设置4个角

圆角矩形可以为4个角分别设置圆度, 但是是有顺序的

1
2
3
4
border-top-left-radius:20px;
border-top-right-radius:20px;
border-bottom-right-radius:20px;
border-bottom-left-radius:20px;
  • 如果4个角,数值相同

    1
    border-radius: 15px;
  • 里面数值不同,我们也可以按照简写的形式,具体格式如下:

1
border-radius: 左上角 右上角  右下角  左下角;

还是遵循的顺时针。

5.5 代码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>淘宝轮播图做法</title>
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}

.tb-promo {
position: relative;
width: 520px;
height: 280px;
background-color: pink;
margin: 100px auto;
}

.tb-promo img {
width: 520px;
height: 280px;
}

/* 并集选择器可以集体声明相同的样式 */
.prev,
.next {
position: absolute;
/* 绝对定位的盒子垂直居中 */
top: 50%;
margin-top: -15px;
/* 加了绝对定位的盒子可以直接设置高度和宽度 */
width: 20px;
height: 30px;
background: rgba(0, 0, 0, .3);
text-align: center;
line-height: 30px;
color: #fff;
text-decoration: none;
}

.prev {
left: 0;
/* border-radius: 15px; */
border-top-right-radius: 15px;
border-bottom-right-radius: 15px;
}

.next {
/* 如果一个盒子既有left属性也有right属性,则默认会执行 left属性 同理 top bottom 会执行 top */
right: 0;
/* border-radius: 15px; */
border-top-left-radius: 15px;
border-bottom-left-radius: 15px;
}
.promo-nav {
position: absolute;
bottom: 15px;
left: 50%;
margin-left: -35px;
width: 70px;
height: 13px;
/* background-color: pink; */
background: rgba(255,255,255, .3);
border-radius: 7px;
}
.promo-nav li {
float: left;
width: 8px;
height: 8px;
background-color: #fff;
border-radius: 50%;
margin: 3px;
}
/* 不要忘记选择器权重的问题 */
.promo-nav .selected {
background-color: #ff5000;
}
</style>
</head>

<body>
<div class="tb-promo">
<img src="images/tb.jpg" alt="">
<!-- 左侧按钮箭头 -->
<a href="#" class="prev"> &lt; </a>
<!-- 右侧按钮箭头 -->
<a href="#" class="next"> &gt; </a>
<!-- 小圆点 -->
<ul class="promo-nav">
<li class="selected"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
</body>

</html>

4、 综合案例:土豆网鼠标经过显示遮罩(五、定位)

8.1. 效果图

8.2. 案例目标

1.练习元素的显示与隐藏

2.练习元素的定位

8.3. 核心原理

原先半透明的黑色遮罩看不见, 鼠标经过 大盒子,就显示出来。

遮罩的盒子不占有位置, 就需要用绝对定位 和 display 配合使用。

8.4. 代码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>仿土豆网显示隐藏遮罩案例</title>
<style>
.tudou {
position: relative;
width: 444px;
height: 320px;
background-color: pink;
margin: 30px auto;
}

.tudou img {
width: 100%;
height: 100%;
}

.mask {
/* 隐藏遮罩层 */
display: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .4) url(images/arr.png) no-repeat center;
}

/* 当我们鼠标经过了 土豆这个盒子,就让里面遮罩层显示出来 */
.tudou:hover .mask {
/* 而是显示元素 */
display: block;
}
</style>
</head>

<body>
<div class="tudou">
<div class="mask"></div>
<img src="images/tudou.jpg" alt="">
</div>
<div class="tudou">
<div class="mask"></div>
<img src="images/tudou.jpg" alt="">
</div>
<div class="tudou">
<div class="mask"></div>
<img src="images/tudou.jpg" alt="">
</div>
<div class="tudou">
<div class="mask"></div>
<img src="images/tudou.jpg" alt="">
</div>
</body>

</html>