精通 CSS 第 7 章学习笔记(上)
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精通 CSS 第 7 章学习笔记(上)相关的知识,希望对你有一定的参考价值。
精通 CSS 第 7 章学习笔记(上)
「精通 CSS 高级 Web 标准解决方案(第三版)」中 7.1 和 7.2,布局规划 与 创造灵活的页面布局的内容总结和案例学习
以浮动模式为基础,进行渐进增强(向上兼容),添加 flexbox 进行页面优化
布局规划
开始实现页面的具体布局之前,总归是要做一些基础规划的。
在 学成在线-静态页面终结版 中的反思部分也提到了,就是做到后面之后才发现很多页面的布局规划都是可以提取出来的,而一旦提取出来了,就也不会发生很多代码重复的问题了。
布局辅助类
一些最为简单的样式可以抽离出来,例如说:
.container {
width: 1280px;
}
.flex {
display: flex;
}
伴随着实现的功能越来越多,就能发现重复的样式也越来越多。这个时候就可以做一些样式的抽离:
.something,
.other-thing,
.another-thing {
/* 通用样式 */
}
前者只能实现一些简单的布局,后者则是会在代码量较为复杂的时候引起样分离上的难题。更多的实践,书中说第 12 章会有更加详细的分析。
使用现成的框架
优势就在于可以快速的实现一个 prototype,一个完善的 CSS 框架应该是具备了大多数需要的功能。
缺点也在于,因为要兼容大量的功能,因此总会出现多余且用不上的样式。
固定、流动、弹性
-
固定
页面具有固定的宽度,例如说现在经常使用的 1280px。
例如说 CSDN 的页面,布局就用了固定的宽度:
.AppConsole .container { width: 1208px; margin: 0 auto; }
-
弹性
指布局尺寸使用 em 单位,这样,即使文本大小被缩放,布局的比例依然不会变
-
流动
指页面会随着比例缩放,但元素与元素之间的比例——有时候连元素之间的比例也——保持不变
固定布局仍然是用得最多的,但是对于访问者不太友好,也无法适应多种设备和屏幕尺寸。
尽管 「精通 CSS 高级 Web 标准解决方案(第三版)」 的作者推荐使用流动布局,但是真的要说的话,主流网站,使用流动布局还是比较少的。CSDN、京东、淘宝、小米有品都选择了用固定布局的方式,由此也能看出,流动布局对于开发者的挑战性还是比较高的。
灵活的页面布局
这一个部分主要是案例,先使用 float 布局完成一个基础,再使用 flexbox 对其升级。
最终版的效果如下:
float 完成的基础布局
这个效果图的实现应该来说还是比较简单的了,已知导航栏有四个内容,那么就可以设置导航栏的宽度为 25%。在之前的布局中,或许会直接用 nav > li {width: 25%; }
这样的做法,但是,这里有能够明确地看到其他的布局也占用了其父元素的 25%。
可复用的做法有两种:
-
定义 col 的宽度为 25%,随后将 col 加入到每个子组件中
大部分的实现应该都是这样的,书中偏好的是下面的选项,因为下面的选项要覆写会简单一些,所以也可以加入其他的类名到子元素进行适配
-
使用
class-name > * { width: 25%; }
去设定父组件中的子组件元素为 25%,因为继承的权重为 0,所以可以轻松的被覆写
* {
margin: 0;
padding: 0;
}
li {
list-style: none;
}
a {
text-decoration: none;
}
body {
line-height: 1.375;
font-family: Georgia, Times New Roman, Times, serif;
}
.wrapper {
width: 95%;
max-width: 76em;
margin: 0 auto;
}
.clearfix::after,
.clearfix::before {
content: "";
display: block;
}
.clearfix::after {
clear: both;
}
.col {
float: left;
box-sizing: border-box;
min-height: 100px;
outline: 1px solid #000;
}
/* 不太适合根据屏幕动态地调整大小 */
.col-lof4 {
width: 25%;
}
.col-lof2 {
width: 50%;
}
/* 比 .col-lof 更加合适一点的配方 */
.row-quartet > * {
width: 25%;
}
.row-trio > * {
width: 33.3333%;
}
.masthead {
background-color: #8e3339;
}
.masthead h1 {
margin: 0;
padding: 0.5em 0;
color: #fff;
}
.navbar {
background-color: #5e2126;
margin-bottom: 1.375em;
}
.navlist {
background-color: #752a2f;
}
.navlist li {
float: left;
text-transform: uppercase;
text-align: center;
box-sizing: border-box;
}
.navlist li a {
display: block;
line-height: 1.75em;
padding: 1em 2em;
color: #fff;
}
.subcategory-featured {
width: 50%;
}
.subcategory-content {
width: 80%;
}
.subcategory-header {
width: 20%;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="./index.css" />
</head>
<body>
<header class="masthead">
<div class="wrapper"><h1>Important News</h1></div>
</header>
<nav class="navbar" role="navigation">
<div class="wrapper">
<ul class="navlist clearfix row-quartet">
<li><a href="#">HOME</a></li>
<li><a href="#">WORLD</a></li>
<li><a href="#">LOCAL</a></li>
<li><a href="#">SPORTS</a></li>
</ul>
</div>
</nav>
<main class="wrapper">
<section class="subcategory">
<div class="row">
<header class="col subcategory-header">
<h2>Sub-section 1</h2>
</header>
<div class="col subcategory-content">
<div class="row row-quartet">
<div class="col subcategory-featured">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
</div>
<div class="row row-quartet">
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
</div>
</div>
</div>
</section>
<section class="subcategory">
<div class="row">
<header class="col subcategory-header">
<h2>Sub-section 1</h2>
</header>
<div class="col subcategory-content">
<div class="row row-trio">
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
<div class="col">
<h3>Story</h3>
</div>
</div>
</div>
</div>
</section>
</main>
</body>
</html>
将 Story 这个 placeholder 换成文章的假数据。
下图是内容填充完毕后的效果图和源码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="./index.css" />
</head>
<body>
<header class="masthead">
<div class="wrapper"><h1>Important News</h1></div>
</header>
<nav class="navbar" role="navigation">
<div class="wrapper">
<ul class="navlist clearfix row-quartet">
<li><a href="#">HOME</a></li>
<li><a href="#">WORLD</a></li>
<li><a href="#">LOCAL</a></li>
<li><a href="#">SPORTS</a></li>
</ul>
</div>
</nav>
<main class="wrapper">
<section class="subcategory">
<div class="row">
<header class="col subcategory-header">
<h2>Lorem ipsum</h2>
</header>
<div class="col subcategory-content">
<div class="row row-quartet">
<div class="col subcategory-featured">
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image" />
<h3><a href="#">Cras suscipit nec leo id.</a></h3>
<p>
Autem repudiandae aliquid tempora quos reprehenderit
architecto, sequi repellat.
</p>
</article>
</div>
<div class="col">
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image" />
<h3><a href="#">Perferendis, ipsam!</a></h3>
<p>
Neque magnam vero obcaecati facere nobis sint dolore
accusamus vitae consequuntur ad necessitatibus, laborum
molestiae.
</p>
</article>
</div>
<div class="col">
<article class="story">
<img src="http://placehold.it/600x300" alt="Dummy image" />
<h3><a href="#">Perferendis, ipsam!</a></h3>
<p>
Neque magnam vero obcaecati facere nobis sint dolore
accusamus vitae consequuntur ad necessitatibus, laborum
molestiae.
</p>
</article>
</div>
</div>
<div class="row row-quartet">
<div class="col">
<article class="story">
<h3><a href="#">Perferendis, ipsam!</a></h3>
<p精通 CSS 第 8 章 响应式布局 学习案例