1. HTML 练手第一步:把文档骨架写进肌肉记忆
HTML 这个东西,跟我刚开始学的时候一样,很多人第一反应就是"这有什么好练的?不就是几个标签吗?"但真正的问题是:标签认得,页面写不好。我从带练习营的经验来看,能稳定写出规范骨架的人,后面学 CSS、JS 都会顺很多。所以我把"骨架练习"放在第一个,不是没道理的——基础质不质量,全看这一脚能不能踩稳。
1.1 为什么骨架比标签更重要
先看一份规范骨架:
<!doctype html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>我的第一个练习页</title> </head> <body> <h1>Hello HTML</h1> </body> </html>这份代码里每一个细节都有讲究。<!doctype html>告诉浏览器用标准模式渲染,不写它就可能进入怪癖模式,边距、盒模型全乱。你去看热搜里反复出现的各种代码模板,几乎都带着这串开头,但很多人只是复制粘贴,根本没有理解它为什么存在。lang="zh-cn"告诉辅助技术和搜索引擎页面语言是简体中文;charset="utf-8"一旦搞错,中文全是乱码;viewport这一行在移动端页面里几乎是必须的。
练习方法不值钱,但真的管用:新建一个文件,把骨架手敲三遍,不要复制粘贴。去背<!doctype html>的位置,练到条件反射。这个过程看起来蠢,但撑起了后面所有的调试基础。你以后写任何页面,都要从这段骨架开始,能不看参考敲出来,才算过关。
1.2 语义化标签:div 不是万能药
有一类练习页我几乎每天都能在各种地方见到,整个页面从顶到底全是 div 套 div,再加上 class 命名为 a1、a2、b1。能显示,但可读性和可维护性差到极点。HTML5 提供的语义化标签不是摆设,header、nav、main、article、section、aside、footer,每个都有明确的使用场景。
我的建议是拿一个简单博客页来练:顶部 header 放站点名,nav 放导航,main 里放一篇文章用 article,文章分节用 section,侧边栏用 aside,底部版权用 footer。练习时逼自己一把:除了包装用的容器,不许使用 div。这个过程能让你真正理解"为什么要有语义化标签":屏幕阅读器依赖它跳转,搜索引擎依赖它理解内容结构,团队协作时别人一看标签就知道哪里是导航、哪里是正文。
表格对比一下常见标签的适用场景:
| 标签 | 典型用途 | 常见错误 |
|---|---|---|
| header | 页首、板块头部 | 把 header 包住整个页面 |
| nav | 导航链接集合 | 把 logo 也塞进 nav |
| main | 页面主体内容,每页只允许一个 | 在多个页面重复嵌套 main |
| section | 有清晰主题的分区 | 纯粹当 div 用 |
| article | 可以独立成篇的内容 | 内容依赖上下文也硬用 |
| aside | 侧边栏、补充信息 | 把主内容塞进去 |
| footer | 页脚、作者信息 | 在 main 内部到处乱放 |
1.3 文本与链接排版练习:一个最小博客页
等骨架和语义标签都练熟了,就做一个最小博客页:标题、作者、日期、三段正文、一个""的超链接。这个练习要验证的是标题层级 h1 到 h6 的合理使用:h1 每页只出现一次,文章内用 h2 分小节,小节下的小标题用 h3。别一层嵌套一层,层级乱了,屏幕阅读器的用户会非常难受。
段落、强调、列表这些基础标签,每练一个就多写一个实际例句,不要光背定义。比如<strong>和<b>,视觉区别不算大,但 strong 表示强调,b 只是加粗;<em>和<i>同理。这些差异放到实际页面里,你会慢慢体会出来。链接练习也别只写一个<a href="#">,建议把相对路径、绝对路径、锚点跳转、新窗口打开加rel="noopener"这几个点各写一遍。做完这个练习,你的第一个静态页面就能交作业了。
2. 天气卡片练习:用一个小模块把 HTML、CSS、JS 串起来
练习 HTML 最大的误区是"只练 HTML"。实际上,纯静态的 HTML 做不出任何"会动"的东西,而你在热搜里看到的百度首页天气、一键返回顶部这些效果,全都是 HTML 打底、CSS 撑摸样、JS 干活的组合。所以第二个练习,我建议做一个天气卡片,它足够小,又能把三者全练到。
2.1 先拆需求:这只卡片到底要练什么
练习之前先想清楚目标。我给学生定的目标是:实现一张和百度首页天气模块相似的卡片,显示城市、当前温度、天气状况、最高最低温,再加一个点击按钮切换城市并更新数据。数据先用静态数组写死,不接后端。这样练习的重心就落在三件事上:用 HTML 把数据结构化地搭出来、用 CSS 把卡片画得像样、用 JS 完成一次简单的数据渲染和事件响应。
不要一开始就上 Vue、React 这类框架。框架的模板语法会掩盖你对原生 HTML 结构的理解,练基础语法阶段,原生三件套足够。
2.2 HTML 结构:先写结构,再谈美化
天气卡片的结构可以这样写:
<article class="weather-card"> <div class="weather-header"> <h2 class="city-name" id="city">北京</h2> <p class="update-time">更新于 09:30</p> </div> <div class="weather-main"> <span class="temperature" id="temp">26°</span> <span class="condition" id="condition">晴</span> </div> <div class="weather-detail"> <p>最高 <span id="max">30°</span></p> <p>最低 <span id="min">19°</span></p> </div> <button class="switch-btn" id="switchBtn">切换城市</button> </article>注意我给每个需要 JS 改动的节点都加了 id,这是练习阶段最直观的做法。id 相当于给节点发了一个"身份证",JS 用 getElementById 就能准确找到目标并更新。养成这个习惯,后面学 querySelector、学框架的事件绑定都会省事。
2.3 CSS:让卡片有"百度天气"的味道
百度首页天气模块的视觉特点很明确:卡片圆角、投影、信息分层、大号温度数字。CSS 部分重点练三样:flex 布局、border-radius 圆角、box-shadow 投影。
.weather-card { width: 300px; margin: 40px auto; padding: 20px; border-radius: 16px; background: linear-gradient(135deg, #4facfe, #00f2fe); color: #fff; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); } .weather-header, .weather-main, .weather-detail { display: flex; justify-content: space-between; align-items: center; } .temperature { font-size: 56px; font-weight: 700; }写完最好把浏览器窗口拉窄拉宽看看,观察 flex 在不同宽度下的表现。练习 flex 只背概念没用,真正理解它是靠你反复调 justify-content、align-items、gap 这几个属性得出的手感。要让卡片在小屏幕上也好看,还可以加一条<meta name="viewport">配合 max-width,这是响应式最基础的一课。
2.4 JS:点击按钮更新数据,练事件和渲染
JS 部分先准备数据:
const cities = [ { name: '北京', temp: 26, condition: '晴', max: 30, min: 19 }, { name: '上海', temp: 29, condition: '多云', max: 33, min: 24 }, { name: '广州', temp: 33, condition: '雷阵雨', max: 35, min: 27 } ]; let index = 0; const btn = document.getElementById('switchBtn'); btn.addEventListener('click', function () { index = (index + 1) % cities.length; const city = cities[index]; document.getElementById('city').textContent = city.name; document.getElementById('temp').textContent = city.temp + '°'; document.getElementById('condition').textContent = city.condition; document.getElementById('max').textContent = city.max + '°'; document.getElementById('min').textContent = city.min + '°'; });这段代码练了三个基础点:数组与对象存取、addEventListener 事件绑定、textContent 更新节点。注意我用的是 textContent 而不是 innerHTML,因为这里只需要改文本,用 innerHTML 反而多留了一个注入隐患,虽然练习数据是自己写的,但好的习惯要从第一行代码就开始养。
2.5 可以再往下走的两步
第一步,把静态数据换成真实天气接口,练习 fetch 和 Promise,记得处理加载失败的情况;第二步,把按钮换成三个城市 Tab,练习通过 classList 切换高亮状态。这两步做完,你相当于用一个小练习把前端基础语法完整跑了一遍。很多人口中的"基础不牢",其实就是缺了这类把零散语法串成小项目的过渡练习。
3. 练习时的工具链:编辑器、预览和格式互转的实用备忘
HTML 练习本身写代码不难,真正困扰初学者的是环境:用什么编辑器、怎么实时预览、怎么把页面转成其他格式。热搜里出现"ubuntu的html编辑器""html格式转换wps表格""html转md""shell显示html",说明这些是真实需求,我按使用场景逐个说。
3.1 Linux/Ubuntu 下编辑器怎么选
如果你用的是 Ubuntu,最省心的方案是 Visual Studio Code,装一个 Live Server 插件就能在浏览器里实时刷新。较轻量的时候可以用 Sublime Text,vim 适合纯终端环境,但新手期不建议直接拿 vim 练手,容易把精力耗在操作上。系统自带的 gedit 也能编辑,只是没有高亮和补全,体验差很多。
我的建议很直接:编辑器选一个能立刻上手且带语法高亮、代码补全的就行,不用盲目追新。关键是把 HTML、CSS、JS 三个文件分开建,练习目录结构保持干净,比如:
weather/ index.html style.css app.js这个习惯看着简单,但能避免后面出现"把样式全写在 HTML 里,越写越长最后找不到在哪改"的局面。
3.2 data:text/html 的临时验证技巧
有时候你并不想新建文件,只想快速验证一段 HTML 片段,这时直接在浏览器地址栏输入data:text/html,开头的内容就能渲染。比如:
data:text/html,<h1>你好</h1><p style="color:red">这是一个临时页面</p>把这段粘贴到浏览器地址栏回车,就能看到渲染结果。配合 URL 编码可以把多行 HTML 塞进去。这个方法很适合在手机上临时看效果、或者在聊天工具里给别人演示一段代码。别小看这个技巧,它出镜率很高,说明很多人想把零散的 HTML 片段快速变成可见页面。
3.3 HTML 转 Markdown、转 WPS 表格
写博客或整理笔记时,经常要把网上的 HTML 内容转成 Markdown。工具上首选 pandoc,命令很简单:
pandoc input.html -o output.md如果只是少量内容,在线转换工具或者浏览器插件也行,但要注意表格、图片路径、代码块这些结构在不同转换器里质量差异很大。我的习惯是转完一定人工检查一遍,尤其是代码块和标题层级。
HTML 转 WPS/Excel 表格则更适合用 Python pandas 读取 HTML 中的表格:
import pandas as pd dfs = pd.read_html('report.html') for i, df in enumerate(dfs): df.to_excel(f'report_{i}.xlsx', index=False)pandas 会自动识别页面里的<table>并转成 DataFrame,最后导出 xlsx。这一套做数据报表的同学应该很熟,但很多人没想到 HTML 也是它的数据源之一。
3.4 打包多个 HTML 页面时的路径问题
"打包多个 html"这个热搜词背后,通常是做了一组静态页面,最后要发出去或者交给别人。有两种情况:一是项目里有多个 html 文件互相链接;二是要把整个目录压缩成一个包。先说路径,很多新手喜欢用绝对路径写src="/images/logo.png"或href="/page.html",一旦整个目录被放到子目录或者直接打开,路径就失效。正确的做法是写相对路径:
<img src="images/logo.png" alt="logo"> <a href="page2.html">下一页</a>把所有 html、css、js、图片按目录整理好,再用 zip 压缩即可。预览打包结果时,不要直接双击 html,那样有些浏览器会限制本地资源加载,正确的做法是在目录里起一个本地静态服务器:
python3 -m http.server 8000然后浏览器访问 http://localhost:8000。这能模拟真实的网页环境,也能排查出相对路径写错、资源 404 这类问题。这个习惯在练习阶段就该养成,能帮你避免"我这里能打开,发给别人就打不开"的尴尬。
3.5 终端和桌面程序里的 HTML 渲染
热搜里的"shell显示html"和"pyqt5显示html"其实指向同一件事:HTML 不只是网页的专利,它也可以作为格式文本在其他环境里渲染。在终端里,可以用 w3m、lynx 这样的文本浏览器查看 HTML 的纯文本结构,适合在服务器上快速检查内容;也可以把 HTML 转成文本用 sed 粗处理,但格式复杂时不推荐。
pyqt5 里显示 HTML 则有两种常见做法:简单文本用 QTextBrowser 的 setHtml() 方法,复杂页面用 QWebEngineView 加载 URL。QWebEngineView 本质上是一个内置 Chromium 内核,所以能运行完整的 HTML、CSS、JS。这个练习适合做桌面应用的同学,比如把本地的报表页面直接嵌进 PyQt 窗口,省去自己用 Qt 控件画界面的功夫。这段代码可以照抄:
import sys from PyQt5.QtWebEngineWidgets import QWebEngineView from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) view = QWebEngineView() view.loadFile('index.html') view.resize(800, 600) view.show() sys.exit(app.exec_())这个方案的价值在于:你练的 HTML 技能,在桌面开发里也能复用,技能点不浪费。
4. 十个值得反复练的页面:从返回顶部到邮件模板
练习到了一定阶段,需要一份"按难度排好的菜单",不然容易陷入瞎练。我整理了一份个人觉得梯度合理的列表,其中"一键返回顶部"和"邮件模板"是热搜常客,单独展开讲,其余列出练习要点。
4.1 一键返回顶部:一个练滚动监听和节流的好题目
返回顶部按钮看起来简单,但值得练的细节不少。基本逻辑是:页面滚动超过一定距离后显示按钮,点击按钮平滑回到顶部。实现上涉及 scroll 事件监听、按钮显隐判断、window.scrollTo 平滑滚动。先看基础版:
const backTop = document.getElementById('backTop'); window.addEventListener('scroll', function () { if (window.scrollY > 400) { backTop.style.display = 'block'; } else { backTop.style.display = 'none'; } }); backTop.addEventListener('click', function () { window.scrollTo({ top: 0, behavior: 'smooth' }); });如果只是练习语法,这个版本够了。但如果想练得更深,就研究一下节流 throttle:scroll 事件在滚动过程中会以极高频率触发,每次触发都操作 DOM 会影响性能。自己实现一个简单的节流函数,或者用 requestAnimationFrame 来合并高频触发:
let ticking = false; window.addEventListener('scroll', function () { if (!ticking) { requestAnimationFrame(function () { // 更新显隐逻辑 ticking = false; }); ticking = true; } });这个小优化背后的思路,在图片懒加载、吸顶导航、无限滚动里全都用得上,值得当成一个专题练明白。
4.2 邮件模板:表格布局和内联样式的特训场
很多初学者不知道,HTML 邮件是不能随意用 div 和外部 CSS 的。主流的邮箱客户端对 CSS 支持非常弱,甚至会把<style>标签直接忽略。所以邮件模板的经典做法是用表格布局、内联样式、兼容性最好的属性。这个练习能倒逼你回到"最朴素的 HTML",对理解浏览器的渲染规则很有帮助。
一个最小可用的邮件模板骨架大致是:
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" bgcolor="#f4f4f4"> <tr> <td align="center" style="padding: 20px;"> <table width="600" style="max-width: 600px; background: #ffffff;"> <tr> <td style="padding: 20px; font-family: Arial, sans-serif; font-size: 16px;"> <h2>活动通知</h2> <p>这是一个 HTML 邮件模板。</p> <a href="#" style="display: inline-block; padding: 10px 20px; color: #ffffff; background: #ff6600; text-decoration: none;">立即查看</a> </td> </tr> </table> </td> </tr> </table>练习邮件模板时,请忘掉 flex 和 rem,老老实实用固定宽度表格和 px。做完这个练习你会发现,自己平时写页面时很少思考"哪些 CSS 特性在极端环境里会失效",而这种思考恰恰是做兼容性时最需要的。
4.3 其他六个练习:每个都是一个小专题
列一个表,把练习目标和检测标准写清楚,方便自测:
| 序号 | 练习题目 | 核心练习点 | 完成标准 |
|---|---|---|---|
| 1 | 折叠面板(手风琴) | classList 切换、事件代理 | 点一处只开一处,再点可关闭 |
| 2 | Tab 切换 | 自定义属性>
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设
2026/10/9 18:36:57
Cursor 扩展工具 Context7 MCP 接入 TaoToken 的配置与验证/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
网站建设
2026/10/9 18:35:09
Fluent Meshing水密工作流中Add Local Sizing实战指南如果你和我一样,每天要和 Fluent Meshing 打交道,那你一定遇到过这种场景:全局尺寸给到0.5mm,算下来网格量五百多万,看起来数值也没问题,但一到弯管处,边界层一拉,圆弧面网格完全看不…
网站建设
2026/10/9 18:32:11
三小时搞定AI工具开发:基于MCP的Node.js极简实践与TaoToken统一Key接入/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
网站建设
2026/10/9 18:29:30
DeepView MCP 接入 TRAE:把 MCP endpoint 改到 TaoToken 的配置与验证/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …
网站建设
2026/10/9 18:27:27
scikit-learn端到端机器学习实战:从CSV到可复现分类报告简介:本资源是《机器学习实战》经典教材的配套实践包,面向Python初学者、数据科学入门者及希望夯实机器学习算法实现能力的开发者,解决“学得懂理论、写不出代码”的核心痛点。压缩包共79个文件,含74个Python源码(覆盖…
网站建设
2026/10/9 18:26:45
5分钟手把手教你开发一个MCP服务:从零到接入TaoToken统一Key/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … |