3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロ依存・バニラJSで漫画ビューアを作った

3
Posted at

なんで作ったの?

自分のサイトで漫画を公開したくて、いい感じのビューアを探してた。けど、どれも重い。React必須だったり、webpackの設定が面倒だったり、「ちょっと漫画を表示したいだけなのに、なんでこんな大げさなの?」って感じ。

じゃあ自分で作るか、ってなった。

ゼロ依存へのこだわり

React も Vue も jQuery も使ってない。JavaScript 1ファイル + CSS 1ファイル、これだけ。

漫画ビューアって「既存サイトにポンと載せたい」ケースが多い。フレームワークに依存した瞬間、導入のハードルが一気に上がる。

<link rel="stylesheet" href="manga-viewer.css">
<div id="viewer"></div>
<script type="module">
  import MangaViewer from './manga-viewer.js';
  new MangaViewer({
    container: '#viewer',
    pages: ['page-001.jpg', 'page-002.jpg'],
    direction: 'rtl',
  });
</script>

npm経由でも使える。

npm install @tokagemushi/manga-viewer

機能一覧

機能 説明
見開き表示 PCは2ページ見開き、スマホは1ページ。自動切替
右綴じ(RTL) / 左綴じ(LTR) 日本の漫画は当然右綴じ
スワイプ スマホネイティブっぽい操作感
ピンチズーム 拡大してドラッグでパン、端までいったらページめくり
しおり ワンタップで追加、長押しで一覧表示
読書進捗 自動保存
その他 フルスクリーン / キーボード操作 / プリロード

実装の工夫

ピンチズーム

2本指の距離と中心点を取ってズームレベルを計算。ピンチの中心点を基準にズームするのがポイント。

RTL対応

日本の漫画は右から左に読む。あらゆる操作の方向が逆転するのが大変。スワイプ、スライダー、見開き、タップ領域…全部 direction で分岐。

見開きのスロット設計

1スロット=1ページor2ページ。表紙は常に単ページ。

しおりのストレージ戦略

localStorage(デフォルト)とAPI接続の2系統。API失敗時は自動でlocalStorageにフォールバック。

🎮 デモ

👉 デモを試す(ブラックジャックによろしく 第1巻・全209ページ)

佐藤秀峰先生の「ブラックジャックによろしく」を二次利用フリー規約に基づいて使わせてもらってます。

リンク

まとめ

「漫画をWebで読ませたい」って需要はあるのに、既存ツールは重い。このビューアはJS+CSSの2ファイルだけで、ゼロ依存で既存サイトにポンと載せられる。

IssueやPRもらえると嬉しいです 🙏

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?