ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
素の Touch Events で実装
最小構成のスワイプ判定:
const slider = document.getElementById('slider');
let startX = 0;
let startY = 0;
let dx = 0;
slider.addEventListener('touchstart', (e) => {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
dx = 0;
}, { passive: true });
slider.addEventListener('touchmove', (e) => {
dx = e.touches[0].clientX - startX;
const dy = e.touches[0].clientY - startY;
// 横方向が支配的なら横スクロールとみなす
if (Math.abs(dx) > Math.abs(dy)) {
e.preventDefault(); // 縦スクロール抑制
slider.style.transform = `translateX(${dx}px)`;
}
}, { passive: false });
slider.addEventListener('touchend', () => {
const THRESHOLD = 80; // px
if (dx > THRESHOLD) {
goPrev();
} else if (dx < -THRESHOLD) {
goNext();
} else {
slider.style.transform = 'translateX(0)'; // 戻す
}
});
Pointer Events で統一(推奨)
マウス・タッチ・ペンを 1 つのイベントで扱えます:
const el = document.getElementById('slider');
let startX = 0, dx = 0, dragging = false;
el.addEventListener('pointerdown', (e) => {
dragging = true;
startX = e.clientX;
dx = 0;
el.setPointerCapture(e.pointerId); // ドラッグ中、要素外に出ても追従
});
el.addEventListener('pointermove', (e) => {
if (!dragging) return;
dx = e.clientX - startX;
el.style.transform = `translateX(${dx}px)`;
});
el.addEventListener('pointerup', (e) => {
if (!dragging) return;
dragging = false;
el.releasePointerCapture(e.pointerId);
if (Math.abs(dx) > 80) {
dx > 0 ? goPrev() : goNext();
}
el.style.transition = 'transform 0.3s';
el.style.transform = 'translateX(0)';
setTimeout(() => el.style.transition = '', 300);
});
CSS の touch-action でジェスチャを制御
| 値 | 意味 |
|---|---|
auto | デフォルト。すべてのジェスチャを許可 |
none | すべて JS で制御(タップ含む) |
pan-y | 縦スクロールのみブラウザに任せる(横スワイプを JS で) |
pan-x | 横スクロールのみブラウザに任せる |
manipulation | パン・ピンチ可、ダブルタップズーム抑制(フォーム最適) |
.slider {
touch-action: pan-y; /* 横スワイプは JS、縦スクロールはブラウザ */
user-select: none;
-webkit-user-select: none;
-webkit-touch-callout: none; /* iOS の長押しメニュー抑制 */
}
.slide {
/* GPU アクセラレーション */
will-change: transform;
transform: translateZ(0);
}
CSS のみで作る簡易スライダー(scroll-snap)
<div class="snap-slider">
<div class="slide">1</div>
<div class="slide">2</div>
<div class="slide">3</div>
</div>
<style>
.snap-slider {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch; /* iOS の慣性スクロール */
scrollbar-width: none;
}
.snap-slider::-webkit-scrollbar { display: none; }
.slide {
flex: 0 0 100%;
scroll-snap-align: start;
height: 300px;
}
</style>
これだけで PC・スマホ共通のスナップ式スライダーになります。JS なしで実装できるため、メンテナンス性が高い選択肢です。
ライブラリを使う(Swiper.js)
本格的なカルーセル / スワイプは Swiper.js がデファクトです:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
<script>
const swiper = new Swiper('.swiper', {
loop: true,
pagination: { el: '.swiper-pagination', clickable: true },
navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev' },
autoplay: { delay: 3000 },
effect: 'slide', // slide / fade / cube / coverflow / flip
});
</script>
Hammer.js(ジェスチャ抽象化)
import Hammer from 'hammerjs';
const hammer = new Hammer(document.getElementById('slider'));
hammer.on('swipeleft', () => goNext());
hammer.on('swiperight', () => goPrev());
hammer.on('swipeup', () => console.log('上スワイプ'));
hammer.on('swipedown', () => console.log('下スワイプ'));
// ピンチイン・アウト
hammer.get('pinch').set({ enable: true });
hammer.on('pinch', (e) => {
console.log('scale:', e.scale);
});
よくあるハマりどころ
- passive リスナー: Chrome 56+ では
touchmoveがデフォルト passive。preventDefault()したい場合は{ passive: false }必須 - iOS Safari の慣性スクロール:
-webkit-overflow-scrolling: touchがないとカクつく - クリックとスワイプの誤判定: 移動量が小さい場合(< 5px)はクリックとして扱う閾値を設ける
- iframe 内のタッチ: 親ページの touch-action が影響する場合がある
- iOS の長押しメニュー:
-webkit-touch-callout: noneで抑制
FAQ
Q: マウスとタッチ両対応で 1 つのコードにしたい
A: Pointer Events を使えば 1 セットで両方扱えます。IE 非対応ですが現代では問題なし。
Q: スワイプとスクロールがケンカする
A: touch-action: pan-y でスクロール方向を明示し、JS 側で Math.abs(dx) > Math.abs(dy) の判定を入れます。
Q: Swiper と React / Vue の組み合わせは?
A: 公式に swiper/react / swiper/vue パッケージがあり、それぞれ専用コンポーネントとして使えます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?