JavaScriptでズームリセット!実践コード10選

JavaScriptでズームリセットを実現するサンプルコードJS
この記事は約23分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読むことで、JavaScriptを使ってズームリセットを実現する方法を学ぶことができます。

初心者でも分かりやすいように、JavaScriptとズームリセットの基本から解説し、実践的なサンプルコード10選を紹介します。

さらに、注意点や対処法、カスタマイズ方法まで網羅しているので、あなたもズームリセットの達人になれるでしょう。

●JavaScriptとズームリセットの基本

○JavaScriptとは

JavaScriptは、ウェブページに動的な要素を追加するために使用されるプログラミング言語です。

HTMLとCSSによって構築された静的なページに対し、JavaScriptを使用することで、ユーザーとのインタラクションが可能になります。

ズームリセットの実装も、JavaScriptを使って簡単に実現できます。

○ズームリセットの仕組み

ズームリセットとは、ウェブページの表示を拡大・縮小した後、元の表示サイズに戻す機能のことです。

JavaScriptを使って、ボタンクリックや特定の操作で、ページのズームレベルをリセットすることができます。

●実践!JavaScriptでズームリセットする方法10選

○サンプルコード1:単純なズームリセット

このサンプルコードでは、ボタンをクリックすると、ページのズームレベルが100%(元の表示サイズ)にリセットされます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル1</title>
<script>
function resetZoom() {
  document.body.style.zoom = "100%";
}
</script>
</head>
<body>
<p>ズームを変更してから、下記のボタンをクリックしてリセットしてみてください。</p>
<button onclick="resetZoom()">ズームリセット</button>
</body>
</html>

このコードでは、resetZoom関数を作成し、その中でdocument.body.style.zoom"100%"を代入することで、ズームリセットを実現しています。

ボタンのonclick属性で、クリック時にresetZoom関数を呼び出しています。

○サンプルコード2:ズームイン・ズームアウト・リセットの組み合わせ

次のサンプルコードでは、ズームイン、ズームアウト、リセットの3つの機能をボタンで実装します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル2</title>
<script>
let zoomLevel = 1;

// ズームイン機能
function zoomIn() {
  zoomLevel += 0.1;
  document.body.style.zoom = zoomLevel;
}

// ズームアウト機能
function zoomOut() {
  zoomLevel -= 0.1;
  document.body.style.zoom = zoomLevel;
}

// ズームリセット機能
function resetZoom() {
  zoomLevel = 1;
  document.body.style.zoom = zoomLevel;
}
</script>
</head>
<body>
<p>下記のボタンでズームイン、ズームアウト、リセットができます。</p>
<button onclick="zoomIn()">ズームイン</button>
<button onclick="zoomOut()">ズームアウト</button>
<button onclick="resetZoom()">ズームリセット</button>
</body>
</html>

ここでは、zoomLevel変数を使って現在のズームレベルを保持し、それを操作することでズームイン、ズームアウト、リセットの機能を実現しています。

各ボタンのonclick属性で、クリック時に対応する関数を呼び出しています。

○サンプルコード3:マウスホイールでのズームリセット

このサンプルでは、マウスホイールを使ってページを拡大・縮小し、一定のキー(ここではCtrlキー)を押しながらホイール操作を行うことでズームリセットができます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル3</title>
<script>
let zoomLevel = 1;

// マウスホイール操作時の処理
function handleMouseWheel(event) {
  event.preventDefault();

  if (event.ctrlKey) {
    resetZoom();
  } else {
    zoomLevel += event.deltaY > 0 ? -0.1 : 0.1;
    document.body.style.zoom = zoomLevel;
  }
}

// ズームリセット機能
function resetZoom() {
  zoomLevel = 1;
  document.body.style.zoom = zoomLevel;
}

document.addEventListener("wheel", handleMouseWheel);
</script>
</head>
<body>
<p>マウスホイールでズーム操作を行い、Ctrlキーを押しながらホイール操作でリセットができます。</p>
</body>
</html>

このコードでは、handleMouseWheel関数を作成し、その中でevent.deltaYを使ってホイールの回転方向を判定して、ズームイン・ズームアウトを行います。

