☰
三个静态页面入门网页设计:HTML、CSS与超链接实战
2026/10/14 14:24:40 网站建设 项目流程

简介:面向网页设计初学者的入门练习包,通过搭建三个可相互跳转的页面,演示文字、图片与超链接的综合运用。资源以真实案例讲解HTML结构划分(如用section分页)、锚点跳转、图片插入及CSS美化方法,适合正在学习网页基础或准备课程作业的读者。压缩包共8个文件,包含3个HTML页面源码、4张webp网页素材和1张jpg图片,整体大小仅176KB,小巧便携。目前已有4972人学习浏览,获初学者认可。对照源码与图片素材,可清晰理解段落标题、强调文本、图片替代文本、链接target属性以及ID选择器样式等核心知识点,并能在此基础上快速扩展自己的网页设计作品。

1. 网页设计开箱即用:三个静态页面把文字、图片、超链接全部串起来

网页设计入门这件事,最吊诡的地方在于:标签语法你全都认识,但真要动手做一个小型 web 项目,反而不知道从哪一页开始写。这套资源包正好踩中这个需求——用三个 HTML 页面把文字、图片、超链接三类最基本的网页元素串起来,首页负责介绍,图文页做卡片展示,联系页提供跳转出口,页面之间通过相对路径互相跳转,纯静态实现,不依赖任何框架和构建工具,浏览器双击 index.html 就能跑。适合刚学完 HTML 不知道如何组装的初学者,也适合急需交一个课程设计 Demo 的学生,甚至能直接当公司内部导航页的模板改。下面从文件结构到实际代码,再到底层路径规则和排错思路,一层层拆给你看。

2. 站点的骨架:文件结构、三页关系与相对路径第一课

2.1 为什么是三个页面,而不是一个长页面

很多初学者拿到需求的第一反应是“一个页面把内容全堆下去不就行了”,但实际做 web 页面时,内容分层比内容堆叠重要得多。一个页面塞满信息,滚动成本高、焦点分散,而且超链接无处安放——你总不能让导航里的每一项都滚回同一页的某个锚点。三个页面恰好构成一个最小闭环:index.html 承担“告诉访问者这是什么”,gallery.html 承担“展示图文混合排版和图片超链接”,contact.html 承担“提供联系方式和跳转动作”。三页各司其职,也方便后续加第四个、第五个页面时直接复制结构。

这套资源包的文件结构非常明确,照着这个骨架把文件和文件夹建好,后面写代码不会迷路:

web-project/ ├── index.html # 首页,站点介绍 + 三页导航 ├── gallery.html # 图文页,图片卡片 + 跳转链接 ├── contact.html # 联系页,文字信息 + email 链接 ├── css/ │ └── style.css # 全局样式,三个页面共用一份 ├── images/ │ ├── banner.jpg # 首页横幅图 │ ├── card-1.jpg # 图文页卡片图 │ └── card-2.jpg # 图文页卡片图 └── js/ └── main.js # 可选脚本,进阶交互时用

这里的核心设计是 css 和 images 各拆一个文件夹,而不是把样式直接写进每个 HTML。原因很直接:如果三个页面各自贴一份<style>,改一次品牌色要动三个文件,维护成本翻三倍;抽出 style.css 之后,改一处全局生效。images 文件夹同理,页面间用到同一张图时,路径不会因为层级不同而出错。我在实际带人做课程设计时,通常会要求先把这棵目录树建好再写代码,因为 HTML 标签写错了容易发现,但路径写错了排查起来非常费眼神。

2.2 页面间跳转的本质:相对路径解析规则

三页能串起来,靠的是 href 里的路径而不是什么魔法。很多人写<a href="index.html">觉得理所当然,但一旦页面嵌套到多级目录里就懵。其实规则只有两条:同目录下的文件直接写文件名,或者用./开头明确表示“当前目录”;往上一层目录必须用../先跳出当前文件夹。

