HTML_CSS基础详解

O泡李华 7

HTML + CSS 基础详解

本章位置:Java 核心阶段 Web 基础
前置知识:JavaSE 基础、数据库与 JDBC 综合练习
下一章:JavaScript
学习目标:掌握 HTML 页面结构、常用标签、表单、语义化标签,以及 CSS 选择器、盒模型、布局、Flex、定位、响应式等基础知识,能够独立完成一个简单的静态网页。


一、为什么 Java 后端也要学 HTML 和 CSS

后面学习:

Servlet
JSP
Spring MVC
Spring Boot
Vue

都会接触网页。

后端程序最终经常需要:

接收浏览器请求
返回 HTML
提供接口给前端
处理表单
展示数据

所以即使以后主要做:

Java 后端

也必须理解最基础的:

HTML
CSS
JavaScript

二、网页由什么组成

一个普通网页通常由三部分组成:

HTML
CSS
JavaScript

可以简单理解:

HTML
负责结构

CSS
负责样式

JavaScript
负责交互

例如:

HTML
按钮是什么

CSS
按钮长什么样

JavaScript
点击按钮后做什么

三、HTML 是什么

HTML:

HyperText Markup Language

中文:

超文本标记语言

HTML 不是传统意义上的编程语言。

它主要使用:

标签

描述网页结构。


四、最基本的 HTML 页面

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>我的第一个页面</title>
</head>

<body>

    <h1>Hello HTML</h1>

</body>

</html>

五、DOCTYPE

<!DOCTYPE html>

告诉浏览器:

当前页面使用 HTML5 标准

现在新页面基本都写:

<!DOCTYPE html>

六、html 标签

<html>
</html>

表示:

整个 HTML 文档的根元素

例如:

<html lang="zh-CN">

lang 表示:

页面主要语言

七、head 和 body

页面主要分:

<head>
</head>

和:

<body>
</body>

head

主要放:

页面标题
字符编码
CSS
SEO 信息
脚本引用
页面元信息

body

主要放:

用户真正能看到的页面内容

八、字符编码

推荐:

<meta charset="UTF-8">

避免中文乱码。

如果浏览器、文件、服务器编码不一致:

可能出现乱码

九、title

<title>学生管理系统</title>

主要显示在:

浏览器标签页

十、HTML 标签基本结构

一般:

<标签名>内容</标签名>

例如:

<p>这是一段文字</p>

十一、单标签

有些标签不需要成对:

<img>
<input>
<br>
<hr>
<meta>
<link>

HTML5 中常见写法:

<img src="a.jpg" alt="图片">

不要求写:

<img />

十二、标签属性

例如:

<a href="https://example.com">
    访问网站
</a>

这里:

href

就是属性。

结构:

属性名="属性值"

十三、标题标签

HTML 提供:

<h1>一级标题</h1>
<h2>二级标题</h2>
<h3>三级标题</h3>
<h4>四级标题</h4>
<h5>五级标题</h5>
<h6>六级标题</h6>

其中:

h1 最大
h6 最小

更准确地说:

标题层级不同

不仅仅是字体大小不同。


十四、段落标签

<p>
    这是一段文字。
</p>

适合普通正文。


十五、换行 br

第一行
<br>
第二行

十六、水平线 hr

<hr>

可以插入分隔线。

现代页面更多通过:

CSS border

实现视觉分隔。


十七、文本强调标签

粗体强调:

<strong>重要内容</strong>

语义强调:

<em>强调内容</em>

十八、不要只为了样式使用语义标签

例如:

<strong>

不只是“变粗”。

它还有:

内容重要

的语义。

如果只想改变视觉样式:

更推荐 CSS

十九、div

<div>
    内容
</div>

div 是:

通用块级容器

非常常用。

例如:

<div class="card">

    <h2>Java</h2>

    <p>Java 学习笔记</p>

</div>

二十、span

<span>
    内容
</span>

常用于:

一小段行内内容

例如:

<p>
    当前状态:
    <span>已完成</span>
</p>

二十一、块级元素和行内元素

传统理解:

块级元素

通常:

独占一行

例如:

div
p
h1
ul
section

行内元素

通常:

和其他内容在同一行

例如:

span
a
strong
em

但最终显示方式可以通过:

display

改变。


二十二、链接 a

<a href="https://www.baidu.com">
    百度
</a>

二十三、target

新标签打开:

<a
    href="https://example.com"
    target="_blank"
>
    新窗口打开
</a>

如果是外部不可信链接,实际项目中还应注意:

rel="noopener noreferrer"

二十四、页面内链接

可以:

<a href="#section1">
    跳转到第一章
</a>

目标:

<h2 id="section1">
    第一章
</h2>

二十五、图片 img

<img
    src="images/logo.png"
    alt="网站 Logo"
>

常用属性:

src
图片地址

alt
图片替代文本

二十六、alt 为什么重要

如果:

图片加载失败

浏览器可以显示:

alt 内容

同时对:

无障碍访问
SEO

也很重要。


二十七、不要只靠 HTML width/height 做所有图片样式

虽然可以:

<img
    src="a.jpg"
    width="200"
>

但现代页面通常更推荐:

img {
    width: 200px;
}

样式统一放 CSS。


二十八、无序列表 ul

<ul>

    <li>Java</li>

    <li>MySQL</li>

    <li>SpringBoot</li>

</ul>

二十九、有序列表 ol

<ol>

    <li>创建项目</li>

    <li>配置数据库</li>

    <li>启动程序</li>

</ol>

三十、列表的实际用途

除了文章列表,

导航栏也经常使用:

<ul>
    <li>
        <a href="#">首页</a>
    </li>
</ul>

然后通过 CSS 做成横向菜单。


三十一、表格 table

基本结构:

<table>

    <tr>
        <th>姓名</th>
        <th>年龄</th>
        <th>成绩</th>
    </tr>

    <tr>
        <td>张三</td>
        <td>20</td>
        <td>90</td>
    </tr>

</table>

三十二、表格标签

table
表格

tr
一行

th
表头单元格

td
普通单元格

三十三、thead tbody

更规范:

<table>

    <thead>
        <tr>
            <th>姓名</th>
            <th>成绩</th>
        </tr>
    </thead>

    <tbody>
        <tr>
            <td>张三</td>
            <td>90</td>
        </tr>
    </tbody>

</table>

三十四、合并单元格

横向:

<td colspan="2">
    内容
</td>

纵向:

<td rowspan="2">
    内容
</td>

三十五、表单 form

表单用于:

收集用户输入

例如:

登录
注册
搜索
提交订单
填写资料

三十六、form 基本结构

<form>

    <input type="text">

    <button type="submit">
        提交
    </button>

</form>

三十七、action

<form action="/login">

表示:

表单提交到哪个地址

三十八、method

常见:

<form method="get">

或者:

<form method="post">

后面 Servlet 会详细学习:

GET
POST

区别。


三十九、input

最常见表单标签:

<input>

四十、text

<input
    type="text"
    name="username"
>

四十一、password

<input
    type="password"
    name="password"
>

浏览器会隐藏输入内容。

注意:

隐藏显示不等于密码安全。

真正安全还需要:

HTTPS
后端密码哈希
安全认证

四十二、radio

单选:

<label>
    <input
        type="radio"
        name="gender"
        value="male"
    >
    男
</label>

<label>
    <input
        type="radio"
        name="gender"
        value="female"
    >
    女
</label>

要实现互斥:

name 必须相同

四十三、checkbox

多选:

<label>
    <input
        type="checkbox"
        name="hobby"
        value="java"
    >
    Java
</label>

四十四、number

<input
    type="number"
    name="age"
    min="1"
    max="150"
>

浏览器会提供基础数字输入体验。

但:

前端校验永远不能替代后端校验。


四十五、email

<input
    type="email"
    name="email"
>

浏览器可以做基础格式判断。


四十六、date

<input
    type="date"
    name="birthday"
>

四十七、file

<input
    type="file"
    name="avatar"
>

用于文件上传。

后面学习 Servlet / SpringBoot 时会涉及:

multipart/form-data

四十八、hidden

隐藏字段:

<input
    type="hidden"
    name="id"
    value="1001"
>

用户页面看不到,