また、event.ctrlKeyを使ってCtrlキーが押されているかどうかを判定し、押されている場合はズームリセットを行います。

document.addEventListener("wheel", handleMouseWheel)で、マウスホイール操作時にhandleMouseWheel関数が呼び出されるように設定しています。

○サンプルコード4:タッチ操作でのズームリセット

このサンプルでは、ピンチイン・ピンチアウトでズーム操作を行い、ダブルタップでズームリセットができます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル4</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
let zoomLevel = 1;
let lastTouchEnd = 0;
let touchDistance = 0;

function handleTouchStart(event) {
  if (event.touches.length === 2) {
    touchDistance = Math.hypot(
      event.touches[0].pageX - event.touches[1].pageX,
      event.touches[0].pageY - event.touches[1].pageY
    );
  }
}

function handleTouchMove(event) {
  if (event.touches.length === 2) {
    event.preventDefault();
    const newTouchDistance = Math.hypot(
      event.touches[0].pageX - event.touches[1].pageX,
      event.touches[0].pageY - event.touches[1].pageY
    );
    zoomLevel += (newTouchDistance - touchDistance) * 0.01;
    touchDistance = newTouchDistance;
    document.body.style.zoom = zoomLevel;
  }
}

function handleTouchEnd(event) {
  const currentTime = new Date().getTime();
  if (currentTime - lastTouchEnd < 300) {
    event.preventDefault();
    resetZoom();
  }
  lastTouchEnd = currentTime;
}

function resetZoom() {
  zoomLevel = 1;
  document.body.style.zoom = zoomLevel;
}

document.addEventListener("touchstart", handleTouchStart, { passive: false });
document.addEventListener("touchmove", handleTouchMove, { passive: false });
document.addEventListener("touchend", handleTouchEnd, { passive: false });
</script>
</head>
<body>
<p>ピンチイン・ピンチアウトでズーム操作を行い、ダブルタップでリセットができます。</p>
</body>
</html>

このコードでは、handleTouchStart関数でタッチ開始時に2本指でタッチされているかを判定し、2本指のタッチ距離を計算しています。

handleTouchMove関数で2本指のタッチ距離が変化した際にズーム操作を行い、handleTouchEnd関数でダブルタップが行われたかを判定し、リセットを行っています。

○サンプルコード5:スライダーを使ったズームリセット

このサンプルでは、スライダーを使用してズームレベルを調整し、ズームリセットができます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル5</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
function handleSliderChange(event) {
  // スライダーの値に基づいてズームレベルを変更
  const zoomLevel = event.target.value;
  document.body.style.zoom = zoomLevel;
}

function resetZoom() {
  // ズームレベルをリセットし、スライダーの値も更新
  document.body.style.zoom = 1;
  document.getElementById("zoomSlider").value = 1;
}
</script>
</head>
<body>
<p>スライダーを操作してズームレベルを調整し、リセットボタンでズームリセットができます。</p>
<input type="range" id="zoomSlider" min="0.1" max="3" step="0.1" value="1" onchange="handleSliderChange(event)">
<button onclick="resetZoom()">リセット</button>
</body>
</html>

このコードでは、スライダーの値が変更されたときにhandleSliderChange関数が呼び出され、その値をもとにズームレベルを変更します。

また、リセットボタンが押されたときにresetZoom関数が呼び出され、ズームレベルをリセットし、スライダーの値も更新します。

○サンプルコード6:画像ギャラリーのズームリセット

このサンプルでは、画像ギャラリー内の画像をクリックするとズームインし、再度クリックするとズームリセットができます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル6</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  .gallery {
    display: flex;
    flex-wrap: wrap;
  }
  .gallery img {
    width: 100px;
    height: 100px;
    margin: 5px;
  }
</style>
<script>
function handleClickImage(event) {
  const image = event.target;
  // 画像のズームレベルを切り替え
  if (image.style.zoom === "1" || image.style.zoom === "") {
    image.style.zoom = 2;
  } else {
    image.style.zoom = 1;
  }
}
</script>
</head>
<body>
<div class="gallery">
  <img src="image1.jpg" alt="画像1" onclick="handleClickImage(event)">
  <img src="image2.jpg" alt="画像2" onclick="handleClickImage(event)">
  <img src="image3.jpg" alt="画像3" onclick="handleClickImage(event)">
</div>
</body>
</html>

このコードでは、画像がクリックされたときにhandleClickImage関数が呼び出され、画像のズームレベルを切り替えます。

画像がズームインされていない状態でクリックされると、ズームインします。ズームインされた状態でクリックされると、ズームリセットが実行されます。

○サンプルコード7:Googleマップのズームリセット

このサンプルでは、Googleマップのズームリセット機能を実装します。

マップをズームイン・ズームアウトしてから、リセットボタンをクリックすると、初期のズームレベルに戻ります。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル7</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  #map {
    width: 100%;
    height: 400px;
  }
</style>
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<script>
let map;

function initMap() {
  const initialZoom = 12;
  const center = { lat: 35.6895, lng: 139.6917 }; // 東京の座標
  map = new google.maps.Map(document.getElementById("map"), {
    zoom: initialZoom,
    center: center,
  });
}

function resetZoom() {
  const initialZoom = 12;
  map.setZoom(initialZoom);
}

window.addEventListener("DOMContentLoaded", initMap);
</script>
</head>
<body>
<div id="map"></div>
<button onclick="resetZoom()">ズームリセット</button>
</body>
</html>

このコードでは、initMap関数でGoogleマップを初期化し、ズームリセットボタンがクリックされたときにresetZoom関数が呼び出されるようになっています。

resetZoom関数では、マップのズームレベルを初期値に戻します。

○サンプルコード8:特定の範囲だけズームリセット

このサンプルでは、特定の範囲でズームリセットができるようにします。

範囲外でマウスホイール操作を行っても、ズームが変更されません。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル8</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  .container {
    position: relative;
    width: 100%;
    height: 400px;
    overflow: hidden;
  }
  .zoom-area {
    width: 100%;
    height: 100%;
  }
  img {
    width: 100%;
    height: 100%;
  }
</style>
<script>
document.addEventListener("DOMContentLoaded", () => {
  const container = document.querySelector(".container");
  const zoomArea = document.querySelector(".zoom-area");
  const img = document.querySelector("img");

  // ホイールイベントを追加
  container.addEventListener("wheel", (event) => {
    // イベント発生源がzoomArea以外なら処理をスキップ
    if (!zoomArea.contains(event.target)) return;

    event.preventDefault();
    const zoomLevel = parseFloat(img.style.zoom || 1);

    if (event.deltaY < 0) {
      img.style.zoom = zoomLevel + 0.1;
    } else {
      img.style.zoom = zoomLevel - 0.1;
    }
  });
});
</script>
</head>
<body>
<div class="container">
  <div class="zoom-area">
    <img src="path/to/your/image.jpg" alt="サンプル画像">
  </div>
</div>
<button onclick="resetZoom()">ズームリセット</button>
<script>
function resetZoom() {
  const img = document.querySelector("img");
  img.style.zoom = 1;
}
</script>
</body>
</html>

このコードでは、DOMContentLoadedイベントでホイールイベントリスナを追加し、特定の範囲(zoom-area)内でのみズームリセットが可能になるようにしています。

範囲外でホイール操作が行われても、ズームが変更されないようになっています。

○サンプルコード9:複数の要素に対応するズームリセット

このサンプルでは、複数の画像要素がある場合に、それぞれに対してズームリセットを行えるように実装します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル9</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  .container {
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
  }
  .zoom-area {
    width: 45%;
    height: 300px;
    overflow: hidden;
    margin-bottom: 20px;
  }
  img {
    width: 100%;
    height: 100%;
  }
</style>
<script>
document.addEventListener("DOMContentLoaded", () => {
  const container = document.querySelector(".container");

  // ホイールイベントを追加
  container.addEventListener("wheel", (event) => {
    const img = event.target.closest("img");
    if (!img) return;

    event.preventDefault();
    const zoomLevel = parseFloat(img.style.zoom || 1);

    if (event.deltaY < 0) {
      img.style.zoom = zoomLevel + 0.1;
    } else {
      img.style.zoom = zoomLevel - 0.1;
    }
  });
});
</script>
</head>
<body>
<div class="container">
  <div class="zoom-area">
    <img src="path/to/your/image1.jpg" alt="サンプル画像1">
  </div>
  <div class="zoom-area">
    <img src="path/to/your/image2.jpg" alt="サンプル画像2">
  </div>
</div>
<button onclick="resetZoom()">ズームリセット</button>
<script>
function resetZoom() {
  const images = document.querySelectorAll("img");
  images.forEach((img) => {
    img.style.zoom = 1;
  });
}
</script>
</body>
</html>

このコードでは、DOMContentLoadedイベントでホイールイベントリスナを追加し、複数の画像要素に対してズームリセットが行えるようにしています。

ズームリセットボタンを押すと、すべての画像要素のズームがリセットされます。

○サンプルコード10:カスタマイズ可能なズームリセット

このサンプルでは、ズームリセットの実装をカスタマイズしやすいように関数化します。

こうすることで、他の要素やイベントに対応させる際に容易にカスタマイズが可能となります。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ズームリセットサンプル10</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  .container {
    position: relative;
    width: 100%;
    height: 400px;
    overflow: hidden;
  }
  img {
    width: 100%;
    height: 100%;
  }
</style>
<script>
// ズームリセット関数を定義
function resetZoom(element) {
  element.style.zoom = 1;
}

document.addEventListener("DOMContentLoaded", () => {
  const container = document.querySelector(".container");
  const image = container.querySelector("img");

  // ホイールイベントを追加
  container.addEventListener("wheel", (event) => {
    event.preventDefault();
    const zoomLevel = parseFloat(image.style.zoom || 1);

    if (event.deltaY < 0) {
      image.style.zoom = zoomLevel + 0.1;
    } else {
      image.style.zoom = zoomLevel - 0.1;
    }
  });

  // ダブルクリックイベントを追加
  container.addEventListener("dblclick", () => {
    resetZoom(image);
  });
});
</script>
</head>
<body>
<div class="container">
  <img src="path/to/your/image.jpg" alt="サンプル画像">
</div>
<button onclick="resetZoom(document.querySelector('img'))">ズームリセット</button>
</body>
</html>

このコードでは、resetZoom関数を定義し、その関数を利用してズームリセットを行うようにしています。

ダブルクリックイベントも追加し、画像上でダブルクリックすることでもズームリセットが行えるようにしています。

●注意点と対処法

ズームリセットを実装する際には、画像や要素がはみ出すことがありますので、overflow: hiddenで対処することが重要です。

また、異なるデバイスやブラウザに対応するために、touchstarttouchendなどのタッチイベントも考慮する必要があります。

●カスタマイズのポイント

ズームリセットのカスタマイズには、次のようなポイントが考えられます。

ズーム速度の調整

ホイールイベントやスライダーの動作によるズーム速度を変更することができます。

速度を遅くしたり、速くしたりして、ユーザーの使いやすさを向上させることができます。

リセット時のアニメーション

ズームリセット時にアニメーションを追加することで、ユーザーにとってわかりやすいインターフェースを提供できます。

例えば、スムーズなトランジションを追加することができます。

リセットトリガーとなるイベントの追加・変更

ダブルクリックやボタンクリック以外にも、特定のキー操作やタイマーによるリセットなど、様々なイベントをトリガーとして設定することができます。

マウスポインタの位置に合わせたズームイン・アウト

マウスポインタの位置を基準にして、ズームイン・アウトが行われるようにカスタマイズすることで、より直感的な操作が可能となります。

複数の要素や機能との連携

ズームリセット機能を他の要素や機能と連携させることで、より便利なインターフェースを実現できます。

例えば、画像ギャラリーや地図アプリケーションと組み合わせることができます。

まとめ

本稿では、様々なシチュエーションに対応するズームリセットの実装方法を紹介しました。

これらの方法を活用して、ユーザーにとって使いやすいウェブサイトやアプリケーションを作成しましょう。

また、カスタマイズのポイントを考慮して、独自のニーズに合ったズームリセット機能を実現してください。