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-562", "mangaid": "562", "zh_title": "拥有超常技能的异世界流浪美食家", "hant_title": "擁有超常技能的異世界流浪美食家", "en_title": "拥有超常技能的异世界流浪美食家 (Bilimanga #562)", "author": "赤岸K / 江口连 / 雅", "tags": ["转生", "异世界", "奇幻", "冒险", "美食", "奇幻冒险", "日本漫画", "漫画"], "zh_desc": "被牵连进召唤勇者仪式,不小心来到异世界的向田刚志,早早就察觉国王有问题,领了一些生活费后就赶紧离开王国,打算以固有技能【网路超市】制作美食来闯荡异世界!化名为穆寇达的他,没想到自己做的姜汁猪肉居然吸引传说的魔兽芬里尔成为自己的从魔--?就这样被贪吃鬼从魔弄得团团转的异世界人美食家与魔兽的流浪旅程,揭开序幕!\n\n📚 作品信息:作者 赤岸K / 江口连 / 雅 · 评分 9.3 · 共收录 10 卷 / 66 话章节目录与高清彩页/条漫预览。", "hant_desc": "被牽連進召喚勇者儀式,不小心來到異世界的向田剛志,早早就察覺國王有問題,領了一些生活費後就趕緊離開王國,打算以固有技能【網路超市】製作美食來闖蕩異世界!化名為穆寇達的他,沒想到自己做的薑汁豬肉居然吸引傳說的魔獸芬里爾成為自己的從魔--?就這樣被貪吃鬼從魔弄得團團轉的異世界人美食家與魔獸的流浪旅程,揭開序幕!\n\n📚 作品資訊:作者 赤岸K / 江口連 / 雅 · 評分 9.3 · 共收錄 10 卷 / 66 話章節目錄與高清彩頁/條漫預覽。", "en_desc": "Popular serialized manga '拥有超常技能的异世界流浪美食家' (擁有超常技能的異世界流浪美食家) by 赤岸K / 江口连 / 雅. Includes 10 volumes and 66 chapters with full online vertical/page-flip web reader.", "pages": ["https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_01.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_02.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_03.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_04.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_05.jpg", "https://media.huangguodrama.ai/motion/comics/bilimanga-562/page_06.jpg"], "volumes": [{"title_hant": "擁有超常技能的異世界流浪美食家 1", "title_zh": "拥有超常技能的异世界流浪美食家 1", "cover_id": 2705938, "first_chap_id": 44225, "cover_url": "https://i.motiezw.com/cover/562/2705938.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 2", "title_zh": "拥有超常技能的异世界流浪美食家 2", "cover_id": 2706117, "first_chap_id": 44231, "cover_url": "https://i.motiezw.com/cover/562/2706117.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 3", "title_zh": "拥有超常技能的异世界流浪美食家 3", "cover_id": 2706281, "first_chap_id": 44237, "cover_url": "https://i.motiezw.com/cover/562/2706281.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 4", "title_zh": "拥有超常技能的异世界流浪美食家 4", "cover_id": 2706447, "first_chap_id": 44254, "cover_url": "https://i.motiezw.com/cover/562/2706447.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 5", "title_zh": "拥有超常技能的异世界流浪美食家 5", "cover_id": 2706613, "first_chap_id": 44261, "cover_url": "https://i.motiezw.com/cover/562/2706613.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 6", "title_zh": "拥有超常技能的异世界流浪美食家 6", "cover_id": 2706778, "first_chap_id": 44269, "cover_url": "https://i.motiezw.com/cover/562/2706778.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 7", "title_zh": "拥有超常技能的异世界流浪美食家 7", "cover_id": 2706940, "first_chap_id": 44276, "cover_url": "https://i.motiezw.com/cover/562/2706940.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 8", "title_zh": "拥有超常技能的异世界流浪美食家 8", "cover_id": 2707102, "first_chap_id": 44283, "cover_url": "https://i.motiezw.com/cover/562/2707102.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 9", "title_zh": "拥有超常技能的异世界流浪美食家 9", "cover_id": 2707266, "first_chap_id": 44290, "cover_url": "https://i.motiezw.com/cover/562/2707266.jpg"}, {"title_hant": "擁有超常技能的異世界流浪美食家 10", "title_zh": "拥有超常技能的异世界流浪美食家 10", "cover_id": 951726, "first_chap_id": 44298, "cover_url": "https://i.motiezw.com/cover/562/951726.jpg"}], "chapters": [{"cid": "44225", "title": "第1章 被牽連進勇者召喚儀式裡 但感覺事有蹊蹺於是立刻落跑了", "title_zh": "第1章 被牵连进勇者召唤仪式里 但感觉事有蹊跷于是立刻落跑了"}, {"cid": "44226", "title": "第2章 煮了薑汁豬禸後不知為何傳說的魔獸 成了我的從魔", "title_zh": "第2章 煮了姜汁猪禸后不知为何传说的魔兽 成了我的从魔"}, {"cid": "44227", "title": "第3章 帶著傳說的魔獸接近國境 要入境真的很辛苦", "title_zh": "第3章 带著传说的魔兽接近国境 要入境真的很辛苦"}, {"cid": "44228", "title": "第4章 事不宜遲加入商人公會後就試著 委託公會收購了", "title_zh": "第4章 事不宜迟加入商人公会后就试著 委托公会收购了"}, {"cid": "44229", "title": "第5章 為了確保緋爾要吃的禸只好也加入冒險者公會", "title_zh": "第5章 为了确保绯尔要吃的禸只好也加入冒险者公会"}, {"cid": "124156", "title": "附錄", "title_zh": "附录"}, {"cid": "44231", "title": "第6章 為了填飽緋爾肚子所帶過來的魔物群,帶來了意想之外的財富", "title_zh": "第6章 为了填饱绯尔肚子所带过来的魔物群,带来了意想之外的财富"}, {"cid": "44232", "title": "第7章 決定暫時禁止使用異世界的食材⋯⋯", "title_zh": "第7章 决定暂时禁止使用异世界的食材⋯⋯"}, {"cid": "44233", "title": "第8章 想說要學會魔法,沒想到卻遭遇可怕的事⋯⋯", "title_zh": "第8章 想说要学会魔法,没想到却遭遇可怕的事⋯⋯"}, {"cid": "44234", "title": "第9章 雖然取得了可以得知異世界Q勢的地圖了⋯⋯", "title_zh": "第9章 虽然取得了可以得知异世界Q势的地图了⋯⋯"}, {"cid": "44235", "title": "第10章 被魚料理所吸引而來的新魔物出現了", "title_zh": "第10章 被鱼料理所吸引而来的新魔物出现了"}, {"cid": "124157", "title": "附錄", "title_zh": "附录"}, {"cid": "44237", "title": "第11章 N神大人好像希望收到異世界的甜食", "title_zh": "第11章 N神大人好像希望收到异世界的甜食"}, {"cid": "44238", "title": "第12章 緋爾的新兵訓練營~準備篇~", "title_zh": "第12章 绯尔的新兵训练营~准备篇~"}, {"cid": "44239", "title": "第13章 緋爾的新兵訓練營~實踐篇~", "title_zh": "第13章 绯尔的新兵训练营~实践篇~"}, {"cid": "44240", "title": "第14章 我被帶到有頭目級魔物棲息的森林", "title_zh": "第14章 我被带到有头目级魔物栖息的森林"}, {"cid": "44241", "title": "第15章 在異世界森林深處找到意想不到的東西", "title_zh": "第15章 在异世界森林深处找到意想不到的东西"}, {"cid": "44242", "title": "第16章 遭遇到第二個頭目級角S", "title_zh": "第16章 遭遇到第二个头目级角S"}, {"cid": "124158", "title": "附錄", "title_zh": "附录"}, {"cid": "44254", "title": "第17章 終於離開森林了", "title_zh": "第17章 终于离开森林了"}, {"cid": "44256", "title": "第19章 在冒險者公會接委託", "title_zh": "第19章 在冒险者公会接委托"}, {"cid": "44257", "title": "第20章 來自公會分會長的委託", "title_zh": "第20章 来自公会分会长的委托"}, {"cid": "44258", "title": "第21章 蘭貝托先生的店", "title_zh": "第21章 兰贝托先生的店"}, {"cid": "44259", "title": "第22章 接下冒險者公會委託去打獵", "title_zh": "第22章 接下冒险者公会委托去打猎"}, {"cid": "124159", "title": "附錄", "title_zh": "附录"}, {"cid": "44261", "title": "第23章 吃比金錢更重要", "title_zh": "第23章 吃比金钱更重要"}, {"cid": "44262", "title": "第24章 N神多了,好吵啊", "title_zh": "第24章 N神多了,好吵啊"}, {"cid": "44263", "title": "第25章 測試看看新能力", "title_zh": "第25章 测试看看新能力"}, {"cid": "44264", "title": "第26章 用用看新的調理器具", "title_zh": "第26章 用用看新的调理器具"}, {"cid": "44265", "title": "第27章 新的生意要跟夫人合作", "title_zh": "第27章 新的生意要跟夫人合作"}, {"cid": "44266", "title": "第28章 卡列利那鎮面臨危機", "title_zh": "第28章 卡列利那镇面临危机"}, {"cid": "124160", "title": "附錄", "title_zh": "附录"}, {"cid": "44269", "title": "第29章 雙足飛龍", "title_zh": "第29章 双足飞龙"}, {"cid": "44268", "title": "第29.5章 雙足飛龍來襲,其後", "title_zh": "第29.5章 双足飞龙来袭,其后"}, {"cid": "44270", "title": "第30章 購買體積龐大的物品", "title_zh": "第30章 购买体积庞大的物品"}, {"cid": "44271", "title": "第31章 好舒服的熱水", "title_zh": "第31章 好舒服的热水"}, {"cid": "44272", "title": "第32章 在用餐之前要⋯", "title_zh": "第32章 在用餐之前要⋯"}, {"cid": "44273", "title": "第33章 有事商量要找公會", "title_zh": "第33章 有事商量要找公会"}, {"cid": "44274", "title": "第34章 踏上旅程", "title_zh": "第34章 踏上旅程"}, {"cid": "124161", "title": "附錄", "title_zh": "附录"}, {"cid": "44276", "title": "第35章 克萊爾森林", "title_zh": "第35章 克莱尔森林"}, {"cid": "44278", "title": "第37章 愉快的購物", "title_zh": "第37章 愉快的购物"}, {"cid": "44279", "title": "第38章 那個的禸好吃?", "title_zh": "第38章 那个的禸好吃?"}, {"cid": "44280", "title": "第39章 德蘭的公會分會長", "title_zh": "第39章 德兰的公会分会长"}, {"cid": "44281", "title": "第40章 肢解", "title_zh": "第40章 肢解"}, {"cid": "124162", "title": "附錄", "title_zh": "附录"}, {"cid": "44283", "title": "第41章 男神們出現了", "title_zh": "第41章 男神们出现了"}, {"cid": "44284", "title": "第42章 久等的大餐", "title_zh": "第42章 久等的大餐"}, {"cid": "44285", "title": "第43章 進入迷宮", "title_zh": "第43章 进入迷宫"}, {"cid": "44286", "title": "第44章 迷宮裡的寶箱是⋯", "title_zh": "第44章 迷宫里的宝箱是⋯"}, {"cid": "44287", "title": "第45章 沙漠樓層", "title_zh": "第45章 沙漠楼层"}, {"cid": "44288", "title": "第46章 迷宮老大", "title_zh": "第46章 迷宫老大"}, {"cid": "124163", "title": "附錄", "title_zh": "附录"}, {"cid": "44290", "title": "第47章 過關的報酬", "title_zh": "第47章 过关的报酬"}, {"cid": "44291", "title": "第48章 店家", "title_zh": "第48章 店家"}, {"cid": "44292", "title": "第49章 伍各爾先生", "title_zh": "第49章 伍各尔先生"}, {"cid": "44293", "title": "第50章 夢幻寶石", "title_zh": "第50章 梦幻宝石"}, {"cid": "44294", "title": "第51章 達里爾與伊麗絲", "title_zh": "第51章 达里尔与伊丽丝"}, {"cid": "44295", "title": "第52章 第一次談生意", "title_zh": "第52章 第一次谈生意"}, {"cid": "44296", "title": "第53章 帶有海味的委託", "title_zh": "第53章 带有海味的委托"}]};
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>