HTML基础入门:从骨架标签到表单布局,一次掌握网页开发核心
先聊点实际的。网上随便一搜“HTML基础入门”蹦出来的几乎都是那一串!doctype htmlhtml langzh-cnheadmeta charsetutf-8开头的代码。很多新手看一眼就关掉觉得这堆尖括号比外语还难懂。其实这串东西就是整个网页的“地基”你以后想写个人主页、做节日祝福页面、甚至把网页嵌进自己的小程序里都绕不开它。我最初学HTML的时候也是对着这段骨架抄了整整一个礼拜才慢慢明白每个标签为什么存在、放在哪个位置有意义。这篇文章就按我自己踩过坑的顺序把HTML的骨架、常见标签、表单、页面效果、以及“HTML转成别的格式”这类实用场景挨个讲清楚目标是让你看完之后能独立写一个能双击打开、能发出去给别人看的页面。我不知道你是因为什么想学HTML。可能是为了给对象做一个爱心动效可能是中秋想写个祝福网页也可能只是工作需要把WPS表格转成网页格式。这些需求其实都没那么复杂它们的底层都是同一套东西HTML负责搭结构CSS负责化妆JavaScript负责让它动起来。我下面讲的每一个部分都会尽量把为什么这么做也讲明白而不是光扔给你一堆标签名。1. 从一个空文件到能跑的页面HTML骨架拆解1.1 先认识那行“!doctype html”很多网上复制的代码里写的是!doctype html规范写法其实是!DOCTYPE html。大小写不影响浏览器识别但我建议你按规范写显得专业。这一行叫“文档类型声明”它的作用就是告诉浏览器我这个页面用的是标准HTML你别再用老古董的那套“怪异模式”来解析我。怪异的解析模式会把你的CSS布局搞得一团糟尤其是宽高计算和盒模型经常对不上。以前还有!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN ...这种一长串的现在统统不用管新项目一律短声明。我自己见过最典型的例子有人把这一行删了结果页面在Chrome里正常换到同事的旧浏览器上就整个错位。加上DOCTYPE之后所有现代浏览器都会以标准模式渲染问题立刻消失。所以哪怕你别的什么都没写这行也先放上它是你所有HTML代码的大前提。1.2 head里藏的秘密charset、lang、title和viewporthead是页面的“配置区”里面的内容不会直接显示在页面上但每个标签都负责一件重要的事。meta charsetutf-8是中文网页的保命符。UTF-8是一个通用的字符编码几乎支持所有语言。如果你的HTML文件里没有这一行或者写成了GB2312很容易出现满屏乱码就是那种“”一样的符号。但注意HTML文件本身保存时也要用UTF-8编码。有时候你会遇到“meta写了还是乱码”的情况那通常是因为编辑器右下角把文件保存成了ANSI或GBK这时候手动把文件另存为UTF-8即可。html langzh-cn这个属性是告诉辅助设备和搜索引擎这个页面是简体中文。它对普通用户肉眼没什么影响但对无障碍阅读很重要而且能让翻译插件识别得更准。你还会看到langzh-hk或langen按自己的页面语言设置就行不用花太多心思。meta nameviewport contentwidthdevice-width, initial-scale1.0是移动端适配的标配。没有这行你用手机打开网页时浏览器会用默认的980像素宽度去渲染文字会变得很小需要手动缩放才能看清。加了这行之后页面宽度会跟随设备宽度手机浏览体验立刻正常。这个viewport在热搜里反复出现说明很多人已经意识到移动端有多重要了。head里还有一个title它是浏览器标签页上显示的文字也是搜索引擎结果里的大标题。这个必须写不写的话在浏览器里显示的是一堆路径发给别人看也很没面子。1.3 body才是你真正看到的页面body里面装的内容才是用户在浏览器里能看到的一切文字、图片、按钮、视频。body和head一样是html的子元素一个页面只能有一个body。我现在给你一个最小可运行页面你可以直接复制保存成index.html双击就能打开!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title我的第一个页面/title /head body h1你好HTML/h1 p这是正文能显示正常中文。/p a hrefhttps://www.example.com这是一个链接/a /body /html这个页面的结构就是一棵树html是所有内容的根head和body是它的两个大分支head里面是配置信息body里面是实际内容。你在浏览器里按F12打开开发者工具切到“Elements”标签看到的DOM树就是这么一层层嵌套的。理解了这棵树后面的所有标签都只是这棵树上的新分支。2. 新手必看常用标签和布局套路2.1 标题、段落、链接、图片、列表先把这些用熟HTML入门阶段你不需要背几十个标签先掌握下面这几个就够你做出像样的页面了。标题标签h1到h6一级到六级标题。注意它代表的是层级不是字号。h1是页面主标题一个页面最好只有一个h2是章节标题依次往下。段落标签p一段文字包在里面。千万别用br去强行换行除非你真的只是想在句子中间断一下行。链接标签a href地址文字/a。href是必填属性可以指向外网也可以指向本地文件还可以是#id实现页内跳转。图片标签img src图片路径 alt图片说明。alt属性不是摆设图片加载失败时会显示这行文字而且对无障碍很重要。列表标签无序列表ulli有序列表olli。做导航菜单、清单列表都会用到。我举个实际例子。你想做一个简单的自我介绍页面可以用这些标签搭出文字部分再加上CSS限制一下宽度、换个好看的背景色。下面这段CSS不是必须的但是加了之后页面会立刻变得不那么“原始”body { max-width: 720px; margin: 0 auto; padding: 20px; font-family: Arial, sans-serif; line-height: 1.6; }2.2 语义化标签和div/span的真正区别老HTML里喜欢用div把一块一块的内容框起来比如div idheader、div classcontent。现在HTML5提供了一批语义化标签header、nav、main、article、section、footer。它们的作用和div一样都是划分区域但名字自带含义代码可读性更高浏览器和搜索引擎也更容易理解你的页面结构。div和span的区别一句话能说清div是块级元素会独占一行span是行内元素不会换行通常用来包住一段文字中的某几个字方便单独加样式。你在布局的时候块级标签负责搭框架行内标签负责修饰局部。下面是一个标准的页面骨架示例header nav导航链接/nav /header main article h2文章标题/h2 p正文内容/p /article aside侧边栏/aside /main footer版权信息/footer这样的结构就算CSS还没写你和管理员都能一眼看出哪里是导航、哪里是正文。项目规模一大收益会非常明显。别等到后期再来重构一开始就养成语义化的习惯。2.3 HTML、CSS、JavaScript三兄弟怎么配合HTML只是结构就像一个毛坯房。CSS负责装修JS负责水电和智能家居。三者要合在一起才能做出真正的网站。在基础语法层面CSS可以写在单独的.css文件里用link引入也可以写在style标签里甚至能直接用style...写在标签上。JS同样可以写在单独的.js文件里或放在script标签中。新手阶段建议CSS和JS都写在新文件里让HTML保持干净。来看一个最简单的“三件套”演示点击按钮把页面上的文字换掉。p idmessage原来的文字/p button onclickchangeText()点我/button script function changeText() { document.getElementById(message).textContent 新的文字; } /script这里onclick属性里调用了changeText函数函数内部用getElementById找到了那个p标签并把里面的文字替换掉。这就是HTMLCSSJS协作的雏形。你后面看到的那些爱心代码、倒计时、回顶按钮本质上都是这种模式HTML提供按钮和容器CSS控制视觉JS处理交互。3. 表单类标签这样用才不容易出错3.1 form表单的基本结构很多新手写表单时容易忽略form标签直接在input上写来写去。这样页面外观看着没问题但数据根本不知道该往哪提交。一个完整的表单至少包含三部分form action/submit methodpost label forusername用户名/label input typetext idusername nameusername button typesubmit提交/button /formaction告诉浏览器把数据发到哪个地址method指定用GET还是POST方式发送。name属性必须写它相当于数据的键名——比如上面这个输入框提交给服务器时就会变成username用户输入的内容。如果没有name提交时这个字段会被丢弃。label是给每个输入控件贴个说明文字它的for属性要对应输入框的id。这样做的好处是你点“用户名”这三个字时输入框会自动获得焦点对鼠标用户和手机用户都很友好。3.2 下拉菜单和常用控件热搜里“HTML语言下拉菜单”其实就是select配合option。它的典型写法是select namecity idcity option valuebeijing北京/option option valueshanghai selected上海/option option valueguangzhou广州/option /selectvalue是真正提交的值selected表示默认选中。如果不写value提交的就是标签里显示的文字这在很多场景下并不合适。另外你可以给select加上multiple属性变成多选但用户体验一般不推荐新手用。其它常用控件我列成一张表你可以直接存着对照参考控件类型标签写法说明单行文本input typetext最常用密码框input typepassword输入内容显示为圆点单选按钮input typeradio namegender同一组的 name 必须相同复选按钮input typecheckbox可多选多行文本textarea rows5适合留言、备注隐藏字段input typehidden提交时传固定值但页面不可见数字输入input typenumber手机端会弹数字键盘我特别想提醒一点单选按钮的name如果不一样浏览器就认为它们是不同组可以同时选中这是新手最容易踩的坑。务必让同一组单选控件使用同一个name。3.3 把WPS表格数据转成HTML表格/表单的小技巧热搜里“html格式转换wps表格”这类需求说明很多人手里有现成的表格数据想做成网页展示。这里分两种情况第一种你只是想展示数据表格。直接在WPS或Excel里选中数据区域复制然后粘贴到网页编辑区的设计视图里很多编辑器会自动转成table代码。但如果你用的纯文本编辑器这个方法就不灵了。更稳的办法是把表格另存为CSV文件然后写一个简单脚本生成HTML的table或者用Excel的“另存为网页”功能选“.html”格式WPS会自动生成一个包含table的页面。生成的代码里通常会有大量内联样式能跑起来但很乱建议只作为临时方案。第二种你想把表格变成“数据录入表单”。那就不能用复制粘贴了需要根据每一列的数据类型手动设计对应的输入控件。比如“姓名”列用文本框“性别”列用两个单选按钮“城市”列用下拉菜单。这是正经的前端开发工作逻辑不复杂但需要细心。我自己的做法是先找一张纸质表格录入需求把每一列的数据类型标出来再对照上面的控件表选择合适的标签最后一定要测试提交的数据键名和列名一一对应。这里再补充一个HTML表格标签的基础样式方便你快速套用table border1 tr th姓名/th th城市/th /tr tr td张三/td td北京/td /tr /tabletr代表一行th是表头td是普通单元格。别把th和td搞混表头默认会加粗居中。4. 节日页面和动态效果把HTML玩出花4.1 一键返回顶部算法其实没那么神秘很多网页右下角都有一个回顶按钮点一下就能平滑回到顶部。这个需求的背后算法非常直接滚动事件判断当前位置然后调用滚动方法。最简单可靠的实现是button idbackTop styledisplay:none; position:fixed; right:20px; bottom:20px;返回顶部/button script const backTop document.getElementById(backTop); window.addEventListener(scroll, () { if (window.scrollY 300) { backTop.style.display block; } else { backTop.style.display none; } }); backTop.addEventListener(click, () { window.scrollTo({ top: 0, behavior: smooth }); }); /script这里window.scrollY是当前滚动的像素距离scrollTo是平滑滚动方法behavior: smooth就是动画过渡。你可能会看到网上有人写document.documentElement.scrollTop 0那是老办法瞬间跳转体验很生硬。我强烈建议优先用scrollTo加behavior。还有一个“算法”相关问题很多人想用window.close()在加载页面后自动关闭当前标签页。注意window.close()只能关掉脚本自己打开的窗口普通用户直接打开的页面浏览器出于安全考虑是禁止关闭的。热搜里那段window.onloadfunction(){setTimeout((){window.close();},500);}在某些特定场景下会生效但你在自己电脑上双击HTML文件时大概率没反应。别纠结这个这是浏览器规则决定的。4.2 爱心代码、中秋祝福、生日页面的通用套路每年节假日都会冒出一堆HTML小页面什么“爱心代码大全”、“中秋节快乐html代码”、“生日快乐html网页”。你别看那些效果花花绿绿拆开之后无非是三样东西基础标签搭内容、CSS做动画外观、JS控制生成和交互。拿最简单的“中秋祝福页面”举例你可以这样做一个圆形div当作月亮加一行祝福文字再用CSS的animation做一个文字浮出的动画。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title中秋祝福/title style body { background: #0b1026; color: #fff; text-align: center; padding-top: 80px; } .moon { width: 120px; height: 120px; background: #f5e7b2; border-radius: 50%; margin: 0 auto; box-shadow: 0 0 30px #f5e7b2; } .msg { margin-top: 30px; font-size: 24px; opacity: 0; animation: fadeIn 2s forwards; } keyframes fadeIn { to { opacity: 1; transform: translateY(10px); } } /style /head body div classmoon/div p classmsg中秋快乐愿人月两团圆。/p /body /html爱心代码通常会复杂一些但思路也一样。你用CSS画一个爱心的形状再用JavaScript定时生成一些飘浮的小爱心或者用Canvas粒子组成大爱心。注意Canvas是一块画布通过JavaScript在画布上不断绘制和刷新如果你完全没接触过先不用追求太复杂的粒子效果从“CSS爱心”开始练手就行。给一个CSS画爱心的极简思路一个正方形绕中心旋转45度再用两个圆润的圆角遮罩.heart { width: 40px; height: 40px; background: red; transform: rotate(45deg); position: relative; } .heart::before, .heart::after { content: ; width: 40px; height: 40px; border-radius: 50%; background: red; position: absolute; } .heart::before { top: -20px; left: 0; } .heart::after { left: -20px; top: 0; }这些节日页面的核心是“色彩动画情绪文案”HTML部分反而是最简单的。你掌握了我前面说的基础结构再套一个CSS动画就能做出八成的效果。5. HTML转md、邮件模板、嵌入程序那些实用变形5.1 HTML转markdown适合写技术文档和博客写技术博客时经常需要把网页内容转成Markdown格式。如果你用的HTML是自己写的结构又简单那我建议手动复制文本再补上#标题符号几分钟就搞定。但如果页面很复杂标签嵌套多用工具更靠谱。我常用的方案是Python里的html2text库import html2text converter html2text.HTML2Text() converter.ignore_links False markdown_text converter.handle(htmlbodyh1标题/h1p内容/p/body/html) print(markdown_text)它会自动把h1转成#把p转成文本段落把a转成[文字](链接)。处理稍微复杂点的页面时出来的格式还需要微调但至少能省掉大半手工活。如果你不想写代码还有一些在线工具可以直接粘贴HTML、输出md我自己不太推荐传敏感页面但本地内容无所谓。另外很多现代编辑器比如VS Code支持“贴HTML转Markdown”的插件操作起来也很快。5.2 用PyQt5显示HTML把网页嵌进桌面程序有些朋友搜索“pyqt5显示html”多半是想用Python做个带界面的小工具又希望界面用HTML来排版。这个想法完全可行而且比一个个摆控件效率高。PyQt5里最简单的组件是QTextBrowser它支持一小部分HTML标签适合显示富文本。如果想渲染完整的网页需要用QWebEngineView内核是Chromium几乎什么现代网页都能跑。注意QWebEngineView不在PyQt5主包里要额外安装PyQtWebEngine。下面是一个最简单的例子import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtWebEngineWidgets import QWebEngineView html !DOCTYPE html html langzh-CN headmeta charsetUTF-8title嵌入的页面/title/head body h1来自PyQt5/h1 p这是用HTML写的界面。/p /body /html app QApplication(sys.argv) window QMainWindow() web QWebEngineView() web.setHtml(html) window.setCentralWidget(web) window.show() sys.exit(app.exec_())setHtml()会直接把字符串当成一个网页加载。注意如果你要加载本地图片或脚本最好用setHtml(html, baseUrl)传入一个基准URL否则资源路径可能会解析不到。我在实际项目里用这个方式写过一个小型数据统计工具界面用HTMLCSS画图表比QTableWidget美观多了。5.3 做邮件HTML和做网页完全两种思路“html邮件”也是一类高频需求但邮件和网页的差别非常大。邮件客户端的渲染能力非常保守Gmail、Outlook这些主流客户端基本不支持JavaScript甚至连很多CSS属性都不认。我给你的建议是做邮件HTML放弃div布局回归table嵌套并且全部使用内联样式。一个简化可用的邮件模板开头长这样!DOCTYPE html html langzh-CN head meta charsetUTF-8 title邮件内容/title /head body stylemargin:0; padding:0; background-color:#f4f4f4; table width600 cellpadding0 cellspacing0 aligncenter stylebackground-color:#ffffff; font-family:Arial, sans-serif; tr td stylepadding:20px; h1 stylemargin:0 0 10px; font-size:20px;邮件标题/h1 p stylemargin:0; font-size:14px; color:#333;这里是邮件正文。/p /td /tr /table /body /html为什么要这样写因为表格布局在邮件客户端里兼容性最好cellpadding和cellspacing不会像CSS那样被过滤。图片的话尽量上传到服务器后使用绝对路径本地图片路径在邮件客户端里根本显示不出来。很多营销邮件的代码看起来像上世纪90年代不是他们技术落后而是为了顺应邮件客户端。6. 踩坑实录乱码、路径、脚本不生效怎么查6.1 标签闭合和嵌套HTML的容错能力很强有时候你写错了浏览器也能显示但这种“宽容”最容易埋坑。最常见的错误是标签不闭合写了div却忘了写/div后面所有内容都会被它“吞”进这个div里CSS样式也会跟着错位。我见过有人写了很长一个列表最后缺个/ul结果整个页面的布局全部乱套。第二个高发问题是嵌套不合理。比如把p标签里直接塞一个div这属于非法嵌套浏览器会强行把/p拆开最终结构的DOM和你的预期完全不同。你可以用F12的Elements面板看实际渲染出来的结构会发现浏览器帮你“纠正”了很多但纠正的结果根本不是你想要的样子。我的经验是写完一段结构就去看一次Elements面板确认每个标签都按你设想的层级排列。6.2 编码乱码和路径问题编码问题前文提到过这里再补充一个排查顺序。看到乱码后第一步删掉原来的meta charset改成meta charsetUTF-8第二步检查HTML文件本身是不是UTF-8保存第三步如果页面是动态生成的再查服务器返回的HTTP头里的Content-Type有没有指定charsetutf-8。我遇到过本地打开正常、放到服务器上就乱码的情况多半是服务器或数据库统一处理编码时出了岔子和HTML文件本身无关。路径问题主要发生在img和script标签上。相对路径./images/a.jpg表示当前目录下的images文件夹../images/a.jpg表示上一级目录。新手容易把在线复制来的src/images/a.jpg当成相对路径实际上这种以斜杠开头的写法表示网站根目录本地双击文件时根本找不到图片就裂了。排查时先看浏览器Console里的404报错再对照文件所在位置调整路径。6.3 使用浏览器开发者工具定位问题强烈建议所有新手从第一天就养成按F12的习惯。它不只是一个老师傅的玩具更是你排查所有HTML问题的利器。Elements面板查看和临时修改DOM结构、CSS样式。点中任意元素右侧会显示它的所有样式你可以临时勾选或修改页面会立刻刷新效果。Console面板看JS报错和网络请求报错。红色报错信息会告诉你哪一行出了问题。比如某个函数未定义这里会写得很明确。Network面板看页面里所有请求的状态。图片404、样式表加载失败在这里一眼就能看出来。我调试自己的前端页面时90%的时间是在Elements和Console之间来回切。写HTML出错并不可怕可怕的是你不看报错信息凭感觉乱改。学会看F12你的排错速度能提升十倍。6.4 脚本不生效的常见原因脚本不生效先看Console的报错最常见的原因有这么几个脚本放在了head里并且直接操作了body里的元素。此时页面还没加载完getElementById自然找不到元素。解决办法是把script放到/body前面或者监听DOMContentLoaded事件。函数名拼写不一致。HTML标签里的onclick和JS里定义的函数名必须一模一样多一个字母少一个字母都会静默失败。变量名冲突。你定义了一个let message可能在引入的外部脚本里也有同名变量浏览器会报错或者覆盖。自动关闭页面那个问题前面已经说过浏览器安全策略不让关。风靡一时的setTimeout自动关闭脚本只对window.open()打开的窗口有效。你以后遇到类似需求先判断这个窗口来源再决定用不用window.close()。我自己带过不少新人发现他们遇到问题第一反应是“重装浏览器”或者“换编辑器”其实80%的问题都在开发者工具里写着答案。把报错信息看懂比背一百个标签都有用。这里再分享一个我早期学HTML时的小习惯看到任何一个好看的网页我不急着收藏而是按F12把它的结构拆开看一遍。就算看不完全懂也能理解“原来这个图是这么摆的”、“这段文字为什么会被挤下来”。慢慢积累你的直观感觉会变得非常准。HTML的入门门槛其实很低难的是你愿不愿意动手去敲第一行代码、去查第一次报错。把这篇里的例子挨个敲一遍你就能拥有自己的第一个真正常用的网页了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →