2026-03-27 17:42:41 +08:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
|
<html lang="zh-CN">
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
2026-03-29 13:57:51 +08:00
|
|
|
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
|
|
|
|
|
<meta http-equiv="Pragma" content="no-cache">
|
|
|
|
|
|
<meta http-equiv="Expires" content="0">
|
2026-03-27 17:42:41 +08:00
|
|
|
|
<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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-29 13:57:51 +08:00
|
|
|
|
/* TTS控制面板 */
|
|
|
|
|
|
.tts-panel {
|
|
|
|
|
|
position: fixed;
|
|
|
|
|
|
left: 20px;
|
|
|
|
|
|
bottom: 90px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
gap: 10px;
|
2026-03-29 14:10:48 +08:00
|
|
|
|
z-index: 1002;
|
|
|
|
|
|
background: rgba(0,0,0,0.6);
|
2026-03-29 13:57:51 +08:00
|
|
|
|
backdrop-filter: blur(10px);
|
|
|
|
|
|
border-radius: 12px;
|
|
|
|
|
|
border: 1px solid var(--border-color);
|
|
|
|
|
|
padding: 15px;
|
|
|
|
|
|
min-width: 180px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-title {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
color: var(--text-secondary);
|
|
|
|
|
|
text-transform: uppercase;
|
|
|
|
|
|
letter-spacing: 2px;
|
|
|
|
|
|
margin-bottom: 5px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-controls {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
margin-bottom: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-btn {
|
|
|
|
|
|
width: 36px;
|
|
|
|
|
|
height: 36px;
|
|
|
|
|
|
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: 14px;
|
|
|
|
|
|
transition: all 0.3s ease;
|
|
|
|
|
|
font-family: 'Noto Sans SC', sans-serif;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-btn:hover {
|
|
|
|
|
|
background: var(--btn-hover);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-btn.active {
|
|
|
|
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
|
|
|
|
border-color: #667eea;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-progress {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
margin-bottom: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-progress-bar {
|
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
height: 4px;
|
|
|
|
|
|
background: var(--btn-bg);
|
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-progress-fill {
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
|
|
|
|
width: 0%;
|
|
|
|
|
|
transition: width 0.1s ease;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-time {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
color: var(--text-secondary);
|
|
|
|
|
|
font-family: 'Noto Sans SC', sans-serif;
|
|
|
|
|
|
min-width: 80px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-speed {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-speed-label {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
color: var(--text-secondary);
|
|
|
|
|
|
font-family: 'Noto Sans SC', sans-serif;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-speed-select {
|
|
|
|
|
|
padding: 4px 8px;
|
|
|
|
|
|
background: var(--btn-bg);
|
|
|
|
|
|
border: 1px solid var(--border-color);
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
color: var(--text-primary);
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
font-family: 'Noto Sans SC', sans-serif;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 600px) {
|
|
|
|
|
|
.tts-panel {
|
|
|
|
|
|
left: 10px;
|
2026-03-29 14:08:36 +08:00
|
|
|
|
right: 10px;
|
2026-03-29 14:10:48 +08:00
|
|
|
|
bottom: auto;
|
|
|
|
|
|
top: 60px;
|
2026-03-29 14:08:36 +08:00
|
|
|
|
min-width: auto;
|
|
|
|
|
|
padding: 12px;
|
|
|
|
|
|
width: auto;
|
2026-03-29 14:10:48 +08:00
|
|
|
|
z-index: 1003;
|
2026-03-29 13:57:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-btn {
|
|
|
|
|
|
width: 32px;
|
|
|
|
|
|
height: 32px;
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
}
|
2026-03-29 14:08:36 +08:00
|
|
|
|
|
|
|
|
|
|
.tts-title {
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-speed-label {
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-speed-select {
|
|
|
|
|
|
padding: 3px 6px;
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-time {
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
min-width: 60px;
|
|
|
|
|
|
}
|
2026-03-29 14:10:48 +08:00
|
|
|
|
|
|
|
|
|
|
/* 手机端隐藏滚动按钮,给TTS腾空间 */
|
|
|
|
|
|
.scroll-buttons {
|
|
|
|
|
|
display: none;
|
|
|
|
|
|
}
|
2026-03-29 14:08:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 400px) {
|
|
|
|
|
|
.tts-panel {
|
2026-03-29 14:10:48 +08:00
|
|
|
|
top: 55px;
|
2026-03-29 14:08:36 +08:00
|
|
|
|
padding: 10px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-controls {
|
|
|
|
|
|
gap: 6px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.tts-btn {
|
|
|
|
|
|
width: 28px;
|
|
|
|
|
|
height: 28px;
|
|
|
|
|
|
font-size: 11px;
|
|
|
|
|
|
}
|
2026-03-29 13:57:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-27 17:42:41 +08:00
|
|
|
|
/* 侧边栏 - 标题固定,内容滚动 */
|
|
|
|
|
|
.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 31</div>
|
2026-03-29 13:57:51 +08:00
|
|
|
|
<h1 class="chapter-title">{{CHAPTER_TITLE}}</h1>
|
2026-03-27 17:42:41 +08:00
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
|
|
<article class="chapter-content">
|
2026-03-29 13:57:51 +08:00
|
|
|
|
<p>从浅栖之地返回阿法利亚营地后,林克将摩根的笔记交给了克伦特。</p>
|
|
|
|
|
|
<p>"夏普伦……"克伦特看着笔记上的名字,脸色变得铁青,"果然是他。我早就怀疑他了。"</p>
|
|
|
|
|
|
<p>"我们现在该怎么办?"林克问。</p>
|
|
|
|
|
|
<p>克伦特沉思了一会儿:"邪龙封印的加固需要四把钥匙,分别由四个骷髅将军看守。但还有一个更紧急的问题——蜘蛛洞穴的艾克洛索最近异常活跃,如果不解决它,前往暗精灵墓地的道路就会被阻断。"</p>
|
|
|
|
|
|
<p>"艾克洛索?"</p>
|
|
|
|
|
|
<p>"一只巨大的变异蜘蛛,是蜘蛛洞穴的统治者。"克伦特解释道,"它最近开始大量繁殖小蜘蛛,如果不及时处理,整个诺伊佩拉地区都会被蜘蛛淹没。"</p>
|
|
|
|
|
|
<p>林克点点头:"明白了。蜘蛛洞穴在哪里?"</p>
|
|
|
|
|
|
<p>"浅栖之地的深处,有一条通往蜘蛛洞穴的通道。"克伦特在地图上标出位置,"小心,艾克洛索比摩根更危险。它的毒液和蛛网都非常致命。"</p>
|
|
|
|
|
|
<p>"我们会小心的。"</p>
|
|
|
|
|
|
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</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>"猛龙断空斩。"林克收回剑,微微喘息,"40级的剑魂技能。我也是第一次实战使用。"</p>
|
|
|
|
|
|
<p>赛丽亚跑过来,担心地看着他:"你没事吧?这个技能消耗很大吗?"</p>
|
|
|
|
|
|
<p>"有点累,但还能坚持。"林克笑了笑,"走吧,BOSS应该就在前面。"</p>
|
|
|
|
|
|
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</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 style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</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 style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
|
|
|
|
|
|
<p>战斗结束后,四人都累得瘫坐在地上。</p>
|
|
|
|
|
|
<p>"终于……结束了……"林克大口喘息着,刚才的猛龙断空斩几乎耗尽了他全部的体力。</p>
|
|
|
|
|
|
<p>"林克!"赛丽亚扑进他的怀里,"你吓死我了!被蛛丝缠住的时候,我以为……"</p>
|
|
|
|
|
|
<p>"没事了,没事了。"林克轻轻拍着她的背,"我这不是好好的吗?"</p>
|
|
|
|
|
|
<p>奥菲利亚也走了过来,虽然没有像赛丽亚那样扑进怀里,但眼中的关切之色溢于言表:"你太乱来了,那种情况下还想着攻击。"</p>
|
|
|
|
|
|
<p>"不冒险的话,怎么能赢呢?"林克笑了笑。</p>
|
|
|
|
|
|
<p>艾伦走过来,伸出手将林克拉了起来:"干得好,剑魂。你的猛龙断空斩……真的很强。"</p>
|
|
|
|
|
|
<p>"谢谢。"林克握住他的手,站了起来。</p>
|
|
|
|
|
|
<p>他看向艾克洛索的尸体,心中暗暗感慨。</p>
|
|
|
|
|
|
<p>这就是40级技能的威力吗?比之前使用的任何招式都要强大。</p>
|
|
|
|
|
|
<p>"走吧。"林克说,"回去向克伦特报告,然后准备前往暗精灵墓地。"</p>
|
|
|
|
|
|
<p>"嗯。"三个同伴同时点头。</p>
|
|
|
|
|
|
<p>他们转身离开蜘蛛洞穴,向着阿法利亚营地的方向走去。</p>
|
|
|
|
|
|
<p>邪龙斯皮兹的封印,还在等待着他们去加固。</p>
|
|
|
|
|
|
<p style="text-align: center; color: var(--text-secondary); text-indent: 0;">···</p>
|
|
|
|
|
|
<p style="text-align: center; color: var(--text-secondary); text-indent: 0; margin-top: 2em;">(第三十一章完)</p>
|
2026-03-27 17:42:41 +08:00
|
|
|
|
|
|
|
|
|
|
</article>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 固定底部导航 -->
|
|
|
|
|
|
<nav class="fixed-nav">
|
|
|
|
|
|
<div class="fixed-nav-content">
|
|
|
|
|
|
<a href="chapter-30.html" class="nav-btn ">上一章</a>
|
|
|
|
|
|
<a href="../chapters.html" class="nav-btn">目录</a>
|
|
|
|
|
|
<a href="chapter-32.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>
|
|
|
|
|
|
|
2026-03-29 13:57:51 +08:00
|
|
|
|
<!-- TTS语音朗读面板 -->
|
|
|
|
|
|
<div class="tts-panel" id="ttsPanel">
|
|
|
|
|
|
<div class="tts-title">语音朗读</div>
|
|
|
|
|
|
<div class="tts-controls">
|
|
|
|
|
|
<button class="tts-btn" id="ttsPlay" title="播放">▶</button>
|
|
|
|
|
|
<button class="tts-btn" id="ttsPause" title="暂停">⏸</button>
|
|
|
|
|
|
<button class="tts-btn" id="ttsStop" title="停止">⏹</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="tts-progress">
|
|
|
|
|
|
<div class="tts-progress-bar">
|
|
|
|
|
|
<div class="tts-progress-fill" id="ttsProgressFill"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="tts-time" id="ttsTime">0 / 0</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="tts-speed">
|
|
|
|
|
|
<span class="tts-speed-label">速度:</span>
|
|
|
|
|
|
<select class="tts-speed-select" id="ttsSpeed">
|
|
|
|
|
|
<option value="0.5">慢速</option>
|
|
|
|
|
|
<option value="0.75">较慢</option>
|
|
|
|
|
|
<option value="1" selected>正常</option>
|
|
|
|
|
|
<option value="1.25">较快</option>
|
|
|
|
|
|
<option value="1.5">快速</option>
|
|
|
|
|
|
<option value="2">极速</option>
|
|
|
|
|
|
</select>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-03-27 17:42:41 +08:00
|
|
|
|
<!-- 侧边栏章节导航 -->
|
|
|
|
|
|
<aside class="sidebar">
|
|
|
|
|
|
<div class="sidebar-title">章节导航</div>
|
|
|
|
|
|
<div class="sidebar-content" id="sidebarContent">
|
2026-03-29 13:57:51 +08:00
|
|
|
|
<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 ">第29章:阿法利亚营地</a>
|
|
|
|
|
|
<a href="chapter-30.html" class="sidebar-chapter ">第30章:浅栖之地</a>
|
|
|
|
|
|
<a href="chapter-31.html" class="sidebar-chapter current">第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>
|
|
|
|
|
|
<a href="chapter-35.html" class="sidebar-chapter ">第35章:邪龙斯皮兹</a>
|
|
|
|
|
|
<a href="chapter-36.html" class="sidebar-chapter ">第36章:莎兰的探望</a>
|
|
|
|
|
|
<a href="chapter-37.html" class="sidebar-chapter ">第37章:暗影迷宫·影子剑士</a>
|
|
|
|
|
|
<a href="chapter-38.html" class="sidebar-chapter ">第38章:熔岩穴·泰坦之怒</a>
|
|
|
|
|
|
<a href="chapter-39.html" class="sidebar-chapter ">第39章:暗黑城入口·无头骑士</a>
|
|
|
|
|
|
<a href="chapter-40.html" class="sidebar-chapter ">第40章:万年雪山·冰心少年</a>
|
|
|
|
|
|
<a href="chapter-41.html" class="sidebar-chapter ">第41章:敏泰的加入</a>
|
|
|
|
|
|
<a href="chapter-42.html" class="sidebar-chapter ">第42章:山脊·野兽师</a>
|
|
|
|
|
|
<a href="chapter-43.html" class="sidebar-chapter ">第43章:番外·雪山温泉</a>
|
|
|
|
|
|
<a href="chapter-44.html" class="sidebar-chapter ">第44章:白色废墟</a>
|
|
|
|
|
|
<a href="chapter-45.html" class="sidebar-chapter ">第45章:冰雪宫殿</a>
|
|
|
|
|
|
<a href="chapter-46.html" class="sidebar-chapter ">第46章:布万加修炼场</a>
|
|
|
|
|
|
<a href="chapter-47.html" class="sidebar-chapter ">第47章:斯卡萨之巢·龙威</a>
|
|
|
|
|
|
<a href="chapter-48.html" class="sidebar-chapter ">第48章:斯卡萨之巢·龙陨</a>
|
|
|
|
|
|
<a href="chapter-49.html" class="sidebar-chapter ">第49章:重返赫顿玛尔</a>
|
|
|
|
|
|
<a href="chapter-50.html" class="sidebar-chapter ">第50章:诺斯玛尔·盗贼团</a>
|
|
|
|
|
|
<a href="chapter-51.html" class="sidebar-chapter ">第51章:哈穆林·鼠患</a>
|
|
|
|
|
|
<a href="chapter-52.html" class="sidebar-chapter ">第52章:月光酒馆·寻找阿甘左</a>
|
|
|
|
|
|
<a href="chapter-53.html" class="sidebar-chapter ">第53章:番外·帕丽丝的誓言</a>
|
|
|
|
|
|
<a href="chapter-54.html" class="sidebar-chapter ">第54章:觉醒之路·启程</a>
|
|
|
|
|
|
<a href="chapter-55.html" class="sidebar-chapter ">第55章:比尔马克帝国试验场</a>
|
|
|
|
|
|
<a href="chapter-56.html" class="sidebar-chapter ">第56章:王的遗迹·远古五骑士</a>
|
|
|
|
|
|
<a href="chapter-57.html" class="sidebar-chapter ">第57章:心灵试炼·剑圣觉醒</a>
|
|
|
|
|
|
<a href="chapter-58.html" class="sidebar-chapter ">第58章:番外·后宫的温馨</a>
|
|
|
|
|
|
<a href="chapter-59.html" class="sidebar-chapter ">第59章:敏泰的思念</a>
|
|
|
|
|
|
<a href="chapter-60.html" class="sidebar-chapter ">第60章:敏泰加入·前往诺伊佩拉</a>
|
|
|
|
|
|
<a href="chapter-61.html" class="sidebar-chapter ">第61章:悲鸣洞穴·阿甘左与卢克西</a>
|
|
|
|
|
|
|
2026-03-27 17:42:41 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</aside>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
// 记录阅读进度
|
|
|
|
|
|
let readChapters = JSON.parse(localStorage.getItem('readChapters') || '[]');
|
|
|
|
|
|
if (!readChapters.includes(31)) {
|
2026-03-29 13:57:51 +08:00
|
|
|
|
readChapters.push({{CHAPTER_ID}});
|
2026-03-27 17:42:41 +08:00
|
|
|
|
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' });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2026-03-29 13:57:51 +08:00
|
|
|
|
|
|
|
|
|
|
// ========== TTS语音朗读功能 ==========
|
|
|
|
|
|
let ttsSynth = window.speechSynthesis;
|
|
|
|
|
|
let ttsUtterance = null;
|
|
|
|
|
|
let ttsText = '';
|
|
|
|
|
|
let ttsSentences = [];
|
|
|
|
|
|
let ttsCurrentIndex = 0;
|
|
|
|
|
|
let ttsIsPlaying = false;
|
|
|
|
|
|
let ttsIsPaused = false;
|
|
|
|
|
|
let ttsSpeed = 1;
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化:提取章节内容
|
|
|
|
|
|
function initTTS() {
|
|
|
|
|
|
const contentEl = document.querySelector('.chapter-content');
|
|
|
|
|
|
if (!contentEl) return;
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所有段落文本,清理HTML标签
|
|
|
|
|
|
ttsText = contentEl.innerText || contentEl.textContent;
|
|
|
|
|
|
// 分割成句子(中文按句号、问号、感叹号分割)
|
|
|
|
|
|
ttsSentences = ttsText.match(/[^。!?\n]+[。!?\n]+|[^。!?\n]+$/g) || [ttsText];
|
|
|
|
|
|
ttsSentences = ttsSentences.filter(s => s.trim().length > 0);
|
|
|
|
|
|
|
|
|
|
|
|
updateTTSProgress();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新进度显示
|
|
|
|
|
|
function updateTTSProgress() {
|
|
|
|
|
|
const total = ttsSentences.length;
|
|
|
|
|
|
const current = ttsCurrentIndex;
|
|
|
|
|
|
document.getElementById('ttsTime').textContent = `${current} / ${total}`;
|
|
|
|
|
|
const percent = total > 0 ? (current / total * 100) : 0;
|
|
|
|
|
|
document.getElementById('ttsProgressFill').style.width = `${percent}%`;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 播放当前句子
|
|
|
|
|
|
function playCurrentSentence() {
|
|
|
|
|
|
if (ttsCurrentIndex >= ttsSentences.length) {
|
|
|
|
|
|
stopTTS();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const text = ttsSentences[ttsCurrentIndex].trim();
|
|
|
|
|
|
ttsUtterance = new SpeechSynthesisUtterance(text);
|
|
|
|
|
|
ttsUtterance.lang = 'zh-CN';
|
|
|
|
|
|
ttsUtterance.rate = ttsSpeed;
|
|
|
|
|
|
|
|
|
|
|
|
// 尝试选择中文语音
|
|
|
|
|
|
const voices = ttsSynth.getVoices();
|
|
|
|
|
|
const zhVoice = voices.find(v => v.lang.includes('zh') || v.lang.includes('CN'));
|
|
|
|
|
|
if (zhVoice) {
|
|
|
|
|
|
ttsUtterance.voice = zhVoice;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ttsUtterance.onend = () => {
|
|
|
|
|
|
if (ttsIsPlaying && !ttsIsPaused) {
|
|
|
|
|
|
ttsCurrentIndex++;
|
|
|
|
|
|
updateTTSProgress();
|
|
|
|
|
|
playCurrentSentence();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ttsUtterance.onerror = (e) => {
|
|
|
|
|
|
console.error('TTS error:', e);
|
|
|
|
|
|
if (ttsIsPlaying) {
|
|
|
|
|
|
ttsCurrentIndex++;
|
|
|
|
|
|
updateTTSProgress();
|
|
|
|
|
|
playCurrentSentence();
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
ttsSynth.speak(ttsUtterance);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 播放
|
|
|
|
|
|
function playTTS() {
|
|
|
|
|
|
if (ttsSentences.length === 0) {
|
|
|
|
|
|
initTTS();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (ttsIsPaused) {
|
|
|
|
|
|
ttsSynth.resume();
|
|
|
|
|
|
ttsIsPaused = false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
ttsIsPlaying = true;
|
|
|
|
|
|
playCurrentSentence();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
document.getElementById('ttsPlay').classList.add('active');
|
|
|
|
|
|
document.getElementById('ttsPause').classList.remove('active');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 暂停
|
|
|
|
|
|
function pauseTTS() {
|
|
|
|
|
|
if (ttsIsPlaying) {
|
|
|
|
|
|
ttsSynth.pause();
|
|
|
|
|
|
ttsIsPaused = true;
|
|
|
|
|
|
document.getElementById('ttsPlay').classList.remove('active');
|
|
|
|
|
|
document.getElementById('ttsPause').classList.add('active');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 停止
|
|
|
|
|
|
function stopTTS() {
|
|
|
|
|
|
ttsSynth.cancel();
|
|
|
|
|
|
ttsIsPlaying = false;
|
|
|
|
|
|
ttsIsPaused = false;
|
|
|
|
|
|
ttsCurrentIndex = 0;
|
|
|
|
|
|
updateTTSProgress();
|
|
|
|
|
|
document.getElementById('ttsPlay').classList.remove('active');
|
|
|
|
|
|
document.getElementById('ttsPause').classList.remove('active');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置速度
|
|
|
|
|
|
function setTTSSpeed(speed) {
|
|
|
|
|
|
ttsSpeed = parseFloat(speed);
|
|
|
|
|
|
// 如果正在播放,需要重新开始当前句子
|
|
|
|
|
|
if (ttsIsPlaying && !ttsIsPaused) {
|
|
|
|
|
|
ttsSynth.cancel();
|
|
|
|
|
|
playCurrentSentence();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 绑定事件
|
|
|
|
|
|
document.getElementById('ttsPlay').addEventListener('click', playTTS);
|
|
|
|
|
|
document.getElementById('ttsPause').addEventListener('click', pauseTTS);
|
|
|
|
|
|
document.getElementById('ttsStop').addEventListener('click', stopTTS);
|
|
|
|
|
|
document.getElementById('ttsSpeed').addEventListener('change', (e) => setTTSSpeed(e.target.value));
|
|
|
|
|
|
|
|
|
|
|
|
// 加载语音列表(某些浏览器需要异步加载)
|
|
|
|
|
|
if (speechSynthesis.onvoiceschanged !== undefined) {
|
|
|
|
|
|
speechSynthesis.onvoiceschanged = initTTS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 页面加载时初始化
|
|
|
|
|
|
window.addEventListener('load', () => {
|
|
|
|
|
|
initTTS();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 页面离开时停止播放
|
|
|
|
|
|
window.addEventListener('beforeunload', stopTTS);
|
2026-03-27 17:42:41 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
</body>
|
2026-03-25 09:30:34 +08:00
|
|
|
|
</html>
|