但提交时仍会发送。

注意:

hidden 并不安全,用户仍然可以修改请求。


四十九、textarea

多行文本:

<textarea
    name="description"
    rows="5"
    cols="30"
></textarea>

五十、select

下拉选择:

<select name="major">

    <option value="java">
        Java
    </option>

    <option value="ai">
        人工智能
    </option>

</select>

五十一、button

<button type="submit">
    提交
</button>

常见 type:

submit
提交表单

button
普通按钮

reset
重置表单

五十二、label

推荐:

<label for="username">
    用户名
</label>

<input
    id="username"
    type="text"
    name="username"
>

点击文字:

也可以聚焦输入框

提升可用性。


五十三、placeholder

<input
    type="text"
    placeholder="请输入用户名"
>

注意:

placeholder 不能替代 label

五十四、required

<input
    type="text"
    required
>

表示:

浏览器提交前要求填写

但仍然必须:

后端再次校验

五十五、name 为什么重要

表单提交时:

<input
    name="username"
    value="admin"
>

通常会形成:

username=admin

如果没有:

name

表单数据通常不会按普通表单字段提交。


五十六、语义化标签

HTML5 提供:

header
nav
main
section
article
aside
footer

相比所有地方都:

<div>

语义更加清楚。


五十七、header

<header>
    网站头部
</header>

五十八、nav

<nav>
    导航菜单
</nav>

五十九、main

<main>
    页面主体
</main>

通常一个页面主要内容区域。


六十、section

<section>
    一个主题区域
</section>

六十一、article

<article>
    一篇独立文章
</article>

博客文章就很适合。


六十二、aside

<aside>
    侧边栏
</aside>

六十三、footer

<footer>
    页脚
</footer>

六十四、完整语义化结构示例

<!DOCTYPE html>

<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>博客首页</title>
</head>

<body>

    <header>
        <h1>Java 学习博客</h1>
    </header>

    <nav>
        <a href="#">首页</a>
        <a href="#">Java</a>
        <a href="#">MySQL</a>
    </nav>

    <main>

        <article>

            <h2>Java 数组</h2>

            <p>
                数组用于保存多个同类型数据。
            </p>

        </article>

    </main>

    <footer>
        Copyright 2026
    </footer>

</body>

</html>

六十五、CSS 是什么

CSS:

Cascading Style Sheets

中文:

层叠样式表

用于控制:

颜色
字体
间距
布局
边框
动画
响应式

六十六、CSS 基本语法

选择器 {
    属性: 值;
}

例如:

h1 {
    color: red;
    font-size: 32px;
}

六十七、CSS 三种引入方式

行内样式
内部样式
外部样式

六十八、行内样式

<p style="color: red;">
    Hello
</p>

不推荐大量使用。

原因:

结构和样式混在一起
不好维护

六十九、内部样式

<style>

    p {
        color: red;
    }

</style>

适合:

单页面练习

七十、外部 CSS

HTML:

<link
    rel="stylesheet"
    href="css/style.css"
>

style.css:

p {
    color: red;
}

实际项目更推荐:

外部样式表

七十一、标签选择器

p {
    color: #333;
}

选中:

所有 p

七十二、类选择器

HTML:

<div class="card">
    内容
</div>

CSS:

.card {
    border: 1px solid #ddd;
}

类选择器:

.

开头。


七十三、id 选择器

HTML:

<div id="header">
</div>

CSS:

#header {
    height: 60px;
}

id 选择器:

#

开头。


七十四、class 和 id 怎么选

实际样式中:

优先 class

因为:

class 可以复用

id 更多用于:

页面唯一标识
锚点
JS 精确定位

七十五、通配符选择器

* {
    box-sizing: border-box;
}

选中:

所有元素

七十六、后代选择器

.card p {
    color: #666;
}

表示:

.card 内部所有 p

七十七、子代选择器

.menu > li {
    list-style: none;
}

只选择:

直接子元素

七十八、并集选择器

h1,
h2,
h3 {
    color: #222;
}

七十九、属性选择器

input[type="text"] {
    border: 1px solid #ccc;
}

八十、伪类

例如:

a:hover {
    color: red;
}

表示:

鼠标悬停

八十一、常见伪类

:hover

:focus

:first-child

:last-child

:nth-child()

:checked

:disabled

八十二、focus

input:focus {
    outline: none;
    border-color: #333;
}

表示:

输入框获得焦点时

八十三、nth-child()

例如:

tr:nth-child(even) {
    background: #f7f7f7;
}

偶数行:

添加背景色

八十四、伪元素

常见:

::before

::after

例如:

.title::before {
    content: "• ";
}

八十五、CSS 优先级

当多个规则同时作用于一个元素时:

浏览器需要决定谁生效

大致可以理解:

!important
>
行内样式
>
id
>
class / 属性 / 伪类
>
标签

但真正规则还涉及:

选择器权重
源码顺序
继承
层叠

八十六、不要滥用 !important

例如:

color: red !important;

虽然优先级高,

但大量使用会导致:

样式越来越难覆盖

更应该优化:

选择器结构
CSS 组织

八十七、颜色

常见:

color: red;

十六进制:

color: #333333;

简写:

color: #333;

RGB:

color: rgb(51, 51, 51);

带透明:

color: rgba(0, 0, 0, 0.6);

八十八、字体

body {
    font-family:
        Arial,
        "Microsoft YaHei",
        sans-serif;
}

八十九、字体大小

font-size: 16px;

九十、字体粗细

font-weight: 600;

或者:

font-weight: bold;

九十一、行高

line-height: 1.8;

文章正文经常通过较大的:

line-height

提升阅读体验。


九十二、文本对齐

text-align: center;

常见:

left
center
right

九十三、文本装饰

去除链接下划线:

a {
    text-decoration: none;
}

九十四、背景颜色

body {
    background-color: #f5f5f5;
}

九十五、背景图片

.hero {
    background-image:
        url("../images/bg.jpg");
}

九十六、背景尺寸

background-size: cover;

常见:

cover
覆盖整个容器

contain
完整显示图片

九十七、盒模型

CSS 最重要的基础之一:

Box Model
盒模型

一个元素可以理解成:

margin
┌──────────────────────────┐
│ border                   │
│  ┌────────────────────┐  │
│  │ padding            │  │
│  │  ┌──────────────┐  │  │
│  │  │ content      │  │  │
│  │  └──────────────┘  │  │
│  └────────────────────┘  │
└──────────────────────────┘

九十八、content

内容区域。

例如:

width: 200px;
height: 100px;

九十九、padding

内边距:

padding: 20px;

表示:

内容和边框之间的距离

一百、border

border:
    1px solid #ddd;

一百零一、margin

外边距:

margin: 20px;

表示:

元素和其他元素之间的距离

一百零二、四方向写法

margin:
    10px
    20px
    30px
    40px;

顺序:

上
右
下
左

口诀:

顺时针

一百零三、两个值

margin:
    10px
    20px;

表示:

上下 10px

左右 20px

一百零四、box-sizing

默认盒模型:

box-sizing:
    content-box;

这时:

width
只表示 content

padding 和 border 会额外增加总宽度。


一百零五、border-box

推荐:

* {
    box-sizing:
        border-box;
}

这样:

width
包含 content + padding + border

布局更直观。


一百零六、width 和 max-width

例如文章容器:

.container {
    width: 100%;
    max-width: 1200px;
}

这样:

大屏不超过 1200px

小屏自动缩小

一百零七、水平居中

固定最大宽度容器:

.container {
    max-width: 1200px;
    margin: 0 auto;
}

其中:

左右 auto

实现水平居中。


一百零八、display

常见:

block

inline

inline-block

none

flex

grid

一百零九、display: none

.hidden {
    display: none;
}

元素:

不显示
也不占布局空间

一百一十、visibility: hidden

visibility: hidden;

元素:

看不见
但通常仍占空间

和:

display: none

不同。


一百一十一、overflow

如果内容超出容器:

overflow: hidden;

或者:

overflow: auto;

一百一十二、圆角

border-radius: 12px;

一百一十三、阴影

box-shadow:
    0 8px 24px
    rgba(0, 0, 0, 0.08);

卡片设计中很常见。


一百一十四、opacity

