简介:这份个人博客网页设计HTML源码面向希望快速搭建个人站点的初学者与前端入门者,提供一套可直接运行的静态博客主题,用于展示作品、想法或日常生活。资源包共30个文件,以27个gif装饰图、1张jpg头像、1个html页面和1个css样式表为主,压缩包约37KB,体积轻巧便于下载与二次修改。其中index.html定义页面头部、导航、文章与页脚等结构,style.css通过类选择器、ID选择器控制字体、颜色、间距与盒模型布局,images目录中的图片资源承担背景、分隔线与图标等视觉装饰。目前已有3820人学习下载,适合作为HTML与CSS基础练习的参考案例。读者可借此理解网页结构组织、样式与内容分离的思路,并在此基础上替换图片与文字,快速改造成符合个人风格的博客页面。
1. 个人博客网页设计html源码:从一份静态骨架到能上线的站点
很多人搜「个人博客网页设计html源码」,脑子里想的是下载一个压缩包,解压,双击index.html,浏览器里出现一个能看的博客,然后改改文字就完事。我一开始也这么想,直到帮朋友把一个「源码」部署到服务器上,才发现问题:导航点不动、手机端错位、文章页全是写死的假数据、CSS 里还引着本地绝对路径。所谓源码,其实只是一张静态截图。
这篇笔记要解决的,就是把这个模糊的需求拆开:一份能用的个人博客 html 源码,到底由哪些文件组成,每部分怎么写,改哪里能变成自己的,以及怎么从「本地能打开」走到「线上能访问」。适合两类人:想自己手写一套博客页面的前端新手,和拿到一份 html 模板却不知道怎么改成自己博客的从业者。下面按文件结构、页面骨架、样式布局、响应式、上线部署的顺序讲,每一步都给能直接抄的代码。
2. 一份个人博客 html 源码到底包含哪些文件
2.1 最小可用目录结构与各文件职责
先明确一件事:纯 html 源码做的是「展示层」,它不负责存文章、不负责评论、不负责登录。个人博客常见的做法是 html + css + js 三件套,文章数据要么写死在 html 里,要么用 js 从一个 json 文件读。目录结构我一般这么组织:
my-blog/ ├── index.html # 首页:文章列表 ├── post.html # 文章详情页模板 ├── about.html # 关于页 ├── css/ │ ├── reset.css # 清除浏览器默认样式 │ └── style.css # 主样式 ├── js/ │ ├── main.js # 交互逻辑 │ └── posts.json # 文章数据(可选) └── images/ └── avatar.jpg # 头像等静态资源这个结构的好处是职责清晰:index.html只管首页结构,style.css管所有视觉,main.js管点击、加载、返回顶部这类行为。新手最容易犯的错是把样式写成行内style="...",几十个标签写下来,改一个颜色要翻遍整个文件。把 css 抽出来,是让源码「可维护」的第一步。
posts.json是可选项。如果你只有几篇文章,直接写在 html 里最省事;如果文章会持续增加,用 json 存数据、js 渲染列表,改文章就不用动 html 结构。两种方式我都用过,前者适合刚起步,后者适合写到二三十篇以后。
2.2 首页骨架:从 doctype 到文章列表容器
一份规范的 html 源码,开头必须是<!doctype html>,这行告诉浏览器用标准模式渲染,少了它某些浏览器会进入怪异模式,盒模型计算方式都变了,布局直接翻车。下面是我常用的首页骨架:
<!doctype html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>我的个人博客</title> <meta name="description" content="记录前端与后端的学习笔记"> <link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/style.css"> </head> <body> <header class="site-header"> <a class="logo" href="index.html">My Blog</a> <nav class="nav"> <a href="index.html">首页</a> <a href="about.html">关于</a> </nav> </header> <main class="post-list"> <article class="post-item"> <h2><a href="post.html">第一篇文章标题</a></h2> <p class="meta">2024-01-01 · 前端</p> <p class="excerpt">这里是文章摘要,控制在两行以内。</p> </article> </main> <footer class="site-footer"> <p>© 2024 My Blog</p> </footer> <script src="js/main.js"></script> </body> </html>逐块说明。<meta charset="utf-8">必须放在 head 最前面,否则中文可能乱码,这是血泪经验,编码声明晚了浏览器已经按别的编码解析了。viewport那行是移动端适配的前提,没有它手机上会按 980px 宽度渲染再缩小,字小得看不清。<main>里每个<article>是一篇文章卡片,<h2>放标题、meta放日期分类、excerpt放摘要。语义化标签(header/nav/main/article/footer)不只是好看,它对 SEO 和读屏软件都有实际作用,搜索引擎能据此判断哪块是正文。
参数上,lang="zh-cn"影响的是浏览器选字体和断词规则,写博客用中文就设成 zh-cn。title和description是搜索结果里显示的内容,别偷懒写「首页」两个字。
2.3 文章详情页与数据分离的两种做法
文章页有两种写法。写死版:每篇文章一个 html 文件,内容直接写在<article>里,优点是简单、SEO 友好,缺点是文章多了文件爆炸。数据驱动版:只有一个post.html,用 js 读 url 参数再渲染对应内容:
// js/main.js const params = new URLSearchParams(location.search); const id = params.get('id') || '1'; fetch('js/posts.json') .then(res => res.json()) .then(posts => { const post = posts.find(p => p.id === id); if (!post) { document.querySelector('.post-body').textContent = '文章不存在'; return; } document.title = post.title + ' - 我的博客'; document.querySelector('.post-title').textContent = post.title; document.querySelector('.post-body').innerHTML = post.content; }) .catch(() => { document.querySelector('.post-body').textContent = '加载失败,请刷新重试'; });这段逻辑是:从地址栏拿id,去posts.json里找对应文章,找到就填进页面,找不到给提示。URLSearchParams是现代浏览器都支持的原生方法,不用引第三方库。fetch后面必须跟.catch,否则网络断了页面一片空白,用户不知道发生了什么。注意innerHTML直接插入内容有 XSS 风险,如果文章内容来自用户输入,要先转义;自己写的博客内容可控,问题不大。
posts.json的结构建议这样:
[ { "id": "1", "title": "第一篇文章", "date": "2024-01-01", "content": "<p>正文段落</p>" } ]id 用字符串而不是数字,避免 url 参数类型转换的坑。content 里放 html 片段,渲染时用 innerHTML 才能生效。
3. 用 CSS 把骨架变成能看的博客页面
3.1 reset 与主样式:先归零再布局
浏览器对 h1、p、ul 这些标签有默认的 margin 和 padding,不同浏览器还不一样。不重置的话,你在 Chrome 调好的间距,到 Safari 就变了。reset.css我一般写最简版:
* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; line-height: 1.7; color: #333; } a { text-decoration: none; color: inherit; } img { max-width: 100%; display: block; }box-sizing: border-box是关键,它让 padding 和 border 算进元素宽度里,否则你设width: 100%再加 padding,元素就撑出容器了,这是新手布局错位最常见的原因。字体栈里-apple-system让苹果设备用系统字体,PingFang SC是中文字体,Microsoft YaHei兜底 Windows,最后 sans-serif 保底。line-height: 1.7是中文正文比较舒服的行高,1.5 偏挤,2.0 偏散。
主样式style.css负责布局。首页文章列表用 flex 或 grid 都行,单列博客用最简单的居中容器:
.site-header { display: flex; justify-content: space-between; align-items: center; max-width: 720px; margin: 0 auto; padding: 24px 16px; border-bottom: 1px solid #eee; } .post-list { max-width: 720px; margin: 0 auto; padding: 24px 16px; } .post-item { padding: 20px 0; border-bottom: 1px solid #f0f0f0; } .post-item h2 { font-size: 20px; margin-bottom: 8px; } .meta { font-size: 13px; color: #999; margin-bottom: 8px; } .excerpt { color: #666; }max-width: 720px加margin: 0 auto是经典的居中容器写法,720px 是中文阅读比较舒适的行宽,太宽眼睛要来回扫。justify-content: space-between让 logo 和导航分居两端。这些数值不是死的,你可以按自己审美调,但行宽别超过 800px。
3.2 响应式:三个断点让手机端不崩
不做响应式,手机上打开就是灾难。我一般设三个断点,但个人博客其实两个就够:
@media (max-width: 768px) { .site-header { flex-direction: column; gap: 12px; } .post-item h2 { font-size: 18px; } } @media (max-width: 480px) { .post-list { padding: 16px 12px; } body { font-size: 15px; } }768px 是平板竖屏和手机横屏的分界,480px 是手机竖屏。768 以下把 header 改成纵向排列,导航不会挤成一团。480 以下缩小内边距和字号,给内容留出更多空间。断点不是越多越好,每多一个就多一份维护成本,两个断点覆盖绝大多数设备。
提示:调试响应式别只靠浏览器缩放,用开发者工具的 device toolbar 切到具体机型,或者直接在真机上打开看,缩放模拟和真实渲染有差异。
3.3 返回顶部与暗色模式:两个提升体验的小交互
返回顶部是博客的标配,实现很简单:
const btn = document.querySelector('.back-to-top'); window.addEventListener('scroll', () => { btn.style.display = window.scrollY > 400 ? 'block' : 'none'; }); btn.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); });scrollY > 400是滚动超过 400px 才显示按钮,避免一进页面就冒出来。behavior: 'smooth'让滚动有过渡动画,比瞬间跳回舒服。这个阈值按页面高度调,内容短的博客可以设小一点。
暗色模式现在也算基础体验了,用 CSS 变量配合媒体查询:
:root { --bg: #fff; --text: #333; } @media (prefers-color-scheme: dark) { :root { --bg: #1a1a1a; --text: #ddd; } } body { background: var(--bg); color: var(--text); }prefers-color-scheme跟随系统设置,用户系统开了暗色,页面自动切换,不用自己做开关。用 CSS 变量是为了改主题时只动一处,所有引用变量的地方自动更新。
4. 个人博客 html 源码避坑与常见问题排查
4.1 中文乱码:charset 位置和文件编码不一致
现象:页面中文显示成方块或乱码。原因通常是两个:一是<meta charset="utf-8">没放在 head 最前面,浏览器已经用默认编码解析了;二是 html 文件本身保存的编码不是 utf-8,比如 Windows 记事本默认存成 GBK。解决:把 charset 声明提到 head 第一行,编辑器里把文件另存为 utf-8 编码。VS Code 右下角能看到当前编码,点一下就能改。
4.2 手机端横向滚动条:某个元素撑破了视口
现象:手机上页面能左右滑动,右边多出一块空白。原因一般是某个元素宽度超过屏幕,常见的是固定宽度的图片、超长的英文单词、或者加了 padding 的 100% 宽度元素。解决:先给body加overflow-x: hidden应急,然后逐个检查元素。用开发者工具选中元素看它的实际宽度,超过视口宽度的就是元凶。图片加max-width: 100%,长单词加word-break: break-all。
4.3 本地能打开线上 404:路径大小写和相对路径
现象:本地双击 html 一切正常,传到服务器后 css、js、图片全加载不出来。原因:Linux 服务器区分文件名大小写,本地 Windows 不区分,Style.css和style.css在本地都能找到,线上就 404。另外绝对路径/css/style.css在子目录部署时会指错位置。解决:统一用小写文件名,引用一律用相对路径css/style.css,部署前在本地起个静态服务器测一遍,别只靠双击文件。
4.4 fetch 加载 json 失败:跨域和 file 协议
现象:用 js 读posts.json,本地双击打开时控制台报 CORS 或跨域错误,文章列表空白。原因:浏览器对file://协议下的 fetch 有安全限制,不允许读本地文件。解决:本地起一个静态服务器,比如python -m http.server 8000,然后访问http://localhost:8000。这不是代码问题,是协议限制,部署到线上 http 环境就正常了。
4.5 样式改了没生效:缓存和优先级
现象:改了 css 刷新页面没变化。原因:浏览器缓存了旧 css,或者新样式被更高优先级的规则覆盖。解决:先强制刷新(Ctrl+Shift+R),还不行就打开开发者工具看元素的实际生效样式,被划掉的就是被覆盖了。行内样式优先级高于 id 高于 class,选择器越具体优先级越高。实在不行给样式加!important应急,但别滥用,后面维护会痛苦。
5. 从源码到上线:静态托管与自定义域名
5.1 三种部署方式的选择
纯静态博客的部署,常见三条路。一是对象存储加 CDN,把文件传上去开静态网站功能,成本低、速度快,适合访问量稳定的博客。二是静态托管平台,连上代码仓库自动构建部署,推代码就上线,适合频繁更新的。三是自己买服务器配 nginx,灵活但要自己维护,适合想顺便练运维的。我一般推荐前两种,个人博客没必要为部署耗太多精力。
nginx 配置静态博客的核心就几行:
server { listen 80; server_name your-domain.com; root /var/www/my-blog; index index.html; location / { try_files $uri $uri/ =404; } }root指向文件目录,index指定默认首页,try_files按顺序找文件,找不到返回 404。改完nginx -t测配置,nginx -s reload重载。
5.2 上线前的自检清单
部署前我会过一遍这几项:所有链接点一遍确认不 404;手机和电脑各看一遍布局;控制台没有报错;title和description每页都不同;图片都压缩过,单张别超过 200KB;posts.json路径正确。这几项花十分钟,能省掉上线后被访问者发现的尴尬。
5.3 一个容易被忽略的细节:文章页的 SEO
数据驱动渲染的文章页,搜索引擎爬虫可能抓不到 js 渲染的内容。如果在意 SEO,文章页要么写死 html,要么做服务端渲染。纯静态博客的折中做法是:首页和文章列表用 js 渲染没问题,但每篇文章生成独立的静态 html 文件。很多静态站点生成器就是干这个的,把 markdown 编译成 html。如果你坚持手写,至少保证文章标题和正文在 html 源码里能直接看到,而不是全靠 js 填。
我自己的习惯是,每写完一篇就本地起服务器完整点一遍,确认没有死链、没有错位,再推上去。这套 html 源码方案不复杂,但细节决定它是一份「能看的模板」还是一个「能用的博客」。希望帮到你。
本文还有配套的精品资源,点击获取