HTML5 在线漫画阅读器 (index.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=3,user-scalable=yes">
<title>我老婆是学生会长! - 在线漫画阅读器</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{background:#0d0f17;color:#f1f5f9;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;min-height:100vh;display:flex;flex-direction:column}
header{position:sticky;top:0;z-index:50;background:rgba(13,15,23,0.92);backdrop-filter:blur(12px);border-bottom:1px solid rgba(255,255,255,0.09);padding:10px 16px;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:10px}
.badge{background:linear-gradient(135deg,#ec4899,#8b5cf6);color:#fff;font-size:11px;font-weight:700;padding:3px 8px;border-radius:99px}
.title{font-size:16px;font-weight:700;color:#fff}
.controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
button{background:rgba(255,255,255,0.08);color:#e2e8f0;border:1px solid rgba(255,255,255,0.14);padding:6px 12px;border-radius:8px;font-size:12px;cursor:pointer;transition:.18s}
button:hover,button.active{background:#ec4899;color:#fff;border-color:#ec4899}
.hero{max-width:920px;margin:16px auto;padding:18px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);border-radius:14px;display:flex;gap:18px;align-items:flex-start}
.hero img{width:120px;height:160px;object-fit:cover;border-radius:10px;flex-shrink:0;box-shadow:0 8px 24px rgba(0,0,0,0.45)}
.hero-meta h1{font-size:20px;margin-bottom:6px}
.hero-meta .sub{font-size:13px;color:#94a3b8;margin-bottom:8px}
.tags{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.tag{background:rgba(236,72,153,0.16);color:#f472b6;padding:2px 8px;border-radius:6px;font-size:11px}
.desc{font-size:13px;line-height:1.6;color:#cbd5e1}
.reader-wrap{max-width:860px;width:100%;margin:0 auto 40px;padding:0 8px;flex:1}
.scroll-mode .page-card{margin-bottom:10px;background:#161925;border-radius:8px;overflow:hidden;box-shadow:0 6px 20px rgba(0,0,0,0.4)}
.scroll-mode .page-card img{width:100%;height:auto;display:block}
.page-footer{text-align:center;font-size:11px;color:#64748b;padding:4px 0}
.flip-controls{display:none;justify-content:center;align-items:center;gap:14px;margin:14px 0}
.flip-mode .flip-controls{display:flex}
.drawer{display:none;max-width:920px;margin:0 auto 20px;padding:16px;background:rgba(255,255,255,0.04);border-radius:12px;border:1px solid rgba(255,255,255,0.1)}
.drawer.open{display:block}
.chap-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:8px;margin-top:10px}
.chap-item{padding:8px 10px;background:rgba(255,255,255,0.06);border-radius:8px;font-size:12px;color:#e2e8f0;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chap-item:hover{background:rgba(236,72,153,0.28)}
@media(max-width:600px){.hero{flex-direction:column;align-items:center;text-align:center}.tags{justify-content:center}}
</style>
</head>
<body>
<header>
<div class="brand">
<span class="badge">BILIMANGA · 统一媒体库</span>
<span class="title" id="hdrTitle"></span>
</div>
<div class="controls">
<button id="btnScroll" class="active" onclick="setMode('scroll')">条漫下拉模式</button>
<button id="btnFlip" onclick="setMode('flip')">单页翻页模式</button>
<button onclick="toggleCatalog()">章节目录 (<span id="chapCount">0</span>)</button>
<button onclick="cycleLang()" id="btnLang">繁/簡/EN</button>
</div>
</header>
<section class="hero">
<img id="heroCover" src="" alt="cover">
<div class="hero-meta">
<h1 id="heroTitle"></h1>
<div class="sub" id="heroSub"></div>
<div class="tags" id="heroTags"></div>
<p class="desc" id="heroDesc"></p>
</div>
</section>
<section class="drawer" id="catDrawer">
<h3 style="font-size:14px;margin-bottom:6px">全卷章节目录 (点击切换预览章节)</h3>
<div class="chap-grid" id="chapGrid"></div>
</section>
<div class="reader-wrap scroll-mode" id="readerWrap">
<div class="flip-controls">
<button onclick="stepPage(-1)">◀ 上一页</button>
<span id="pageIndicator" style="font-size:13px;color:#cbd5e1">1 / 1</span>
<button onclick="stepPage(1)">下一页 ▶</button>
</div>
<div id="pagesContainer"></div>
</div>
<script>
const COMIC = {"slug": "bilimanga-1599", "mangaid": "1599", "zh_title": "我老婆是学生会长!", "hant_title": "我老婆是學生會長!", "en_title": "我老婆是学生会长! (Bilimanga #1599)", "author": "中田ゆみ", "tags": ["校园", "恋爱", "欢乐", "后宫", "萌系", "校园青春", "日本漫画", "漫画"], "zh_desc": "进入新学校星风高中就读的和泉隼斗,虽然参加了学校第一届学生会长选举,但是居然输给在演讲时说要推动校内恋爱自由化,而且还对台下丢了一大堆保险套的若菜羽衣,于是只好以副会长的身份参加学生会。但是在开完第一次会议的当天晚上,学生会长羽衣,就跑到隼斗家中,宣告自己是他的未婚妻,原来两人的双亲是旧识,在以前就约定好要让小孩结婚,面对这个「送上门的老婆」,隼斗该如何是好?\n\n📚 作品信息:作者 中田ゆみ · 评分 10 · 共收录 13 卷 / 69 话章节目录与高清彩页/条漫预览。", "hant_desc": "進入新學校星風高中就讀的和泉隼斗,雖然參加了學校第一屆學生會長選舉,但是居然輸給在演講時說要推動校內戀愛自由化,而且還對台下丟了一大堆保險套的若菜羽衣,於是只好以副會長的身份參加學生會。但是在開完第一次會議的當天晚上,學生會長羽衣,就跑到隼斗家中,宣告自己是他的未婚妻,原來兩人的雙親是舊識,在以前就約定好要讓小孩結婚,面對這個「送上門的老婆」,隼斗該如何是好?\n\n📚 作品資訊:作者 中田ゆみ · 評分 10 · 共收錄 13 卷 / 69 話章節目錄與高清彩頁/條漫預覽。", "en_desc": "Popular serialized manga '我老婆是学生会长!' (我老婆是學生會長!) by 中田ゆみ. Includes 13 volumes and 69 chapters with full online vertical/page-flip web reader.", "pages": ["https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_01.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_02.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_03.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_04.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_05.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-1599/page_06.jpg"], "volumes": [{"title_hant": "我老婆是學生會長! 1", "title_zh": "我老婆是学生会长! 1", "cover_id": 2885560, "first_chap_id": 131920, "cover_url": "https://i.motiezw.com/cover/1599/2885560.jpg"}, {"title_hant": "我老婆是學生會長! 2", "title_zh": "我老婆是学生会长! 2", "cover_id": 2885726, "first_chap_id": 131926, "cover_url": "https://i.motiezw.com/cover/1599/2885726.jpg"}, {"title_hant": "我老婆是學生會長! 3", "title_zh": "我老婆是学生会长! 3", "cover_id": 2885900, "first_chap_id": 131932, "cover_url": "https://i.motiezw.com/cover/1599/2885900.jpg"}, {"title_hant": "我老婆是學生會長! 4", "title_zh": "我老婆是学生会长! 4", "cover_id": 2886066, "first_chap_id": 131938, "cover_url": "https://i.motiezw.com/cover/1599/2886066.jpg"}, {"title_hant": "我老婆是學生會長! 5", "title_zh": "我老婆是学生会长! 5", "cover_id": 2886236, "first_chap_id": 131944, "cover_url": "https://i.motiezw.com/cover/1599/2886236.jpg"}, {"title_hant": "我老婆是學生會長! 6", "title_zh": "我老婆是学生会长! 6", "cover_id": 2886412, "first_chap_id": 131951, "cover_url": "https://i.motiezw.com/cover/1599/2886412.jpg"}, {"title_hant": "我老婆是學生會長! 7", "title_zh": "我老婆是学生会长! 7", "cover_id": 2886583, "first_chap_id": 131957, "cover_url": "https://i.motiezw.com/cover/1599/2886583.jpg"}, {"title_hant": "我老婆是學生會長! 8", "title_zh": "我老婆是学生会长! 8", "cover_id": 2886754, "first_chap_id": 131963, "cover_url": "https://i.motiezw.com/cover/1599/2886754.jpg"}, {"title_hant": "我老婆是學生會長! 9", "title_zh": "我老婆是学生会长! 9", "cover_id": 2886924, "first_chap_id": 131969, "cover_url": "https://i.motiezw.com/cover/1599/2886924.jpg"}, {"title_hant": "我老婆是學生會長! 10", "title_zh": "我老婆是学生会长! 10", "cover_id": 2887093, "first_chap_id": 131976, "cover_url": "https://i.motiezw.com/cover/1599/2887093.jpg"}, {"title_hant": "我老婆是學生會長! 11", "title_zh": "我老婆是学生会长! 11", "cover_id": 2887265, "first_chap_id": 131982, "cover_url": "https://i.motiezw.com/cover/1599/2887265.jpg"}, {"title_hant": "我老婆是學生會長! 12", "title_zh": "我老婆是学生会长! 12", "cover_id": 2887444, "first_chap_id": 131989, "cover_url": "https://i.motiezw.com/cover/1599/2887444.jpg"}], "chapters": [{"cid": "131920", "title": "第YY★★學生會長的婆家", "title_zh": "第YY★★学生会长的婆家"}, {"cid": "131921", "title": "第二夜★★學生會長與家裡叔", "title_zh": "第二夜★★学生会长与家里叔"}, {"cid": "131922", "title": "第三夜★★學生會長與某個日常", "title_zh": "第三夜★★学生会长与某个日常"}, {"cid": "131923", "title": "第四夜★★學生會長與新倉同學(與三隅同學)", "title_zh": "第四夜★★学生会长与新仓同学(与三隅同学)"}, {"cid": "131924", "title": "第五夜★★學生會長與牽手實驗", "title_zh": "第五夜★★学生会长与牵手实验"}, {"cid": "131926", "title": "第六夜★★學生會長與浴室嬉戲", "title_zh": "第六夜★★学生会长与浴室嬉戏"}, {"cid": "131927", "title": "第七夜★★學生會長與外出購物", "title_zh": "第七夜★★学生会长与外出购物"}, {"cid": "131928", "title": "第八夜★★在學生會長不在的地方避雨", "title_zh": "第八夜★★在学生会长不在的地方避雨"}, {"cid": "131929", "title": "第九夜★★學生會長與和好之物", "title_zh": "第九夜★★学生会长与和好之物"}, {"cid": "131930", "title": "第十夜★★學生會長與岳母大人", "title_zh": "第十夜★★学生会长与岳母大人"}, {"cid": "131932", "title": "第十YY★★學生會長和岳母大人和藤咲同學", "title_zh": "第十YY★★学生会长和岳母大人和藤咲同学"}, {"cid": "131933", "title": "第十二夜★★教教我吧 學生會長", "title_zh": "第十二夜★★教教我吧 学生会长"}, {"cid": "131934", "title": "第十三夜★★有點凶猛的新倉同學", "title_zh": "第十三夜★★有点凶猛的新仓同学"}, {"cid": "131935", "title": "第十四夜★★危險啊 令人擔心的三隅同學", "title_zh": "第十四夜★★危险啊 令人担心的三隅同学"}, {"cid": "131936", "title": "第十五夜★★和學生會長調Q", "title_zh": "第十五夜★★和学生会长调Q"}, {"cid": "131938", "title": "第十六夜★★鬼鬼祟祟的學生會長", "title_zh": "第十六夜★★鬼鬼祟祟的学生会长"}, {"cid": "131939", "title": "第十七夜★★副會長與天敵藤咲同學", "title_zh": "第十七夜★★副会长与天敌藤咲同学"}, {"cid": "131940", "title": "第十八夜★★副會長與保健室的2只惡魔", "title_zh": "第十八夜★★副会长与保健室的2只恶魔"}, {"cid": "131941", "title": "第十九夜★★學生會長來加油打氣", "title_zh": "第十九夜★★学生会长来加油打气"}, {"cid": "131942", "title": "第二十夜★★學生會長與賄賂與暴露", "title_zh": "第二十夜★★学生会长与贿赂与暴露"}, {"cid": "131944", "title": "第二十YY★★藤咲同學憂鬱的星期天", "title_zh": "第二十YY★★藤咲同学忧郁的星期天"}, {"cid": "131945", "title": "第二十二夜★★猿渡的盛夏禮物", "title_zh": "第二十二夜★★猿渡的盛夏礼物"}, {"cid": "131946", "title": "第二十三夜★★學生會長16歲了!", "title_zh": "第二十三夜★★学生会长16岁了!"}, {"cid": "131947", "title": "第二十四夜★★會長的父親", "title_zh": "第二十四夜★★会长的父亲"}, {"cid": "131948", "title": "第二十五夜★★風紀委員長與盛夏祭典", "title_zh": "第二十五夜★★风纪委员长与盛夏祭典"}, {"cid": "131949", "title": "第二十五夜★★夏天某日的學生會", "title_zh": "第二十五夜★★夏天某日的学生会"}, {"cid": "131951", "title": "第二十六夜★★學生會長的幫助", "title_zh": "第二十六夜★★学生会长的帮助"}, {"cid": "131952", "title": "第二十七夜★★風紀委員長的覺醒(暫時)", "title_zh": "第二十七夜★★风纪委员长的觉醒(暂时)"}, {"cid": "131953", "title": "第二十八夜★★學生會長與攝影部部長", "title_zh": "第二十八夜★★学生会长与摄影部部长"}, {"cid": "131954", "title": "第二十九夜★★攝影部部長的試煉!⋯⋯類似這樣的東西", "title_zh": "第二十九夜★★摄影部部长的试炼!⋯⋯类似这样的东西"}, {"cid": "131955", "title": "第三十夜★★副會長與他(前夜祭)", "title_zh": "第三十夜★★副会长与他(前夜祭)"}, {"cid": "131957", "title": "第三十YY★★副會長和他(開祭中)", "title_zh": "第三十YY★★副会长和他(开祭中)"}, {"cid": "131958", "title": "第三十二夜★★副會長漫長的夜晚", "title_zh": "第三十二夜★★副会长漫长的夜晚"}, {"cid": "131959", "title": "第三十三夜★★會長與風紀委員長的不能讓步的鬥爭", "title_zh": "第三十三夜★★会长与风纪委员长的不能让步的斗争"}, {"cid": "131960", "title": "第三十四夜★★風紀委員長的困惑與火鍋", "title_zh": "第三十四夜★★风纪委员长的困惑与火锅"}, {"cid": "131961", "title": "第三十五夜★★學生會長的努力與冬天的YH", "title_zh": "第三十五夜★★学生会长的努力与冬天的YH"}, {"cid": "131963", "title": "第三十六夜★★攝影部部長隱藏的慾望", "title_zh": "第三十六夜★★摄影部部长隐藏的欲望"}, {"cid": "131964", "title": "第三十七夜★★新倉同學與危險的午後", "title_zh": "第三十七夜★★新仓同学与危险的午后"}, {"cid": "131965", "title": "第三十八夜★★學生會長與放學後的全力奔跑", "title_zh": "第三十八夜★★学生会长与放学后的全力奔跑"}, {"cid": "131966", "title": "第三十九夜★★學生會長與婆婆", "title_zh": "第三十九夜★★学生会长与婆婆"}, {"cid": "131967", "title": "第四十夜★★學生會長與風紀委員長的煩惱", "title_zh": "第四十夜★★学生会长与风纪委员长的烦恼"}, {"cid": "131969", "title": "第四十YY★★副會長與會議的某種進展", "title_zh": "第四十YY★★副会长与会议的某种进展"}, {"cid": "131970", "title": "第四十二夜★★風紀委員・猿渡同學的憂慮", "title_zh": "第四十二夜★★风纪委员・猿渡同学的忧虑"}, {"cid": "131971", "title": "第四十三夜★★學生會長與冬之策略", "title_zh": "第四十三夜★★学生会长与冬之策略"}, {"cid": "131972", "title": "第四十四夜★★學生會長(+α)與神聖的夜晚", "title_zh": "第四十四夜★★学生会长(+α)与神圣的夜晚"}, {"cid": "131973", "title": "第四十五夜★★新倉同學的冬之來襲", "title_zh": "第四十五夜★★新仓同学的冬之来袭"}, {"cid": "131974", "title": "第四十六夜★★學生會長與大掃除!", "title_zh": "第四十六夜★★学生会长与大扫除!"}, {"cid": "131976", "title": "第四十七夜★★副會長的父親", "title_zh": "第四十七夜★★副会长的父亲"}, {"cid": "131977", "title": "第四十八夜★★飯團與學生會長", "title_zh": "第四十八夜★★饭团与学生会长"}, {"cid": "131978", "title": "第四十九夜★★攝影部部長的觀察", "title_zh": "第四十九夜★★摄影部部长的观察"}, {"cid": "131979", "title": "第五十夜★★副會長與危險!三隅老師", "title_zh": "第五十夜★★副会长与危险!三隅老师"}, {"cid": "131980", "title": "第五十YY★★Q人節與風紀委員長(與會長)", "title_zh": "第五十YY★★Q人节与风纪委员长(与会长)"}, {"cid": "131982", "title": "第五十二夜★★學生會長與扮演遊戲", "title_zh": "第五十二夜★★学生会长与扮演游戏"}, {"cid": "131983", "title": "第五十三夜★★風紀委員長與新生君(與副會長)", "title_zh": "第五十三夜★★风纪委员长与新生君(与副会长)"}, {"cid": "131984", "title": "第五十四夜★★換班與學生會書記的想法", "title_zh": "第五十四夜★★换班与学生会书记的想法"}, {"cid": "131985", "title": "第五十五夜★★副會長的紀念日攻防戰", "title_zh": "第五十五夜★★副会长的纪念日攻防战"}, {"cid": "131986", "title": "第五十六夜★★副會長助理與未知的遭遇", "title_zh": "第五十六夜★★副会长助理与未知的遭遇"}, {"cid": "131987", "title": "第五十七夜★★風紀委員長的真・覺醒", "title_zh": "第五十七夜★★风纪委员长的真・觉醒"}, {"cid": "131989", "title": "第五十八夜★★學生會長的焦急", "title_zh": "第五十八夜★★学生会长的焦急"}, {"cid": "131990", "title": "第五十九夜★★學生會長與風紀委員長的浴室熱鬥", "title_zh": "第五十九夜★★学生会长与风纪委员长的浴室热斗"}]};
let lang = 'zh';
let mode = 'scroll';
let curPage = 0;
function renderMeta() {
const t = lang === 'zh' ? COMIC.zh_title : (lang === 'hant' ? COMIC.hant_title : COMIC.en_title);
const d = lang === 'zh' ? COMIC.zh_desc : (lang === 'hant' ? COMIC.hant_desc : COMIC.en_desc);
document.getElementById('hdrTitle').textContent = t;
document.getElementById('heroTitle').textContent = t;
document.getElementById('heroSub').textContent = `${COMIC.author} · 共 ${COMIC.volumes.length} 卷 / ${COMIC.chapters.length} 话`;
document.getElementById('heroDesc').textContent = d;
document.getElementById('heroCover').src = COMIC.pages[0] || '';
document.getElementById('chapCount').textContent = COMIC.chapters.length;
const tg = document.getElementById('heroTags');
tg.innerHTML = '';
(COMIC.tags || []).forEach(x => {
const s = document.createElement('span');
s.className = 'tag';
s.textContent = x;
tg.appendChild(s);
});
}
function renderCatalog() {
const g = document.getElementById('chapGrid');
g.innerHTML = '';
(COMIC.chapters || []).forEach((c, idx) => {
const d = document.createElement('div');
d.className = 'chap-item';
d.textContent = c.title_zh || c.title;
d.onclick = () => {
curPage = idx % COMIC.pages.length;
if (mode === 'flip') renderPages();
else document.querySelectorAll('.page-card')[curPage]?.scrollIntoView({behavior:'smooth'});
document.getElementById('catDrawer').classList.remove('open');
};
g.appendChild(d);
});
}
function renderPages() {
const wrap = document.getElementById('readerWrap');
wrap.className = 'reader-wrap ' + (mode === 'scroll' ? 'scroll-mode' : 'flip-mode');
const box = document.getElementById('pagesContainer');
box.innerHTML = '';
const list = mode === 'scroll' ? COMIC.pages : [COMIC.pages[curPage]];
list.forEach((url, i) => {
const idx = mode === 'scroll' ? i : curPage;
const card = document.createElement('div');
card.className = 'page-card';
card.innerHTML = `<img src="${url}" loading="lazy" alt="Page ${idx+1}"><div class="page-footer">第 ${idx+1} / ${COMIC.pages.length} 页 · ${COMIC.zh_title}</div>`;
if (mode === 'flip') card.onclick = () => stepPage(1);
box.appendChild(card);
});
document.getElementById('pageIndicator').textContent = `${curPage + 1} / ${COMIC.pages.length}`;
}
function setMode(m) {
mode = m;
document.getElementById('btnScroll').classList.toggle('active', m === 'scroll');
document.getElementById('btnFlip').classList.toggle('active', m === 'flip');
renderPages();
}
function stepPage(delta) {
curPage = (curPage + delta + COMIC.pages.length) % COMIC.pages.length;
renderPages();
}
function toggleCatalog() {
document.getElementById('catDrawer').classList.toggle('open');
}
function cycleLang() {
lang = lang === 'zh' ? 'hant' : (lang === 'hant' ? 'en' : 'zh');
renderMeta();
}
renderMeta();
renderCatalog();
renderPages();
</script>
</body>
</html>