opacity: 0.5;

整个元素包括子元素:

一起透明

如果只想背景半透明,

更适合:

rgba()

一百一十五、定位 position

常见:

static

relative

absolute

fixed

sticky

一百一十六、static

默认:

position: static;

正常文档流。


一百一十七、relative

position: relative;

元素仍保留原来的布局位置,

同时可以作为:

absolute 子元素的定位参照

一百一十八、absolute

position: absolute;

元素脱离普通文档流。

通常相对于:

最近的非 static 定位祖先

定位。


一百一十九、absolute 常见组合

父:

.card {
    position: relative;
}

子:

.badge {
    position: absolute;
    top: 10px;
    right: 10px;
}

一百二十、fixed

position: fixed;

相对于:

浏览器视口

固定。

例如:

回到顶部按钮
固定客服按钮

一百二十一、sticky

position: sticky;
top: 0;

在达到指定位置后:

可以吸附

常用于:

顶部导航
表头
侧边栏目录

一百二十二、z-index

定位元素重叠时:

z-index: 100;

控制:

层叠顺序

但它还受到:

层叠上下文

影响。

初学阶段先理解基础即可。


一百二十三、Flex 布局

Flex:

弹性布局

是现代 CSS 最常用布局方式之一。

父元素:

.container {
    display: flex;
}

子元素自动成为:

flex item

一百二十四、主轴和交叉轴

默认:

flex-direction: row;

主轴:

从左到右

交叉轴:

从上到下

一百二十五、justify-content

控制:

主轴方向对齐

常见:

flex-start

center

flex-end

space-between

space-around

space-evenly

一百二十六、居中布局

.container {
    display: flex;
    justify-content: center;
    align-items: center;
}

这是最常见的:

水平 + 垂直居中

一百二十七、align-items

控制:

交叉轴对齐

例如:

align-items: center;

一百二十八、flex-direction

横向:

flex-direction: row;

纵向:

flex-direction: column;

一百二十九、gap

控制子元素间距:

display: flex;
gap: 20px;

相比给每个子元素单独:

margin

更方便。


一百三十、flex-wrap

flex-wrap: wrap;

空间不够时:

允许换行

一百三十一、flex

例如:

.main {
    flex: 1;
}

表示:

占据剩余空间

常用于:

侧边栏 + 主内容

一百三十二、导航栏 Flex 示例

<nav class="nav">

    <div class="logo">
        MyBlog
    </div>

    <div class="menu">
        <a href="#">首页</a>
        <a href="#">Java</a>
        <a href="#">MySQL</a>
    </div>

</nav>

CSS:

.nav {
    display: flex;
    justify-content:
        space-between;
    align-items: center;
    padding: 16px 24px;
}

.menu {
    display: flex;
    gap: 20px;
}

一百三十三、Grid 简单了解

CSS Grid:

二维布局

非常适合:

卡片网格
后台布局
相册
复杂页面结构

例如:

.grid {
    display: grid;

    grid-template-columns:
        repeat(3, 1fr);

    gap: 20px;
}

表示:

三列等宽

一百三十四、响应式网格

.grid {
    display: grid;

    grid-template-columns:
        repeat(
            auto-fit,
            minmax(
                240px,
                1fr
            )
        );

    gap: 20px;
}

空间不足时:

自动减少列数

一百三十五、响应式设计

响应式:

Responsive Design

目标:

电脑
平板
手机

都能正常显示。


一百三十六、viewport

移动端页面通常写:

<meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
>

否则移动设备可能按照桌面宽度缩放页面。


一百三十七、媒体查询

@media (
    max-width: 768px
) {

    .nav {
        flex-direction:
            column;
    }
}

表示:

屏幕宽度 <= 768px 时
应用这些样式

一百三十八、常见响应式思路

桌面:

侧边栏 + 主内容

手机:

上下排列

例如:

.layout {
    display: flex;
}

@media (
    max-width: 768px
) {

    .layout {
        flex-direction:
            column;
    }
}

一百三十九、单位 px

font-size: 16px;

px:

像素

简单直接。


一百四十、百分比 %

width: 80%;

通常相对于:

父元素

一百四十一、rem

font-size: 1rem;

通常相对于:

html 根元素字体大小

如果根:

html {
    font-size: 16px;
}

那么:

1rem = 16px

一百四十二、em

通常相对于:

当前元素或继承后的字体大小

使用时比 rem 更容易出现层层叠加。


一百四十三、vw / vh

vw
视口宽度的百分比

vh
视口高度的百分比

例如:

.hero {
    min-height: 100vh;
}

表示:

至少一屏高度

一百四十四、图片响应式

推荐:

img {
    max-width: 100%;
    height: auto;
}

避免图片:

撑破容器

一百四十五、object-fit

.cover {
    width: 200px;
    height: 120px;

    object-fit: cover;
}

图片会:

裁切填满容器

一百四十六、鼠标样式

button {
    cursor: pointer;
}

一百四十七、过渡 transition

.card {
    transition:
        transform 0.2s;
}

悬停:

.card:hover {
    transform:
        translateY(-4px);
}

实现简单平滑动画。


一百四十八、transform

常见:

translate

scale

rotate

例如:

.card:hover {
    transform:
        scale(1.02);
}

一百四十九、不要一开始沉迷复杂动画

初学 CSS 优先掌握:

盒模型

Flex

Grid

定位

响应式

字体和间距

动画属于:

锦上添花

一百五十、CSS Reset 简单处理

浏览器默认样式可能不同。

可以写:

* {
    box-sizing:
        border-box;
}

body {
    margin: 0;
}

实际项目可能使用更完整:

reset.css
normalize.css

一百五十一、页面基础样式建议

body {
    margin: 0;

    font-family:
        Arial,
        "Microsoft YaHei",
        sans-serif;

    color: #222;

    background: #f7f7f7;

    line-height: 1.6;
}

一百五十二、按钮基础样式

.button {
    border: none;

    padding:
        10px
        18px;

    border-radius:
        8px;

    cursor: pointer;
}

一百五十三、输入框基础样式

.input {
    width: 100%;

    padding:
        10px
        12px;

    border:
        1px solid #ddd;

    border-radius:
        8px;

    outline: none;
}

焦点:

.input:focus {
    border-color: #333;
}

一百五十四、表格基础样式

table {
    width: 100%;

    border-collapse:
        collapse;
}

th,
td {
    padding: 12px;

    border-bottom:
        1px solid #eee;

    text-align: left;
}

一百五十五、卡片样式

.card {
    padding: 24px;

    background: white;

    border-radius:
        12px;

    box-shadow:
        0 8px 24px
        rgba(0, 0, 0, 0.06);
}

一百五十六、综合案例:登录页 HTML

<!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta
        name="viewport"
        content="width=device-width, initial-scale=1.0"
    >

    <title>登录</title>

    <link
        rel="stylesheet"
        href="style.css"
    >

</head>

<body>

    <main class="login-page">

        <section class="login-card">

            <h1>
                学生管理系统
            </h1>

            <form>

                <div class="form-item">

                    <label for="username">
                        用户名
                    </label>

                    <input
                        id="username"
                        class="input"
                        type="text"
                        name="username"
                        required
                    >

                </div>

                <div class="form-item">

                    <label for="password">
                        密码
                    </label>

                    <input
                        id="password"
                        class="input"
                        type="password"
                        name="password"
                        required
                    >

                </div>

                <button
                    class="login-button"
                    type="submit"
                >
                    登录
                </button>

            </form>

        </section>

    </main>

</body>

</html>

一百五十七、登录页 CSS

* {
    box-sizing:
        border-box;
}

body {
    margin: 0;

    font-family:
        Arial,
        "Microsoft YaHei",
        sans-serif;

    background:
        #f4f4f4;

    color:
        #222;
}

.login-page {
    min-height:
        100vh;

    display:
        flex;

    justify-content:
        center;

    align-items:
        center;

    padding:
        20px;
}

.login-card {
    width:
        100%;

    max-width:
        400px;

    background:
        white;

    padding:
        32px;

    border-radius:
        16px;

    box-shadow:
        0
        12px
        30px
        rgba(0, 0, 0, 0.08);
}

.login-card h1 {
    margin-top:
        0;

    margin-bottom:
        24px;

    text-align:
        center;
}

.form-item {
    margin-bottom:
        18px;
}

.form-item label {
    display:
        block;

    margin-bottom:
        8px;
}

.input {
    width:
        100%;

    padding:
        11px
        12px;

    border:
        1px solid
        #dcdcdc;

    border-radius:
        8px;

    outline:
        none;
}

.input:focus {
    border-color:
        #333;
}

.login-button {
    width:
        100%;

    border:
        none;

    padding:
        12px;

    border-radius:
        8px;

    background:
        #111;

    color:
        white;

    cursor:
        pointer;
}

.login-button:hover {
    opacity:
        0.88;
}

一百五十八、综合案例:后台管理布局

HTML:

<div class="admin-layout">

    <aside class="sidebar">

        <h2>
            Admin
        </h2>

        <nav>

            <a href="#">
                首页
            </a>

            <a href="#">
                学生管理
            </a>

            <a href="#">
                用户管理
            </a>

        </nav>

    </aside>

    <main class="content">

        <header class="topbar">

            <h1>
                学生管理
            </h1>

        </header>

        <section class="card">

            页面内容

        </section>

    </main>

</div>

一百五十九、后台布局 CSS

.admin-layout {
    min-height:
        100vh;

    display:
        flex;
}

.sidebar {
    width:
        220px;

    padding:
        24px;

    background:
        #111;

    color:
        white;
}

.sidebar nav {
    display:
        flex;

    flex-direction:
        column;

    gap:
        12px;
}

.sidebar a {
    color:
        white;

    text-decoration:
        none;

    padding:
        10px;

    border-radius:
        8px;
}

.sidebar a:hover {
    background:
        rgba(255, 255, 255, 0.1);
}

.content {
    flex:
        1;

    padding:
        24px;

    background:
        #f5f5f5;
}

一百六十、手机端后台适配

@media (
    max-width: 768px
) {

    .admin-layout {
        flex-direction:
            column;
    }

    .sidebar {
        width:
            100%;
    }

    .sidebar nav {
        flex-direction:
            row;

        flex-wrap:
            wrap;
    }
}

一百六十一、常见错误:所有内容都用 div

虽然:

<div>

什么都能包,

但应该优先考虑:

header
nav
main
section
article
footer

让结构更清晰。


一百六十二、常见错误:使用 br 做大量布局

不推荐:

用户名:
<br>
<input>
<br>
<br>
密码:
<br>
<input>

布局应该交给:

CSS margin
padding
flex
grid

一百六十三、常见错误:使用空格硬撑距离

不要:

用户名:     <input>

不同字体和设备下会乱。

应该:

CSS 布局

一百六十四、常见错误:忘记 meta charset

可能导致:

中文乱码

推荐:

<meta charset="UTF-8">

一百六十五、常见错误:忘记 viewport

移动端可能:

页面缩放异常

推荐:

<meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
>

一百六十六、常见错误:图片没有 alt

不推荐:

<img src="logo.png">

推荐:

<img
    src="logo.png"
    alt="网站 Logo"
>

一百六十七、常见错误:表单没有 name

例如:

<input
    type="text"
    value="admin"
>

如果要传统表单提交,

通常应该:

<input
    type="text"
    name="username"
>

一百六十八、常见错误:把前端校验当安全机制

例如:

<input
    type="number"
    min="1"
    max="100"
>

用户仍可以:

绕过浏览器
直接发送 HTTP 请求

所以:

后端必须再次校验

一百六十九、常见错误:CSS 选择器太深

例如:

body
.main
.content
.article
.card
.header
.title
span {
}

层级太深:

难维护
难覆盖

推荐:

使用清晰 class

例如:

.article-title {
}

一百七十、常见错误:固定高度太多

例如:

height:
    800px;

内容多了:

可能溢出

普通内容区域更常:

min-height:
    ...

或者让内容自然撑开。


一百七十一、常见错误:所有宽度都固定 px

例如:

width:
    1200px;

在手机上:

直接横向溢出

更合理:

width:
    100%;

max-width:
    1200px;

一百七十二、常见错误:absolute 做整个页面布局

absolute 适合:

角标
浮层
局部定位

不适合:

整个页面所有模块

主布局优先:

Flex
Grid
正常文档流

一百七十三、常见错误:不知道盒模型导致宽度超出

例如:

.box {
    width:
        300px;

    padding:
        30px;

    border:
        1px solid;
}

默认 content-box 下:

总宽度 > 300px

推荐全局:

* {
    box-sizing:
        border-box;
}

一百七十四、常见错误:margin 和 padding 混淆

padding
元素内部空间

margin
元素外部空间

可以记:

内容和边框之间
→ padding

元素和元素之间
→ margin

一百七十五、常见错误:只会 float

老教程常使用:

float:
    left;

做布局。

现代新项目大多数普通布局更推荐:

Flex
Grid

float 主要理解:

历史代码
图文环绕

即可。


一百七十六、CSS 调试方式

浏览器按:

F12

打开:

开发者工具

可以查看:

Elements

Styles

Computed

Box Model

一百七十七、Elements

可以实时查看:

HTML 结构

也能临时修改页面。


一百七十八、Styles

查看:

哪些 CSS 规则正在生效

如果规则被划掉:

说明被更高优先级样式覆盖

一百七十九、Computed

查看最终:

计算后的样式

例如:

最终 width
最终 font-size
最终 margin

一百八十、盒模型调试

开发者工具中会直接显示:

margin
border
padding
content

这是排查:

为什么宽度不对
为什么元素错位

最重要的工具之一。


一百八十一、练习题 1:个人介绍页

要求:

头像

姓名

简介

学习方向

联系方式

使用:

HTML + CSS

完成。


一百八十二、练习题 2:登录页面

要求:

用户名

密码

记住我

登录按钮

使用:

Flex
盒模型
表单

完成居中卡片。


一百八十三、练习题 3:学生表格

使用:

table

展示:

学号
姓名
年龄
专业
成绩

加入:

表头背景
隔行变色
hover 效果

一百八十四、练习题 4:导航栏

要求:

左边 Logo

右边菜单

使用:

Flex

完成。


一百八十五、练习题 5:博客文章卡片

每个卡片:

标题
摘要
发布日期
标签
阅读按钮

使用:

Grid

排列。


一百八十六、练习题 6:后台管理页面

结构:

左侧菜单

顶部标题

右侧内容

要求:

桌面横向布局

手机改成上下布局

一百八十七、练习题 7:注册表单

字段:

用户名

密码

确认密码

邮箱

性别

专业

个人介绍

使用:

input

radio

select

textarea

完成。


一百八十八、练习题 8:响应式卡片

桌面:

3 列

平板:

2 列

手机:

1 列

可以使用:

Grid + media query

一百八十九、HTML 必须掌握标签

html
head
body

h1~h6

p
div
span

a
img

ul
ol
li

table
tr
th
td

form
input
textarea
select
option
button
label

header
nav
main
section
article
aside
footer

一百九十、CSS 必须掌握

选择器

字体

颜色

背景

width / height

margin

padding

border

box-sizing

display

position

Flex

Grid 基础

overflow

伪类

响应式

媒体查询

一百九十一、HTML + CSS 学习路线

建议顺序:

HTML 页面结构
↓
常用标签
↓
链接和图片
↓
列表
↓
表格
↓
表单
↓
语义化标签
↓
CSS 基础
↓
选择器
↓
文本样式
↓
盒模型
↓
display
↓
定位
↓
Flex
↓
Grid
↓
响应式
↓
综合页面

一百九十二、本章总结

HTML 解决:

页面里有什么

CSS 解决:

这些内容怎么显示

最基础的网页开发思路:

先写 HTML 结构
↓
再写 CSS 样式
↓
最后用 JavaScript 增加交互

不要一开始追求:

很炫的动画
复杂组件
高级框架

先做到:

结构正确

布局稳定

表单规范

不同屏幕能正常显示

就已经打好了 Web 前端基础。

下一章继续学习:

JavaScript

开始让页面真正具备:

事件
交互
数据处理
DOM 操作
表单校验
异步请求

也就正式从:

静态网页

进入:

动态网页

阶段。