Day 13 | 调 line-height 和 margin:三处间距让名片页脱离模板感

本文是《100天精通HTML基础入门》专栏第 13 篇,订阅专栏不迷路。

本文目录

  • 同一份内容,两种脸

  • 第一个变量:每一行字占多高

  • 块与块之间空多少,才叫"一组"

  • 字贴到卡片边上,是 padding 的事

  • 挤成一团的页面不会报错

  • 拿标尺量一遍你自己的页面

同一份内容,两种脸

先做个实验(运行结果在 Chrome 128 与 Edge 128 下验证过;行高、margin、padding 这三件事属于 CSS 2.1 就定下来的机制,长期适用,不依赖具体浏览器版本)。下面四个页面,标签一模一样,文字一模一样,颜色也没动,只有三行样式不一样。我把它们逐个渲染出来,你对着看就能说出"模板感"是哪来的。

样式代码不用细看,理解为给网页化妆即可,CSS 专栏里会展开。今天只碰三个开关:line-height(行高)、margin(外边距)、padding(内边距)。

第一版,新手默认长这样。 所有元素紧紧贴在一起,浏览器给什么间距就用什么间距:

Plaintext 复制代码
<!-- 《100天精通HTML基础入门》Day 13 · 平头哥 · 技术改变世界,勤奋改变人生 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>名片页 v0 · 挤成一团</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; background: #f7f5ef;
      color: #24292f; margin: 0; line-height: 1; }
    /* 标题:字号大,行高反而要收小 */
    .card { background: #fff; border: 1px solid #d8d3c8; max-width: 640px;
      padding: 0; }
    h1 { font-size: 22px; margin: 0; }
    h2 { font-size: 16px; margin: 0; color: #2563eb; }
    p { margin: 0; font-size: 14px; }
    li { font-size: 14px; margin: 0; }
  </style>
</head>
<body>
  <div class="card">
    <h1>平头哥</h1>
    <p>前端工程师 · 在 CSDN 写代码笔记</p>
    <h2>我会什么</h2>
    <ul>
      <li>HTML 结构与语义标签</li>
      <li>页面排版与移动端适配</li>
      <li>把零基础学员带进第一份工作</li>
    </ul>
    <h2>找我</h2>
    <p>邮箱 pingtouge@example.com</p>
    <p>坐标 杭州</p>
  </div>
</body>
</html>

这版的问题不在颜色,也不在字体,而在所有距离都是 0 。行与行挨着,块与块挨着,卡片内容顶到边框。浏览器默认样式被 margin: 0 全部清掉了,清干净是好事,可你没把该留的距离补回来。

第一个变量:每一行字占多高

只改一个数字:line-height: 1 换成 line-height: 1.75。别的都不动。

Plaintext 复制代码
<!-- 《100天精通HTML基础入门》Day 13 · 平头哥 · 技术改变世界,勤奋改变人生 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>名片页 v1 · 只改行高</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; background: #f7f5ef;
      color: #24292f; margin: 0; line-height: 1.75; }
    .card { background: #fff; border: 1px solid #d8d3c8; max-width: 640px;
      padding: 0; }
    h1 { font-size: 22px; margin: 0; }
    h2 { font-size: 16px; margin: 0; color: #2563eb; }
    p { margin: 0; font-size: 14px; }
    li { font-size: 14px; margin: 0; }
  </style>
</head>
<body>
  <div class="card">
    <h1>平头哥</h1>
    <p>前端工程师 · 在 CSDN 写代码笔记</p>
    <h2>我会什么</h2>
    <ul>
      <li>HTML 结构与语义标签</li>
      <li>页面排版与移动端适配</li>
      <li>把零基础学员带进第一份工作</li>
    </ul>
    <h2>找我</h2>
    <p>邮箱 pingtouge@example.com</p>
    <p>坐标 杭州</p>
  </div>
</body>
</html>

line-height 管的是一行文字占多高的行盒 ,不是字与字之间的距离。字号 14px、行高 1.75,每行就占 24.5px,剩下的 10.5px 平分到文字上下,眼睛才有地方落脚。写 line-height: 1 相当于把走廊拆了,让所有文字挤在一条过道里。

中文正文的经验区间是 1.6 到 1.9,标题反过来要更小(1.2 左右),因为标题字号本来就大,乘出来的实际距离已经够了。这就是为什么很多页面正文还行,标题下面却空出一大片。

块与块之间空多少,才叫"一组"

行高解决了"行间",解决不了"块间"。人和人读页面时靠距离判断归属:离得近的就是一伙的。这条规则叫亲密性,是排版里最便宜的一招。

Plaintext 复制代码
<!-- 《100天精通HTML基础入门》Day 13 · 平头哥 · 技术改变世界,勤奋改变人生 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>名片页 v2 · 用 margin 分组</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; background: #f7f5ef;
      color: #24292f; margin: 0; line-height: 1.75; }
    .card { background: #fff; border: 1px solid #d8d3c8; max-width: 640px;
      margin: 28px auto; padding: 0; }
    h1 { font-size: 26px; line-height: 1.25; margin: 0 0 6px; }
    .lead { color: #6b7280; margin: 0 0 24px; font-size: 15px; }
    h2 { font-size: 16px; margin: 24px 0 8px; color: #2563eb; }
    p { margin: 0 0 8px; font-size: 14px; }
    ul { margin: 0; padding-left: 20px; }
    li { font-size: 14px; margin: 0 0 4px; }
  </style>
</head>
<body>
  <div class="card">
    <h1>平头哥</h1>
    <p class="lead">前端工程师 · 在 CSDN 写代码笔记</p>
    <h2>我会什么</h2>
    <ul>
      <li>HTML 结构与语义标签</li>
      <li>页面排版与移动端适配</li>
      <li>把零基础学员带进第一份工作</li>
    </ul>
    <h2>找我</h2>
    <p>邮箱 pingtouge@example.com</p>
    <p>坐标 杭州</p>
  </div>
</body>
</html>

数一下这页里的三档距离:同一组内部 4 到 8px,组与组之间 24px,标题到它管的内容 8px。关键是"不相等"------只要大间距明显大于小间距,读者就知道哪里断开了。新手最常见的相反做法是所有 margin 一律写 20px,整齐是整齐了,分组信息也就没了。

顺手记一个坑:.lead 那行我写了 margin: 0 0 24px,把上边距归零,不然它会继承浏览器的 p 默认外边距,和上面 h1 挤出的距离叠加,变成一块谁也不管的空白。

字贴到卡片边上,是 padding 的事

分组对了,但文字还是顶着白框的边------那圈边框把内容"关"住了。边框内的空白叫 padding,边框外的空白叫 margin,两个别混。

Plaintext 复制代码
<!-- 《100天精通HTML基础入门》Day 13 · 平头哥 · 技术改变世界,勤奋改变人生 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>名片页 v3 · 加内边距与对齐</title>
  <style>
    /* 让 padding 不再往外撑宽,手机上才不溢出 */
    * { box-sizing: border-box; }
    body { font-family: "Microsoft YaHei", sans-serif; background: #f7f5ef;
      color: #24292f; margin: 0; line-height: 1.75; }
    .card { background: #fff; border: 1px solid #d8d3c8; border-radius: 14px;
      max-width: 640px; margin: 28px auto; padding: 28px 32px;
      box-shadow: 0 4px 18px rgba(31,45,61,.07); }
    h1 { font-size: 26px; line-height: 1.25; margin: 0 0 6px; }
    .lead { color: #6b7280; margin: 0 0 24px; font-size: 15px; }
    h2 { font-size: 16px; margin: 24px 0 8px; color: #2563eb;
      border-left: 4px solid #ffd166; padding-left: 8px; }
    p { margin: 0 0 8px; font-size: 14px; }
    ul { margin: 0; padding-left: 20px; }
    li { font-size: 14px; margin: 0 0 4px; }
    .foot { margin-top: 24px; padding-top: 14px; border-top: 1px dashed #d8d3c8;
      font-size: 13px; color: #6b7280; }
  </style>
</head>
<body>
  <div class="card">
    <h1>平头哥</h1>
    <p class="lead">前端工程师 · 在 CSDN 写代码笔记</p>
    <h2>我会什么</h2>
    <ul>
      <li>HTML 结构与语义标签</li>
      <li>页面排版与移动端适配</li>
      <li>把零基础学员带进第一份工作</li>
    </ul>
    <h2>找我</h2>
    <p>邮箱 pingtouge@example.com</p>
    <p>坐标 杭州</p>
    <p class="foot">样式不用细看,理解为给网页化妆即可。</p>
  </div>
</body>
</html>

四个改动都值得说一句。第一,padding: 28px 32px 上下 28、左右 32,左右给得更多是因为汉字行宽大,横向留白更影响呼吸。第二,* { box-sizing: border-box; } 是保险:默认 content-box 下 padding 会往外撑宽,卡片可能在手机上溢出多出横向滚动条。第三,h2 左边那 4px 竖条用的是 border-left + padding-left,让色条压着文字而不是飘在旁边。第四,分隔线用的是已有元素的 border ,不是插一条 <hr>------少一个标签,层级更干净。

从 v0 到 v3,HTML 一个字没改。所谓"设计感",到这里为止全是间距。

挤成一团的页面不会报错

排版翻车最阴的地方:浏览器不报错。你少写一个闭合标签它会吼你,间距没留够它只会安静地把页面排成一堵墙。

还有一个更常见的错误来源------用 &nbsp;<br> 手敲空白来"造间距":

Plaintext 复制代码
<!-- 《100天精通HTML基础入门》Day 13 · 平头哥 · 技术改变世界,勤奋改变人生 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>翻车 · 用 &nbsp; 和 br 手搓间距</title>
  <style>
    body { font-family: "Microsoft YaHei", sans-serif; background: #f7f5ef;
      color: #24292f; margin: 0; line-height: 1.75; }
    .card { background: #fff; border: 1px solid #d8d3c8; max-width: 640px;
      margin: 28px auto; padding: 20px; }
  </style>
</head>
<body>
  <div class="card">
    <h1 style="margin:0;font-size:22px;">平头哥</h1>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
    <b>我会什么</b><br>
    &nbsp;&nbsp;· HTML 结构与语义标签<br>
    &nbsp;&nbsp;· 页面排版与移动端适配<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
    <b>找我</b><br>
    &nbsp;&nbsp;邮箱 pingtouge@example.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    坐标 杭州&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;微信 pingtouge_wechat
  </div>
</body>
</html>

窄屏下这一坨会立刻现形:一串 &nbsp; 是不可断行的整体,手机宽度不够时它不折行,直接把卡片撑出横向滚动条。间距交给样式写,内容才交给 HTML 写------这是前面十几天一直在说的那条分工线。我自己带的一个学员,名片页在电脑上看着挺好,发到手机上右边一整列联系方式要左右拖,原因就是那十几个手敲的空格。

拿标尺量一遍你自己的页面

先定三个数:正文、组内、组间

填样式之前先把这张表抄进笔记,它比任何设计规范都管用:

用途 建议值 为什么是这个数
正文行高 1.6 ~ 1.9 中文字形方正,行距小于 1.6 容易串行
标题行高 1.2 左右 标题字号大,乘出来的实际距离已经够
组内间距 4 ~ 8px 表示这几行是一伙的
组间间距 20 ~ 32px 必须明显大于组内,否则分组失效
卡片内边距 24 ~ 32px 小于 20px 会像被裁过

DevTools 里选中一个元素,右侧盒模型图会直接把 margin、border、padding、内容宽四圈数字标出来;鼠标悬停在页面上时,margin 显示为橙色,padding 显示为绿色。三个动作练手感:

  1. 悬停看你觉得"太挤"的那一段,看绿色的 padding 有没有,数字是多少。

  2. line-height 从 1.75 一路往下调,每改一次刷新,亲眼看到"还能读"和"读不下去"的临界点在哪。

  3. 把某两个相邻块的 margin 改成同一个值(比如全 20px),感受分组信息消失后的样子------这一条比任何讲解都管用。

间距这件事没有标准答案,只有"够不够用"。判断标准也很朴素:截图发给一个不认识的人,让他 3 秒内说出这页有几块内容。说不出,就是距离没拉开。

留个作业

拿你 Day 10 那个名片页做三件事。第一,只把 line-height 从浏览器默认的 normal 改成 1.8,截图存档。第二,给你的每个 section 加上 margin-bottom,自己定一个"组内距离"和一个"组间距离",两个数字必须不同。第三,把页面里所有 <br>&nbsp; 删干净,改用 padding 和 margin 补回原来的观感。做完把 v0 和最终版两张截图并排放好------Day 14 综合实战要用它当起点。

参考资料


相关推荐
工具派1 小时前
markdown在线编辑器怎么选?渲染管线的3个坑和md转PDF跑版记录
前端·后端
一位正在转型AI全栈的前端工程师1 小时前
AI 全栈学习之旅 -Week 9:什么是AI Agent?从Function Calling到LangGraph
前端·python
具身AGI1 小时前
第一视角数据从哪来,物理AI 人类学习路线 的入口
人工智能·深度学习·学习
计算机魔术师1 小时前
Claude Opus 5 干不过人类客服?23.9% 的通过率撕开 Agent 真相
前端
黑马程序员毕设1 小时前
基于Java的仪器管理系统设计与实现
java·开发语言·spring boot·后端·微信小程序
平头哥AI1 小时前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang
cjy0001112 小时前
2026年9月零基础能听懂国内 FDE 讲师的课吗?
大数据·前端·人工智能·fde
asdzx672 小时前
Python 实现 PDF 文本查找与高亮标注
开发语言·python·pdf
zander2582 小时前
LeetCode 1143. 最长公共子序列
开发语言·python·算法