从 gallery.html 跳回首页,文件结构里 gallery.html 和 index.html 都在根目录,所以href="index.html"就能工作。但如果 gallery.html 被挪进了 pages 子目录,那跳回根目录就得写href="../index.html"——../表示先回到上一级,也就是项目根目录,再找 index.html。图片路径同理,gallery.html 引用 images/card-1.jpg,需要先../跳出 pages,再进 images,写成src="../images/card-1.jpg"。这个规则不熟练的话,最笨也最有效的验证办法是直接在浏览器里预览页面,然后右键图片选“在新标签页打开图片”,看地址栏里浏览器最终解析出的完整路径长什么样。

三种页面之间的导航关系可以用下面这张表来记忆,写代码时就不会犹豫:

页面文件常见跳转目标href 写法说明
index.htmlgallery.htmlgallery.html同级目录,直接写文件名
index.htmlimages/card-1.jpgimages/card-1.jpg子目录,写相对路径
contact.htmlindex.htmlindex.html同级目录
page 子目录内文件根目录 index.html../index.html先出子目录再找文件

这套规则对所有静态 web 项目通用。很多项目上了线才出现图片 404,就是因为本地双击打开时浏览器宽容,而部署到服务器之后路径大小写、层级一不对就立刻报错。所以从第一个页面开始就坚持用相对路径,养成肌肉记忆。

3. 页面实现三件套:文本排版、图片引入与跳转的完整写法

3.1 首页:先立导航,再用文字撑起内容

首页承担的是“第一眼”职责,技术上要同时演示文本语义化和站内跳转。我一般会写出一个带 header 导航的完整 HTML 骨架,而不是只给一个<a>标签的片段。这个资源包里的 index.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="css/style.css"> </head> <body> <header class="site-header"> <nav class="main-nav"> <a href="index.html" class="active">首页</a> <a href="gallery.html">图文页</a> <a href="contact.html">联系页</a> </nav> </header> <main class="container"> <h1>从三个页面开始理解网页设计</h1> <p>这个页面演示的是文字内容的层级排布:h1 作为整站的中心主题,p 标签负责段落说明,<a href="gallery.html">点这里进入图文页</a>可以体验带图片的页面跳转。</p> <img src="images/banner.jpg" alt="网站横幅图" width="960" height="400"> </main> </body> </html>

这段代码里有几个细节值得注意。<link rel="stylesheet" href="css/style.css">是页面与样式表之间唯一的连接,写错路径整个页面就裸奔;href="index.html"配合 class="active" 是为了让当前页在导航里高亮,这属于静态站最常见的导航交互。段落文字里嵌的<a href="gallery.html">演示了“文字本身就是超链接”的用法,不一定要靠按钮,中文段落里划出一句加链接,是最自然的跳转引导方式。

图片标签里的 width 和 height 属性建议写,即使你不是特别在意尺寸。浏览器渲染页面时如果提前知道图片占位尺寸,就不会在图片加载过程中产生版面跳动,这在网速慢的时候体验差异特别明显。alt 属性也不可省略,它既是无障碍屏幕阅读器读给视障用户的文字,也是图片加载失败时页面上显示的后备文案。

3.2 图文页:把整张卡片变成可点击的跳转区域

gallery.html 是这个资源包里最出彩的一页,它的任务是把图片、说明文字、超链接三者融合成一个完整的卡片组件。常见的错误做法是只给图片加<a>标签,导致访问者必须精准点到图片上才能跳走。这里我用的是把<a>当作整张卡片的容器,图片和文字都放进链接内部:

<article class="card"> <a href="https://example.com/project-detail" target="_blank" rel="noopener noreferrer"> <img src="images/card-1.jpg" alt="项目效果图一" width="600" height="400" loading="lazy"> <h2>第一个实验:图文混排</h2> <p>这张卡片由图片、标题、描述文字三层内容组成,点击卡片的任意位置都会触发跳转,不用精确瞄准图片区域。</p> </a> </article>

不用怀疑这种写法的合法性,HTML 规范允许a包裹块级内容,关键是别在a里面再嵌套另一个a,那样交互逻辑会冲突。这里target="_blank"表示新标签页打开,对站外链接是好习惯,避免访问者离开了你的站点就回不来;rel="noopener noreferrer"则是一个安全属性,防止新打开的页面通过 window.opener 对原页面做恶意操作。

loading="lazy"是给图片加载行为加的开关,浏览器会等图片即将进入视口时才开始下载,页面上有多张卡片时能显著省流量、加速首屏渲染。如果你手头正好有两张风格接近的图片就能直接替换 src 路径,重复三次<article class="card">就能拼出一个两栏或三栏的图片瀑布流版面。

3.3 联系页:站内跳转、站外跳转与 email 链接的混合出口

contact.html 在功能上是“跳转出口集合”,它集中演示超链接的三种真实业务形态。第一种是常规的站内跳转,比如返回首页的链接;第二种是站外跳转,指向外部资料或文档;第三种是 mailto 协议,用于点击后拉起邮件客户端。三种链接的代码写在一起对比着看,比单独记语法直观得多:

<section class="contact-panel"> <h2>联系与更多资料</h2> <p>你可以通过以下方式继续你的网页设计练习:</p> <ul> <li><a href="index.html">返回首页继续浏览</a></li> <li><a href="https://example.com/more-tutorials" target="_blank" rel="noopener noreferrer">查看外部图文教程</a></li> <li><a href="mailto:someone@example.com">发送反馈邮件给我</a></li> </ul> </section>

mailto:链接的机制是调用访问者本机的默认邮件客户端,然后预填收件人地址。这种交互在移动端尤其好用,手机会直接唤起邮件 App。但要注意,它不能保证送达,也不能像后端表单那样把数据存进数据库,适合静态页和演示项目,不适合正式的在线咨询系统。如果你的场景是收集用户留言,需要接一个真正有后端的表单,或至少用第三方表单托管服务。

这段代码想告诉你的核心是:跳转是一个动词,它需要明确的“目标、打开方式、安全策略”三个参数。写链接时顺便问自己一句“跳走后要不要保留当前页”,你就知道target="_blank"该不该加了。

4. 样式收拢成一套:CSS 归类、标签语义与浏览器表现统一

4.1 为什么三个页面必须共用同一份 style.css

三个页面共用一套样式,不是偷懒,而是静态站点规范化之后的必然选择。想象一下 index.html 用蓝色做主题色,gallery.html 用绿色,contact.html 用橙色,那不是风格,是事故。共用 style.css 之后,品牌色、标题字号、卡片间距全在一个文件里统一管理,改一个变量就能让整个站点换肤,这是 web 工程里最基本的 DRY 原则(Don't Repeat Yourself)。

我在这个资源包里推荐的最小可行 CSS 架构,是“变量 + 基础重置 + 布局工具类 + 组件类”。这套思路不复杂,但足够覆盖三页站点的全部样式需求:

/* 全局变量:改主题色只动这里 */ :root { --color-main: #2c3e50; --color-accent: #3498db; --space-lg: 32px; --space-md: 16px; } /* 基础重置:让浏览器默认样式统一 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; line-height: 1.7; color: var(--color-main); } /* 布局工具类 */ .container { max-width: 960px; margin: 0 auto; padding: var(--space-lg); } /* 组件类:导航栏 */ .site-header { background: var(--color-accent); padding: var(--space-md) var(--space-lg); } .main-nav a { color: #fff; text-decoration: none; margin-right: 24px; } .main-nav a.active { font-weight: bold; border-bottom: 2px solid #fff; }

这套样式的关键决策有两个。第一个是字体栈里把system-ui放在最前面,意思是让浏览器优先使用当前操作系统自带的中文字体,而不是强制所有人下载某一种网络字体,中文字体文件通常有几兆,为了一个标题让全站加载变慢不值得。第二个是用 CSS 变量(--color-main开头的那几个)而不是到处硬编码颜色,写熟了你就知道,改主题色时满屏找#3498db的体验绝对比改一处变量糟糕得多。

4.2 让三个页面长得像同一套:语义标签与工具类的配合

HTML 标签用对,CSS 才能事半功倍。header、nav、main、article 这些语义化标签不仅方便屏幕阅读器识别页面结构,也自然提供了 CSS 的定位钩子。比如.main-nav a能把导航里的所有链接一次性选中,不用给每个 a 单独写 class。gallery 卡片部分则用.card类做结构约束,让每张卡片都保持同样的宽度、圆角和阴影:

.card { background: #f8f9fa; border-radius: 8px; overflow: hidden; margin-bottom: var(--space-lg); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); } .card a { display: block; text-decoration: none; color: inherit; } .card img { width: 100%; height: auto; display: block; }

.card img { width: 100% }是一个反直觉但极其重要的写法:它强制图片撑满卡片宽度,同时 height auto 保持原始比例,于是任何宽度的图片放进来都不会破版。.card a { display: block }则把链接从行内元素改成块级元素,整张卡片因此变成可点击区域。这两条规则加在一起,就是你看到的各种图片站卡片组件的基本原理。

写样式时我强烈建议从移动端尺寸开始写,再加一个简单的响应式断点适配三栏布局。不用上框架,几行媒体查询就够了:

@media (min-width: 768px) { .card-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-lg); } }

这段代码的意思是,当浏览器视口宽度大于等于 768px 时,把卡片容器切换成两列网格;小于这个宽度就保持单列堆叠。手机竖屏阅读时不会觉得字太小,桌面端看又不空旷,这是低成本但观感提升最明显的一步。

5. 多页面静态站避坑排查:缓存、路径、编码与锚点遮挡

5.1 改了 CSS 不生效

现象:代码明明在编辑器里改好了,但浏览器刷新后页面还是一副旧模样,导航栏颜色没变,间距也没变。

原因:浏览器默认启用了缓存,把之前的 style.css 存在本地。尤其用 file:// 协议直接双击打开页面时,浏览器判断文件没变就不重新请求,于是你看到的是旧样式。

解决:打开开发者工具(Windows 按 F12,macOS 按 Cmd+Option+I),切到 Network 面板,勾选 Disable cache 选项,然后再刷新一次。这个勾选只对开发者工具窗口打开期间生效,关闭工具后自动恢复,不影响普通用户的浏览体验。我每次改完样式都强制刷新一遍(Ctrl+F5),习惯之后会少踩很多“我改了怎么没变”的坑。

5.2 图片显示裂开,src 路径没报错

现象:页面结构完整,网络请求看着也发出来了,但图片位置只有一个碎图标或者空白区域。

原因:最常见的两个情况——文件名大小写对不上,比如资源包里的图片叫 banner.jpg,但代码里写了 Banner.jpg,或者相对路径层级数错了,gallery.html 在子目录里却写了images/...而不是../images/...。

解决:右键裂开的图片选择“检查”,在 Elements 面板里看 img 标签的 src 实际内容,然后对照项目目录树一点一点核对层级。更直接的办法是点击 Network 面板里那张失败图片的请求,查看 Request URL,浏览器已经帮你把相对路径拼成了完整路径,照着这个完整路径对照文件系统找差异,基本一眼就能看出是大小写还是目录层级的问题。

5.3 中文文字乱码

现象:HTML 里明明写的中文,页面显示出来却是一堆 Unicode 转义字符或者问号黑块。

原因:HTML 文件的编码和浏览器解析时采用的编码不一致。最常见的漏网之鱼是 head 里少了<meta charset="UTF-8">,于是浏览器在没看到编码声明时,按系统默认的编码猜着解码,中文就翻车了。

解决:检查每个 HTML 文件的 head 区第一行有没有<meta charset="UTF-8">,而且这段声明的位置要尽量靠前,最好就在<title>之前。如果用的是某些老旧的编辑器,还要确认编辑器保存文件时选择的编码确实是 UTF-8,有时候文件在保存时被写成了 GB2312 或 ASCII,手写 meta 也救不回来。

5.4 锚点跳转后标题被顶部导航挡住

现象:页面内部用href="#section-2"做锚点跳转,点击后目标标题确实到了页面顶部,但被固定定位的 header 遮住了大半行。

原因:固定头部.site-header { position: fixed; top: 0 }会把顶部的元素盖在下面,锚点跳转的默认行为是让目标元素紧贴视口顶部,于是目标内容的上半截就缩进了导航栏底下。

解决:给标题加一条 CSS 属性,scroll-margin-top,它专门用来修正锚点定位时的偏移量:

h2, .card { scroll-margin-top: 70px; }

这个 70px 约等于固定导航栏的高度,你可以根据自己 header 的实际高度调整。加了这行之后,锚点跳转的目标位置会向上多留出 70px 的缓冲空间,被遮挡的问题立刻消失。这是纯 CSS 就能解决的典型边缘问题,不需要动 JavaScript。

5.5 本地能打开,部署上线后资源全 404

现象:本地双击 index.html 一切正常,图片能显示、页面能跳转,但上传到某个 web 服务器之后,样式和图片全部丢失,只有裸 HTML 文字还在。

原因:本地 file:// 协议下浏览器对路径处理相当宽容,一些错误写法比如反斜杠\、绝对路径/images/...,都能碰巧被浏览器容忍。但服务器环境按严格的标准来解析 URL,反斜杠不被识别为路径分隔符,以/开头的绝对路径会直接指向服务器域名根目录,而不是你的项目子目录。

解决:把所有路径统一改成相对路径,分隔符一律用正斜杠/,并在本地用 http 服务验证一遍而不是双击文件。最简单的方式是在项目根目录开一个轻量静态服务,比如 Python 的python3 -m http.server 8000,然后访问http://localhost:8000,这样浏览器走的是 HTTP 协议,和线上环境行为一致,路径问题会被提前暴露。从那以后我做任何静态 web 资源包,交付前都会强制走一遍这个验证流程,避免“我本地明明跑得好好的”这类经典对话。

6. 再加一步:返回顶部、参数传递与开发者工具验证

6.1 用几行脚本给三个页面补一个返回顶部按钮

长页面滚动久了,访问者要回到导航区只能手动往上滚,体验很差。一个返回顶部按钮的交互其实很简单:监听浏览器的滚动事件,滚动超过一定阈值就把按钮显示出来,点击后平滑滚回顶部。为这套资源包适配的脚本可以这样写:

// main.js:返回顶部按钮的显隐与点击逻辑 const backTop = document.querySelector('.back-top'); window.addEventListener('scroll', () => { // 滚动超过 300px 才显示按钮,避免首屏上出现多余的图标 backTop.style.display = window.scrollY > 300 ? 'block' : 'none'; }); backTop.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); });

逻辑说明:window.scrollY是当前滚动距离,配合三元表达式控制按钮的 layout 属性,是一种最轻量的显隐方案。window.scrollTo({ top: 0, behavior: 'smooth' })里的 behavior 参数决定滚动是瞬时到达还是平滑过渡,桌面端现代浏览器都支持。HTML 侧只需要放一个<a href="#" class="back-top" aria-label="返回顶部">↑</a>挂件,CSS 里给它 fixed 定位并垂直居中。别小看这几行代码,它是初学者从“静态页面”跨到“带交互页面”的最短路径。

6.2 用 URL 参数在页面间传递来源信息

页面之间的信息传递有时用不着后端,URL 查询参数就够了。比如从 gallery.html 跳转到 contact.html 时多带一个参数?from=gallery,联系页里的 JavaScript 就能读取这个参数并动态显示来源。这个模式在做多页面跳转时很常见,例如统计访问来源、区分不同入口展示不同文案。

// contact.html 中读取 URL 参数 const params = new URLSearchParams(window.location.search); const fromPage = params.get('from'); if (fromPage) { const sourceLabel = document.querySelector('.source-info'); sourceLabel.textContent = `你从 ${fromPage} 页面跳转过来,希望这些内容对你有帮助。`; }

URLSearchParams 是浏览器原生提供的参数解析工具,不需要引入任何库。注意这一节代码依赖你从带参数的链接进入才会生效,来访页签可以预置一个<span>容器。这个技巧在纯静态资源包里特别值钱,因为静态站没有服务器端会话机制,URL 参数几乎是唯一廉价的信息传递通道。

6.3 交付前的三分钟自检清单

拿到这套资源包并完成上面的改动后,建议用一个固定流程做交付前验证。第一步,打开开发者工具 Network 面板并勾选 Disable cache,刷新页面,确认没有红色的 404 请求;第二步,把浏览器宽度拖到手机尺寸,检查三页的卡片是否正常降级为单列;第三步,在控制台看有没有抛错,尤其是有 JS 的页面,一个标题选择器写错就可能让整段脚本失效。这三步走完,这套三页面资源包就从一个模板变成了一个经得起检查的小型 web 作品。给课程设计交作业也好,给公司做内部导航也好,都能拿得出手。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询