1. CSS盒子模型(Box Model)
盒子模型是指所有HTML元素都可以看成是一个盒子,它包括:Margin(边距),边框(Border),填充(Padding)和实际内容(Content)。
SWT和JavaFX也是这样设计的,我估计大部分GUI开发,都是这样字设计控件的。
1.1 元素的宽度和高度
当指定一个 CSS 元素的width和height属性时,只是设置内容区域的宽度和高度。元素的真实宽度和高度还包括:Margin,Border和Padding。例如:
div {
width: 300px;
border: 25px solid green;
padding: 25px;
margin: 25px;
}
元素实际占用宽度是:300 (content) + 50 (left, right margin) + 50 (left, right border) + 50 (left, right padding) = 450px
公式:
- 元素总宽度 = 宽度 + 左填充 + 右填充 + 左边框 + 右边框 + 左边距 + 右边距
- 元素总高度 = 高度 + 顶部填充 + 底部填充 + 上边框 + 下边框 + 上边距 + 下边距
2. CSS布局
通常一个网页分为一下几个部分:
2.1 HTML内容
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>练习网页布局</title>
<link rel="stylesheet" href="mystyle.css">
</head>
<body>
<header>
<h1>我的网页</h1>
</header>
<nav>
<a href="#">链接1</a>
<a href="#">链接2</a>
<a href="#">链接3</a>
<a href="#">链接4</a>
</nav>
<div class="row">
<main>
<article>
<h2>文章标题1</h2>
<h5>2021年10月17日</h5>
<div class="fakeimg" style="height:200px;">图片</div>
<p>一些文本...</p>
</article>
<article>
<h2>文章标题2</h2>
<h5>2021年10月17日</h5>
<div class="fakeimg" style="height:200px;">图片</div>
<p>一些文本...</p>
</article>
</main>
<aside>
<section>
<h2>关于我</h2>
<div class="fakeimg" style="height:100px;">图片</div>
<p>关于我的一些信息..</p>
</section>
<section>
<h3>热门文章</h3>
<div class="fakeimg">
<p>图片</p>
</div>
<div class="fakeimg">
<p>图片</p>
</div>
<div class="fakeimg">
<p>图片</p>
</div>
</section>
<section>
<h3>关注我</h3>
<p>一些文本...</p>
</section>
</aside>
</div>
<footer>
<h2>底部区域</h2>
</div>
</body>
</html>
2.2 设置CSS样式
设置具体元素样式前,先设置一下基础属性。
“box-sizing: border-box”,是指为元素指定的width和height,即是整个元素的宽度和高度。即元素的margin, border和padding都是在指定的width和height里绘制,content的宽度和高度是计算出来了。
- content宽度:width – 左右margin – 左右border – 左右padding
- content高度:height – 上下margin – 上下border – 上下padding
当需要将两个元素并列放置时,便可使用该属性,例如该例中的main和aside。
clear 属性规定元素的哪一侧不允许其他浮动元素。
- left:在左侧不允许浮动元素。
- right:在右侧不允许浮动元素。
- both:在左右两侧均不允许浮动元素。
- none:默认值。允许浮动元素出现在两侧。
”.row:after“ 定义当前元素占一行,后面的元素(<footer>)显示在下面。
main, aside {
box-sizing: border-box;
}
body {
font-family: Arial;
padding: 10px;
background: #f1f1f1;
}
/* 列后面清除浮动 */
.row:after {
content: "";
display: block;
clear: both;
}
2.2.1 Header
header {
background-color: #F1F1F1;
text-align: center;
padding: 20px;
}
2.2.2 Navigation Bar
/* 导航条 */
nav {
overflow: hidden;
background-color: #333;
}
/* 导航链接 */
nav a {
float: left;
display: block;
color: #f2f2f2;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
/* 链接 - 修改颜色 */
nav a:hover {
background-color: #ddd;
color: black;
}
2.2.3 Main Content和Sidebar
“Main Content”显示在左边,占75%宽度;侧边栏显示在右边,占25%宽度。
/* 图像部分 */
.fakeimg {
background-color: #aaa;
width: 100% – 20px;
padding: 20px;
}
main {
float: left;
width: 75%;
}
aside {
float: left;
width: 25%;
background-color: #f1f1f1;
padding-left: 20px;
}
/* 文章卡片效果 */
article, section {
background-color: white;
padding: 20px;
margin-top: 20px;
}
2.2.4 Footer
/* 底部 */
footer {
padding: 20px;
text-align: center;
background: #ddd;
margin-top: 20px;
}
2.2.5 响应式小屏布局
/* 响应式布局 - 屏幕尺寸小于 800px 时,aside显示在main的下面 */
@media screen and (max-width: 800px) {
main, aside {
width: 100%;
padding: 0;
}
}
/* 响应式布局 -屏幕尺寸小于 600px 时,导航条改为上下布局 */
@media screen and (max-width: 600px) {
nav a {
float: none;
width: 100%;
}
}
2.2.6 完整样例
- 网页:https://github.zhk.me/pages/html-layout/
- CSS:https://github.com/tadckle/blog/blob/main/pages/html-layout/mystyle.css
2.3 使用CSS Grid实现同样布局
在SWT和JavaFX里有个布局叫做Grid Layout,容器被划分为多列,里面的元素可以占用多行或者多列,以此达到页面布局。下面是示意图:
利用Grid我们可以实现2.2网页的同样布局,不用古老的float属性。
body {
display: grid;
grid-template-columns: 75fr 25fr;
}
header {
grid-column: 1 / span 2;
}
nav {
grid-column: 1 / span 2;
}
main {
grid-column: 1 / span 1;
}
aside {
grid-column: 2 / span 1;
}
footer {
grid-column: 1 / span 2;
}
/* 响应式布局 - 屏幕尺寸小于 800px 时,aside显示在main的下面 */
@media screen and (max-width: 800px) {
main, aside {
grid-column: 1 / span 2;
}
}
/* 响应式布局 -屏幕尺寸小于 600px 时,导航条改为上下布局 */
@media screen and (max-width: 600px) {
nav a {
float: none;
width: 100%;
}
}
部署后的页面地址:https://github.zhk.me/pages/html-layout-grid/
关于CSS Grid,它还有很多属性,这里不再展开讲。CSS的布局内容很多,现在流行的都是响应式布局,关于响应式布局这里也不展开细讲。
2.4 antd Layout
现在有很多流行的UI框架,例如Material UI, Semantic UI, Ant Design等。这些框架就自带了Layout组件,侧边栏还能隐藏、展开,下面是antd的示例代码:
<Layout>
<Header>header</Header>
<Layout>
<Sider>left sidebar</Sider>
<Content>main content</Content>
<Sider>right sidebar</Sider>
</Layout>
<Footer>footer</Footer>
</Layout>
3. 参考
CSS网页布局:https://www.runoob.com/css/css-website-layout.html