资讯动态

前端三件套实战:从零构建一个带交互的博客页面

发布时间:2026/10/17 7:57:35 来源:尧图企业网站定制
看到“web第三次作业”这个标题时大多数人跟前两次的心态差不多——又来了个网页活儿改改文字、调调颜色差不多就交了吧。真正打开题目文档的那一刻才反应过来这次和前两次完全不同不再有人递给你半成品模板HTML、CSS、JavaScript三件套全部要从零组织最终要交付的是一个带交互逻辑的完整页面。我是在截止前两天正式动手的当中熬了一个大夜才把标签筛选、表单校验和移动端布局彻底理顺。这篇文章就把我从破题到提交的完整过程拆开讲一遍包含需求拆解、页面规划、语义化骨架、布局选型、原生JavaScript交互、响应式适配以及最后几乎救了我一命的提交前自查清单。如果你正在为课程作业或者手头第一个正经前端小项目发愁这篇就是照着就能用的实操参考。1. 破题第三次作业到底在考什么1.1 前两次作业是热身第三次才是正面交锋我一直觉得课程作业的设计是有节奏的。第一次作业练的是单个器官比如让你用十几个标签写自我介绍目的是认识HTML第二次作业练的是造型能力比如给某段文字配颜色、加边框、调字体目的是熟悉CSS。到了第三次题目开始要求“综合运用”。我这次拿到的需求是这样的做一个个人博客主页页面必须包含导航栏、文章列表、侧边栏和页脚文章要支持按标签筛选页面上要有一个留言表单提交前必须做前端校验整个页面在手机端要呈现完全不同的布局。看完这个题目我脑子里跳出来的第一句话是这不就是一个微型网站吗。这种从“点”到“面”的跨越正是让很多人熬夜的根本原因。因为你要面对的已经不是“某个标签怎么写”而是“一个页面如何被组织起来”。组织这件事没有标准答案全靠自己试错。所以我建议所有正在做类似作业的同学先别急着打开编辑器先花半小时把题目吃透。1.2 读懂题目里的评分风向作业文档里其实藏着得分的密码。我这份题目拆开看评分维度基本是四块结构语义化、样式还原度、交互完成度、代码规范。结构语义化占的比重不低这意味着你不能把所有东西都塞进div里。该用header、nav、main、article、aside、footer的位置必须用对标签浏览器和阅读器才能理解你页面的层级。样式还原度考验的是耐心字体大小、行高、间距、圆角、阴影这些细碎的地方最容易被放大镜挑毛病。交互完成度最直白筛选必须真的能筛表单必须真的能拦下错误输入只做摆样子是过不了关的。代码规范听起来虚实际上看的是变量命名、缩进风格、注释质量和文件组织方式。搞清楚这四点你的精力分配就有了依据不至于花三个小时去调一个没人在意的渐变色。1.3 开工前先列一张验收清单我的习惯是先不写代码把需求翻译成一张可以逐项打勾的验收清单。页面上必须有哪些区块每个区块里放什么内容哪些功能是硬性要求哪些属于加分项全部写下来。这张清单帮我避免了一个非常现实的问题写到一半的时候真的会忘记某个区块的细节回头看一眼清单思路就能被拽回来。做完清单之后我还粗略估算了一下工作量写HTML骨架一小时CSS布局两小时JavaScript交互两小时响应式一个半小时最后留一小时做检查和微调。后来实际走下来这个预估基本准确唯一超时的是表单验证比预想多花了一个小时。2. 开工前的大脑体操需求拆解与页面蓝图2.1 把题目语言翻译成技术语言拿到需求之后我做的第一件事不是写div而是把题目里的“人话”翻译成“项目语言”。题目说做一个“博客主页”翻译过来就是要有信息列表和导航结构“按标签筛选”翻译过来就是JavaScript管理一组文章数据根据点击的标签动态更新页面“带校验的表单”翻译过来就是监听提交事件、读取输入值、执行规则判断、把结果反馈给用户。这层翻译特别重要因为直接从中文需求想代码脑子里全是“页面”“功能”这类模糊概念。翻译成数据结构、事件、渲染这些词之后代码结构就自己长出来了数据放哪、事件挂在哪、渲染写在哪全部有了线索。我后来写的很多前端小项目起点都是这种翻译练习。所以真心建议不管作业多小都先做这一步它能让你少走一半弯路。2.2 页面布局先在草稿纸上跑一遍我没有用任何画图工具就拿了张草稿纸把桌面端的页面从上到下画了一遍最上方是导航栏中间区域分左右两栏左边是主体区放文章卡片右边是侧边栏放个人简介和标签列表最下面是页脚。画完桌面端我又画了一遍移动端导航栏收成汉堡菜单文章卡片改单列侧边栏挪到文章列表的下方。画这两张草稿的价值在于我提前想清楚了桌面端和移动端的结构差异。题目要求两种布局意味着HTML结构必须同时兼容两种形态。如果我在HTML阶段把侧边栏放在了页脚后面后面做响应式就会非常痛苦。草稿帮我预判了这个问题所以我写HTML时侧边栏和文章列表的主体顺序处理得很有预见性后面做移动端布局几乎没改结构。2.3 先想数据再想页面这次作业里我给自己增加了一个额外要求把文章数据独立管理。写页面之前我先定义了文章数组每篇文章包含标题、摘要、时间和标签这几个字段。标签在侧边栏里需要单独生成列表所以我又单独定义了一份标签数组。这个设计的直接好处是做标签筛选功能时我只需要遍历数组、重新渲染不需要在HTML里到处找节点。导航栏和页脚这种多个页面共用的部分我也用JavaScript统一生成后续如果改导航链接只需改一处。这个“数据先行”的习惯是这次作业里我最看重的收获。它不需要多高深的技术但把数据和视图分离之后整个页面的逻辑清楚了一个档次也为我后面接触框架打了个底子。3. HTML骨架别让基础标签拖后腿3.1 语义化标签的选型思路HTML部分看起来最不起眼反而是丢分重灾区。很多同学的页面打开源代码一堆div和span层层嵌套浏览器能正常显示但语义化这一项直接扣分。我这次严格按照语义走顶部用header包裹导航中间主体用main右侧侧边栏用aside底部用footer博客文章列表里每篇用article标题用h2摘要用p。标签选择背后是有逻辑的。header、footer让浏览器识别页眉和页脚nav让屏幕阅读器知道这里是导航article表示一块独立的、可复用的内容单元。这些语义标签对比div的唯一优势就是它们自带含义。写的时候多花两秒钟选对标签既能让评分软件满意也能让阅读器用户真正看懂页面。这种习惯在工作后同样重要因为搜索引擎和辅助工具都依赖这种结构。3.2 表单结构验证功能的地基表单是这次作业里交互最重的部分结构上容易写乱。我设计的留言表单包含三个字段昵称、邮箱、留言内容。每个字段都是label和input或者textarea的组合label的for属性必须和对应输入框的id完全一致否则点击文字无法聚焦到输入框。这是很多同学会忽略的小细节但对用户体验的影响很直接。为了不让浏览器自带的提示气泡干扰自写的校验逻辑我在form上加了novalidate属性并把action属性留空。form的默认行为是提交并跳转这次作业要做的是纯前端演示所以我会在JavaScript里拦截submit事件。这几个小设置单个都不复杂组合起来是表单逻辑正常运转的前提。3.3 一个衡量骨架质量的小测试HTML写完我习惯做一个小测试把CSS和JavaScript全部注释掉再重新加载页面。去掉样式之后如果内容依然有顺序、有重点阅读起来是流畅的说明骨架合格如果页面变成一堆没有层级的文本碎片说明结构失败。我这次写完后直接通过测试。文章标题排在摘要前面摘要后面跟着时间和标签侧边栏的个人简介和标签列表也有清晰顺序。这个测试是我从前一个带我的前端同事那里学来的他当时说了句话我一直记得好的HTML是一件脱了外套也很体面的衬衫而不是靠CSS这件大衣才能遮丑的背心。这句话后来成了我写所有前端页面的基本准则。4. CSS布局从“能看出个形”到“对得起观众”4.1 Flex还是Grid我两个都用了布局阶段最纠结的问题就是选Flex还是Grid。我最后的选择是两个都用页面整体用Grid局部组件内部用Flex。理由其实很实际。页面级布局要解决的是主体区和侧边栏的左右分栏Grid的grid-template-columns一行代码就能按比例分隔两栏而且它在定义行列结构上更直接。而文章卡片内部我需要处理标题、摘要、标签、按钮之间的对齐和排列这种一维方向的排列是Flex的强项。这种“大处Grid、小处Flex”的分工也是实际项目里最常见的形式。你不用纠结谁更高级只需要选择最方便实现目标的那个。4.2 盒模型和间距的精细控制页面看起来业余有相当一部分原因是间距失控。我刚写完布局时padding和margin都是随手写的出来的效果像被打翻的盒子拼在一起。后来我给自己定了两条规则区块与区块之间的间距用margin区块内部的留白用padding。举个例子文章列表和侧边栏之间留出的空隙用margin文章卡片内部到边界的距离用padding。规则一执行页面立刻整齐起来。另一件必须做的事是给所有元素设置box-sizing: border-box。这个属性会让宽高计算包含padding和border不至于出现“宽度定了加上padding就溢出”的老问题。新手经常在这个细节上栽跟头但它恰恰是布局翻车的头号原因。4.3 视觉层级字体、颜色、留白字体和颜色决定第一观感我在这块没搞花哨设计主要靠干净。字体选了系统字体栈就是一串字体列表根据不同操作系统自动匹配不需要加载外部字体文件速度也快。字号上做了严格的层级页面标题最大文章标题次之摘要和侧边栏文字最小。这个层级本身就会告诉用户“先看什么、再看什么”。颜色方面我在根选择器里定义了三个CSS变量主色、辅助色、文字色。后面所有地方都引用变量而不是直接写具体颜色值。好处很明显做到一半想换主题色改一行定义即可不需要满篇替换。留白方面区块之间至少留24像素卡片内部留16像素。这些数值看起来很普通但组合在一起就是“看着舒服”的来源。视觉这种东西三分靠审美七分靠克制。5. JavaScript交互选择器、事件与渲染逻辑5.1 数据管理筛选功能的底层逻辑做标签筛选时我给自己定的原则是操作数据而不是操作DOM。意思就是筛选的时候我不会去遍历页面上的DOM节点而是先遍历文章数组把符合条件的数据过滤出来再重新渲染列表。这个思路听起来简单做起来需要一点点克制。因为遍历DOM是人的直觉反应但这样会让逻辑和数据耦合在一起后面改需求就乱了。我把文章数据放在一个数组里筛选函数只负责返回新的数组渲染函数只负责把数组显示成HTML。职责分离了改起来就快了。这个思想在框架里被包装得更自动但本质完全一致现在提前内化对以后学框架极有帮助。5.2 渲染方式避开字符串拼接的坑关于“怎么把数据变成页面”我踩过一个印象深刻的坑。一开始图快用innerHTML拼接字符串结果文章摘要里如果出现了特殊字符页面解析就会出错严重一点还可能被脚本注入。虽然作业里用的都是自己写的数据但习惯得从早期就养好。正确做法是创建元素节点然后逐个把文本内容塞进去。用document.createElement创建article再创建h3、p这样的子节点用textContent赋值文本。这样浏览器会把内容当纯文本处理不存在注入风险。代码多了几行但安全性和可读性都上去了。我现在写任何涉及动态渲染的页面都默认走这条路。5.3 事件委托动态内容的唯一解文章列表里的“”按钮是动态生成的如果每次渲染后都给按钮单独绑事件数据一变就要重新绑定还容易重复绑定。我这次用的是事件委托把监听器绑在列表的父容器上点击发生时通过event.target判断用户点的是不是按钮。这样做的底气在于事件冒泡机制子元素被点击时事件会一路冒泡到父容器。父容器只需要监听一次就能处理所有子元素的点击。而且无论后面怎么增删节点监听器都有效。我记得当时把这个机制想通的一刻有种从“用框架”转变到“懂框架”的感觉。事件委托在后来的项目里几乎成了我的默认操作。5.4 表单验证把规则一条条落地表单验证是这次作业里耗时最长的部分因为它是多个步骤的串联监听submit事件、阻止默认提交、读取三个字段的值、逐一校验、把错误信息反馈给用户。我在代码里实现了一个校验函数分别处理三个字段昵称必填邮箱用正则表达式判断格式留言长度不能少于十个字。校验失败时在对应输入框下方插入一条带红色样式的提示文字全部通过之后再把所有提示清掉。这里有一个很容易漏掉的细节第一次提交失败后输入框下方挂了错误提示用户修改了输入但如果不重新校验提示会一直挂着。我的解法是在每个输入框的input事件上也挂同一个校验函数用户边输入边更新提示交互体验立刻提升了一个档。所谓表单校验本质上不是一次性考试而是一个持续反馈的过程。6. 响应式适配另一个尺寸里的另一个世界6.1 断点选择把768像素当成分界线移动端适配不是“加两个媒体查询就能交差”的事。关键要想清楚在什么宽度下布局会发生本质变化。我选了一个断点768像素。视口宽度小于768像素时桌面端的双栏布局切换成单列导航链接收进汉堡菜单。这个断点的选择参考了常见的平板竖屏宽度实际项目中断点也往往来自产品和测试的共同确认没有绝对标准。对作业来说更重要的是切换之后页面是否完整、可读、没有横滚。媒体查询的写法要注意断点相关的样式写在CSS文件底部覆盖桌面端默认样式。CSS选择器的优先级规则决定了覆盖是否生效我一般只写一套基础样式然后单独维护一块移动端覆盖声明规则清晰不会陷入样式打架的泥潭。6.2 汉堡菜单的朴素实现汉堡菜单听起来高级用原生JavaScript实现其实很简单。平时把导航链接隐藏点击汉堡按钮时切换一个class菜单显示出来。按钮的点击用addEventListener控制。需要注意的细节有三个菜单展开时要有独立的层级不能和正文挤在一起收起来后不能影响页面宽度点击菜单里的链接之后应该自动收起菜单。第三个细节经常被忽略。我的做法是给每个导航链接也绑上点击事件点击后主动移除展开class。于是整套流程就闭合了展开、点击、关闭。这个小小的交互逻辑对移动端用户来说特别重要因为他们点完菜单肯定没兴趣再手动关一次。6.3 没有真机时的测试方法手头没有真机就用浏览器开发者工具的设备模拟模式。我依次切换几档常见的屏幕尺寸主要检查五样东西图片有没有溢出、文字有没有被截断、间距有没有变形、导航菜单能不能正常开合、横向滚动条有没有出现。这里必须说一个原则开发者工具的模拟宽度并不完全等于真实手机的体验。触摸事件、软键盘弹出、视口单位计算模拟器和真机都有差异。所以我的态度是模拟器用来确认布局但不能把模拟器当成全部真相。后来我把这套检查流程保留下来每次做完一个页面都要跑一遍已经成了肌肉记忆。7. 踩坑记录与提交前自查7.1 最经典的坑移动端样式覆盖不彻底这次作业里我遇到最诡异的问题是移动端媒体查询里的样式部分失效页面在窄屏下被撑出横向滚动条。排查了很久才发现问题不在媒体查询而是body上默认的grid列定义没有在移动端被覆盖。Grid布局在窄屏下没有切换成单列内容宽度超过了视口横滚就出现了。这类问题看起来像语法错误本质是布局上下文没有切换干净。排查方法也很笨但很有效打开开发者工具的样式面板逐个检查被媒体查询覆盖的属性是否真的生效而不是在代码里对着找。用小布尔走进样式面板一步步追最终两分钟就能定位。7.2 另一个经典坑中文乱码还有一个小坑很多人会碰到页面上的中文全部变成了乱码。根源基本是文件编码问题编辑器保存文件时的默认编码不是UTF-8。解法有两个层面第一在HTML的head里显式写meta charsetutf-8声明第二确保编辑器保存时选择UTF-8编码。虽然都是十几秒就能解决的但截止前发现页面全是乱码那种心跳骤停的感觉经历过的人都懂。7.3 提交前自查清单交作业前我给自己准备了最后一道防线按三个层次检查。第一层是桌面端逐屏看间距、层级、图片清晰度第二层是移动端看单列排版、汉堡菜单开合是否正常第三层是功能点标签筛选是否即时更新、表单空值是否有提示、修改后错误提示是否清除。这套流程帮我逮到了两个小毛病一是我在桌面端调整间距时不小心破坏了移动端某个样式二是侧边栏在窄屏下出现了横向滚动条。这两个问题在最终代码里都不算大但不修就是评分单上的扣分点。这道检查的价值在于让你在提交前知道自己交了什么东西而不是赌一把。8. 一点真心话每次回头看这类课程作业我最大的体会都是难的不是某一句语法而是把零散知识点串成一个完整页面的组织能力。HTML怎么分层、CSS怎么规划、数据怎么管理、事件怎么绑定、不同尺寸怎么适配每一条单独拎出来都通合在一起才是真正的网页开发。这次做到最后我最满意的一个细节是所有样式都只靠CSS完成没有用一行内联样式所有交互都用原生JavaScript完成没有引入任何库。这让我对“从零搭一个页面”这件事建立了完整的肌肉记忆。课程作业的意义或许就在于此用一次不算复杂的要求逼着你把零散学过的全部内容重新整理一遍。等到下一次作业要求用上框架时你至少能分清楚哪些事情是框架替你做的哪些事情是浏览器本来就该做的。这个分界线一旦清楚了后面学什么都会快很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