jianzhihuixiang/alacarte-novel-website/chapters/chapter-29.html
小虾米 f8894dd3f3 fix: 修复上一章/下一章导航对小数章节(如107.5)的支持
- updateNavButtons: 改用数组索引查找,而非简单的+1/-1
- updateSidebarHighlight: 使用parseFloat比较章节ID
- updateMobileTOCHighlight: 使用parseFloat比较章节ID
- 更新版本号强制刷新缓存
2026-03-27 17:42:41 +08:00

577 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
<style>
:root {
--bg-primary: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%);
--text-primary: #e0e0e0;
--text-secondary: #888;
--accent-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--border-color: rgba(255,255,255,0.1);
--btn-bg: rgba(255,255,255,0.1);
--btn-hover: rgba(255,255,255,0.2);
}
[data-theme="light"] {
--bg-primary: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
--text-primary: #333;
--text-secondary: #666;
--border-color: rgba(0,0,0,0.1);
--btn-bg: rgba(0,0,0,0.05);
--btn-hover: rgba(0,0,0,0.1);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Noto Serif SC', serif;
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.8;
min-height: 100vh;
transition: all 0.3s ease;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
padding-bottom: 120px;
}
/* 顶部导航 */
.top-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.3);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border-color);
z-index: 1000;
padding: 10px 20px;
}
.top-nav-content {
max-width: 800px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-link {
color: var(--text-primary);
text-decoration: none;
font-family: 'Noto Sans SC', sans-serif;
font-size: 14px;
padding: 8px 16px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
transition: all 0.3s ease;
}
.nav-link:hover {
background: var(--btn-hover);
}
.chapter-header {
text-align: center;
padding: 80px 0 40px;
border-bottom: 1px solid var(--border-color);
margin-bottom: 40px;
}
.chapter-number {
font-size: 14px;
color: var(--text-secondary);
letter-spacing: 4px;
text-transform: uppercase;
margin-bottom: 10px;
}
.chapter-title {
font-size: 32px;
font-weight: 700;
background: var(--accent-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 20px;
}
.chapter-meta {
font-size: 14px;
color: var(--text-secondary);
}
.chapter-content {
font-size: 18px;
line-height: 2;
text-align: justify;
}
.chapter-content p {
margin-bottom: 1.5em;
text-indent: 2em;
}
.chapter-content p:first-of-type::first-letter {
font-size: 3em;
float: left;
line-height: 1;
margin-right: 8px;
margin-top: -5px;
background: var(--accent-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-weight: 700;
}
/* 固定底部导航 */
.fixed-nav {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(0,0,0,0.3);
backdrop-filter: blur(10px);
border-top: 1px solid var(--border-color);
z-index: 1000;
padding: 15px 20px;
}
.fixed-nav-content {
max-width: 800px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-btn {
padding: 12px 24px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
border-radius: 8px;
color: var(--text-primary);
text-decoration: none;
transition: all 0.3s ease;
font-family: 'Noto Sans SC', sans-serif;
font-size: 14px;
cursor: pointer;
}
.nav-btn:hover {
background: var(--btn-hover);
transform: translateY(-2px);
}
.nav-btn.disabled {
opacity: 0.3;
cursor: not-allowed;
pointer-events: none;
}
/* 右侧滚动按钮 */
.scroll-buttons {
position: fixed;
right: 20px;
bottom: 90px;
display: flex;
flex-direction: column;
gap: 10px;
z-index: 1001;
}
.scroll-btn {
width: 40px;
height: 40px;
border-radius: 8px;
background: var(--btn-bg);
border: 1px solid var(--border-color);
color: var(--text-primary);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
transition: all 0.3s ease;
font-family: 'Noto Sans SC', sans-serif;
}
.scroll-btn:hover {
background: var(--btn-hover);
}
/* 侧边栏 - 标题固定,内容滚动 */
.sidebar {
position: fixed;
right: 20px;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
backdrop-filter: blur(10px);
border-radius: 12px;
border: 1px solid var(--border-color);
width: 200px;
max-height: 70vh;
z-index: 999;
display: flex;
flex-direction: column;
}
.sidebar-title {
font-size: 14px;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 2px;
padding: 15px 20px;
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.sidebar-content {
overflow-y: auto;
padding: 10px 20px 20px;
flex: 1;
scrollbar-width: thin;
scrollbar-color: transparent transparent;
transition: scrollbar-color 0.3s ease;
}
.sidebar-content:hover {
scrollbar-color: rgba(255,255,255,0.3) transparent;
}
.sidebar-content::-webkit-scrollbar {
width: 6px;
}
.sidebar-content::-webkit-scrollbar-track {
background: transparent;
}
.sidebar-content::-webkit-scrollbar-thumb {
background: transparent;
border-radius: 3px;
transition: background 0.3s ease;
}
.sidebar-content:hover::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.3);
}
.sidebar-content:hover::-webkit-scrollbar-thumb:hover {
background: rgba(255,255,255,0.5);
}
[data-theme="light"] .sidebar-content:hover {
scrollbar-color: rgba(0,0,0,0.3) transparent;
}
[data-theme="light"] .sidebar-content:hover::-webkit-scrollbar-thumb {
background: rgba(0,0,0,0.3);
}
[data-theme="light"] .sidebar-content:hover::-webkit-scrollbar-thumb:hover {
background: rgba(0,0,0,0.5);
}
.sidebar-chapter {
display: block;
padding: 8px 0;
color: #aaa;
text-decoration: none;
font-size: 13px;
border-bottom: 1px solid rgba(255,255,255,0.05);
transition: all 0.3s ease;
line-height: 1.5;
}
.sidebar-chapter:hover {
color: #667eea;
}
.sidebar-chapter.current {
color: #667eea;
font-weight: 600;
}
@media (max-width: 1200px) {
.sidebar {
display: none;
}
}
@media (max-width: 600px) {
.chapter-title {
font-size: 24px;
}
.chapter-content {
font-size: 16px;
}
.fixed-nav-content {
gap: 10px;
}
.nav-btn {
padding: 10px 15px;
font-size: 12px;
}
.scroll-buttons {
right: 10px;
bottom: 80px;
}
.scroll-btn {
width: 36px;
height: 36px;
}
}
/* 滚动条样式 */
.sidebar::-webkit-scrollbar {
width: 4px;
}
.sidebar::-webkit-scrollbar-track {
background: transparent;
}
.sidebar::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.2);
border-radius: 2px;
}
</style>
</head>
<body>
<!-- 顶部导航 -->
<nav class="top-nav">
<div class="top-nav-content">
<a href="../index.html" class="nav-link">返回首页</a>
<button class="nav-link" id="themeToggle">切换主题</button>
</div>
</nav>
<div class="container">
<header class="chapter-header">
<div class="chapter-number">Chapter 29</div>
<h1 class="chapter-title">阿法利亚营地</h1>
</header>
<article class="chapter-content">
<p>阿法利亚营地坐落在高山之巅。</p>
<p>这里是贝尔玛尔公国在边境设立的重要据点,也是通往暗黑城的必经之路。营地周围云雾缭绕,远处的山脉如同巨龙般蜿蜒起伏。</p>
<p>林克一行人抵达时,正值黄昏时分。夕阳将营地染成一片金红色,士兵们在营地中来回巡逻,气氛紧张而肃穆。</p>
<p>"这里就是阿法利亚营地……"赛丽亚紧挨着林克,好奇地打量着四周,"比我想象的要大很多。"</p>
<p>"毕竟是对抗暗精灵王国的前哨站。"艾伦说,"虽然现在是合作关系,但谁知道明天会发生什么呢?"</p>
<p>奥菲利亚走在林克的另一侧,目光时不时飘向他。自从昨晚的告白后,她变得更加大胆了,经常故意找各种理由靠近林克。</p>
<p>"林克,我有点累,可以扶着我吗?"她轻声说,脸上带着一丝羞涩。</p>
<p>还没等林克回答,赛丽亚就抢先一步挽住了林克的手臂:"奥菲利亚小姐,累了的话可以让艾伦扶着你,林克要扶着我呢。"</p>
<p>奥菲利亚的笑容僵了一下:"可是……"</p>
<p>"我没事的,赛丽亚小姐。"奥菲利亚勉强维持着微笑,"我只是想和林克说说话。"</p>
<p>"那等会儿再说吧,现在林克是我的男朋友。"赛丽亚把林克的手臂抱得更紧了,像是在宣示主权。</p>
<p>林克夹在两个少女中间,感到一阵头疼。</p>
<p>"好了好了,我们先去办正事。"他试图打圆场,"找克伦特要紧。"</p>
<p>---</p>
<p>克伦特是暗精灵王室的传令使,负责与人类方面的联络。</p>
<p>当林克找到他时,这位暗精灵正站在营地边缘,望着远方的暗黑城方向,神情凝重。</p>
<p>克伦特有着暗精灵标志性的深色皮肤和银白色长发,身穿暗精灵王室的制服,腰间挂着代表王室身份的徽章。</p>
<p>"你们就是莎兰会长推荐的冒险家?"克伦特转过身,锐利的目光在林克身上打量,"看起来……比我想象的要年轻。"</p>
<p>"年龄不代表实力。"林克平静地说,"我们已经击败了罗特斯。"</p>
<p>听到"罗特斯"三个字,克伦特的眼神变了。</p>
<p>"第八使徒……你们真的做到了?"他的声音中带着惊讶,"那可是连暗精灵王室都头疼的存在。"</p>
<p>"侥幸而已。"林克谦虚道,"我们来这里,是为了邪龙斯皮兹的事。"</p>
<p>克伦特的表情变得严肃起来:"跟我来,这里不是说话的地方。"</p>
<p>---</p>
<p>克伦特的帐篷里,墙上挂满了地图和各种情报。</p>
<p>"事情是这样的。"克伦特指着一张地图说道,"最近诺伊佩拉地区出现了严重的传染病,很多暗精灵都被感染变成了怪物。"</p>
<p>"传染病?"艾伦皱眉,"是瘟疫吗?"</p>
<p>"比瘟疫更可怕。"克伦特摇头,"被感染的暗精灵会失去理智,变成只知道攻击的丧尸。而且……这种传染病似乎与邪龙斯皮兹的封印松动有关。"</p>
<p>他叹了口气:"我们的炼金术大师摩根为了调查传染病的根源,独自一人去了浅栖之地。但……他已经很久没有消息了。"</p>
<p>"浅栖之地?"林克问。</p>
<p>"诺伊佩拉地区的一处地下洞穴,原本是暗精灵的墓地,现在被感染者占据了。"克伦特从抽屉里拿出一张卷轴,"这是浅栖之地的地图,摩根最后出现的位置在这里。"</p>
<p>林克接过地图,仔细查看。</p>
<p>"我们会找到摩根的。"他说。</p>
<p>克伦特点点头,眼中闪过一丝感激:"拜托了。摩根不仅是炼金术大师,也是我的挚友。如果他出了什么事……"</p>
<p>他没有说下去,但林克明白他的意思。</p>
<p>---</p>
<p>离开克伦特的帐篷时,天色已经完全暗了下来。</p>
<p>营地里点燃了篝火,士兵们三三两两地聚在一起,低声交谈着。远处的暗黑城在月光下显得神秘而阴森。</p>
<p>"林克,今晚我们住哪里?"赛丽亚问,她依然紧紧挽着林克的手臂,仿佛在防备奥菲利亚。</p>
<p>"克伦特已经为我们安排了帐篷。"林克说,"在营地的东侧。"</p>
<p>"帐篷……"奥菲利亚眼睛一亮,"林克,我和你住一个帐篷吧,这样比较安全。"</p>
<p>"不行!"赛丽亚立刻反对,"林克要和我住一起!"</p>
<p>"可是……"奥菲利亚低下头,声音变得柔弱,"我害怕……这里离暗黑城这么近,晚上可能会有怪物……"</p>
<p>赛丽亚咬了咬嘴唇,显然有些动摇,但她还是坚持:"那……那林克可以保护我们两个,我们三个人住一个帐篷!"</p>
<p>"三个人?"林克苦笑,"帐篷没那么大吧……"</p>
<p>"可以的!"赛丽亚和奥菲利亚异口同声。</p>
<p>然后两人对视一眼,又同时扭过头去。</p>
<p>艾伦在一旁看着这一幕,忍不住笑出了声:"林克,你的桃花运真好。"</p>
<p>林克瞪了他一眼:"你要不要也来凑个热闹?"</p>
<p>"不了不了,我还是一个人睡吧。"艾伦赶紧摆手,"圣骑士需要保持纯洁。"</p>
<p>---</p>
<p>最终,林克、赛丽亚和奥菲利亚住进了同一个帐篷。</p>
<p>帐篷比想象中要大一些,中间用布帘隔成了两个区域。林克睡中间,赛丽亚和奥菲利亚分别睡在两侧。</p>
<p>但显然,两个少女都不满意这个安排。</p>
<p>"林克,我可以过去和你睡吗?"赛丽亚小声说,"我害怕……"</p>
<p>"林克,我也想过去……"奥菲利亚也不甘示弱。</p>
<p>林克躺在中间,左右为难。</p>
<p>"都别过来。"他无奈地说,"明天还要战斗,需要休息。"</p>
<p>两个少女同时"哼"了一声,然后各自转过身去。</p>
<p>帐篷里陷入了沉默,只有外面的风声和远处的虫鸣。</p>
<p>过了许久,林克以为她们都睡着了,正准备闭上眼睛时,他感到有人钻进了他的被窝。</p>
<p>是赛丽亚。</p>
<p>她像只小猫一样蜷缩在林克怀里,脸颊贴着他的胸膛。</p>
<p>"林克……"她轻声说,"我知道奥菲利亚喜欢你,但我不会把她让给你的。"</p>
<p>林克抚摸着她的头发:"我知道。"</p>
<p>"你是我的。"赛丽亚抬起头,在黑暗中看着他的眼睛,"谁也抢不走。"</p>
<p>然后她主动吻上了他的唇。</p>
<p>这个吻温柔而缠绵,带着一丝宣示主权的意味。</p>
<p>当他们分开时,赛丽亚的脸上带着满足的笑容。</p>
<p>"晚安,我的骑士。"她在林克怀里找了个舒服的位置,很快就睡着了。</p>
<p>林克看着怀中的少女,又看了看布帘另一侧的奥菲利亚,心中暗暗叹了口气。</p>
<p>这后宫之路,看来还很长啊。</p>
<p>---</p>
<p>第二天一早,队伍整装待发。</p>
<p>克伦特亲自来送行,递给他们一张通行证:"这是进入诺伊佩拉地区的凭证。记住,如果找到摩根……无论他变成什么样,都请带他回来。"</p>
<p>"我们会的。"林克点头。</p>
<p>"还有……"克伦特犹豫了一下,压低声音说,"小心夏普伦长老。他主张与人类开战,对梅娅女王的和平政策很不满。你们在这里的一举一动,都可能被他盯上。"</p>
<p>"夏普伦?"</p>
<p>"暗精灵的长老,王室的顾问。"克伦特的表情凝重,"他一直反对与人类合作,如果让他抓到把柄,可能会对梅娅女王不利。"</p>
<p>林克明白了:"我们会小心的。"</p>
<p>队伍出发了,朝着浅栖之地的方向前进。</p>
<p>赛丽亚和奥菲利亚一左一右地跟在林克身边,虽然还有些互相看不顺眼,但至少没有再争吵。</p>
<p>艾伦走在最后,看着前面三人的背影,笑着摇了摇头。</p>
<p>暗黑城的冒险,正式开始了。</p>
<p>---</p>
<p>(第二十九章完)</p>
</article>
</div>
<!-- 固定底部导航 -->
<nav class="fixed-nav">
<div class="fixed-nav-content">
<a href="chapter-28.html" class="nav-btn ">上一章</a>
<a href="../chapters.html" class="nav-btn">目录</a>
<a href="chapter-30.html" class="nav-btn ">下一章</a>
</div>
</nav>
<!-- 右侧滚动按钮 -->
<div class="scroll-buttons">
<button class="scroll-btn" id="scrollTop" title="回到顶部"></button>
<button class="scroll-btn" id="scrollBottom" title="回到底部"></button>
</div>
<!-- 侧边栏章节导航 -->
<aside class="sidebar">
<div class="sidebar-title">章节导航</div>
<div class="sidebar-content" id="sidebarContent">
<a href="chapter-1.html" class="sidebar-chapter">第1章洛兰的风</a>
<a href="chapter-2.html" class="sidebar-chapter">第2章洛兰深处</a>
<a href="chapter-3.html" class="sidebar-chapter">第3章幽暗密林</a>
<a href="chapter-4.html" class="sidebar-chapter">第4章幽暗密林深处</a>
<a href="chapter-5.html" class="sidebar-chapter">第5章雷鸣废墟</a>
<a href="chapter-6.html" class="sidebar-chapter">第6章格拉卡</a>
<a href="chapter-7.html" class="sidebar-chapter">第7章烈焰格拉卡</a>
<a href="chapter-8.html" class="sidebar-chapter">第8章冰霜幽暗密林</a>
<a href="chapter-9.html" class="sidebar-chapter">第9章转职之路</a>
<a href="chapter-10.html" class="sidebar-chapter">第10章暗黑雷鸣废墟</a>
<a href="chapter-11.html" class="sidebar-chapter">第11章剑魂转职仪式</a>
<a href="chapter-12.html" class="sidebar-chapter">第12章西海岸</a>
<a href="chapter-13.html" class="sidebar-chapter">第13章龙人之塔</a>
<a href="chapter-14.html" class="sidebar-chapter">第14章人偶玄关</a>
<a href="chapter-15.html" class="sidebar-chapter">第15章石巨人塔</a>
<a href="chapter-16.html" class="sidebar-chapter">第16章黑暗玄廊</a>
<a href="chapter-17.html" class="sidebar-chapter">第17章城主宫殿</a>
<a href="chapter-18.html" class="sidebar-chapter">第18章番外·悬空城</a>
<a href="chapter-19.html" class="sidebar-chapter">第19章天帷巨兽·神殿外围</a>
<a href="chapter-20.html" class="sidebar-chapter">第20章树精丛林</a>
<a href="chapter-21.html" class="sidebar-chapter">第21章炼狱</a>
<a href="chapter-22.html" class="sidebar-chapter">第22章西海岸的闲暇</a>
<a href="chapter-23.html" class="sidebar-chapter">第23章极昼</a>
<a href="chapter-24.html" class="sidebar-chapter">第24章第一脊椎</a>
<a href="chapter-25.html" class="sidebar-chapter">第25章赫顿玛尔的准备</a>
<a href="chapter-26.html" class="sidebar-chapter">第26章第二脊椎</a>
<a href="chapter-27.html" class="sidebar-chapter">第27章重逢的温柔</a>
<a href="chapter-28.html" class="sidebar-chapter">第28章暗精灵的委托</a>
<a href="chapter-29.html" class="sidebar-chapter current">第29章阿法利亚营地</a>
<a href="chapter-30.html" class="sidebar-chapter">第30章浅栖之地</a>
<a href="chapter-31.html" class="sidebar-chapter">第31章蜘蛛洞穴</a>
<a href="chapter-32.html" class="sidebar-chapter">第32章克伦特的委托</a>
<a href="chapter-33.html" class="sidebar-chapter">第33章暗精灵墓地·左翼守卫</a>
<a href="chapter-34.html" class="sidebar-chapter">第34章暗精灵墓地·剩余三将军</a>
</div>
</aside>
<script>
// 记录阅读进度
let readChapters = JSON.parse(localStorage.getItem('readChapters') || '[]');
if (!readChapters.includes(29)) {
readChapters.push(29);
localStorage.setItem('readChapters', JSON.stringify(readChapters));
}
// 主题切换
const themeToggle = document.getElementById('themeToggle');
const savedTheme = localStorage.getItem('theme') || 'dark';
document.documentElement.setAttribute('data-theme', savedTheme);
themeToggle.textContent = savedTheme === 'dark' ? '浅色' : '深色';
themeToggle.addEventListener('click', () => {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme);
themeToggle.textContent = newTheme === 'dark' ? '浅色' : '深色';
});
// 滚动到顶部
document.getElementById('scrollTop').addEventListener('click', () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// 滚动到底部
document.getElementById('scrollBottom').addEventListener('click', () => {
window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
});
// 页面加载时,侧边栏自动滚动到当前章节
window.addEventListener('load', () => {
const sidebarContent = document.getElementById('sidebarContent');
const currentChapter = sidebarContent.querySelector('.current');
if (currentChapter) {
currentChapter.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
});
</script>
</body>
</html>