トップへ(mam-mam.net/)

CSS・JavaScriptでコピー禁止・右クリック無効・長押し防止・拡大縮小制限|選択不可の実装方法まとめ

CSS・JavaScriptでコピー禁止・右クリック無効・長押し防止・拡大縮小制限|選択不可の実装方法まとめ

Webページの内容を保護したい場合、コピー禁止・右クリック無効・テキスト選択不可・スマホの長押しメニュー防止・拡大縮小制限などの対策が有効です。
このページでは、CSSやJavaScriptを使ってこれらの操作を制限する方法を、具体的なコード例とともに紹介します。
`user-select:none` や `oncopy="return false;"`、`oncontextmenu="return false;"` などの属性・プロパティの使い方に加え、スマホ対応やアクセシビリティへの配慮も含めて解説しています。

コピー禁止

コピー禁止にするにはその要素タグに
oncopy="return false;"
属性を設定します。

このタグ内の文字だけを選択した場合はコピーできません。
このタグ内の文字を含む上下の文字も選択した場合はコピーできるので注意。

<p class="normal" style="border:1px solid #000;max-width:100%;width:600px;" oncopy="return false;">
  このタグ内の文字だけを選択した場合はコピーできません。<br>
  このタグ内の文字を含む上下の文字も選択した場合はコピーできるので注意。
</p>

<body oncopy="return false;">
  body全体がコピー禁止
</body>

コンテキストメニューを禁止

任意の要素で右クリックによるコンテキストメニューの表示を禁止にするにはその要素タグに
oncontextmenu="return false;"
属性を設定します。

ここで右クリックしてもコンテキストメニューは表示されません。

<body oncontextmenu="return false;">
  bodyタグ全体で右クリックによるコンテキストメニューが表示されなくなります
</body>

テキスト選択の禁止

テキストの選択を禁止するにはCSSで
user-select:none;
を設定します。

このテキストは選択できません。このテキストは選択できます。

<span class="no_select">このテキストは選択できません。</span>このテキストは選択できます。

<body class="no_select">
  bodyタグ全体でテキスト選択が出来なくなります
</body>

<style>
  .no_select{
    user-select: none;
    -moz-user-select: none;
    -webkit-user-select: none;
    -ms-user-select: none;
  }
</style>

長押し(ロングタップ)メニュー表示の禁止

スマホ等でimgタグの画像をロングタップした時に表示されるメニュー表示を禁止するにはCSSで
-webkit-user-select:none; pointer-events:none; -webkit-touch-callout:none;
を設定します。


上記画像をロングタップしてもメニューは表示されません。

<img src="./imgs/0001s.jpg"
  style="width:100px; height:auto; -webkit-user-select:none; pointer-events:none; -webkit-touch-callout:none;"
  width="225" height="300"><br>
上記画像をロングタップしてもメニューは表示されません。

imgタグのドラッグ禁止

imgタグの画像をドラッグできないように禁止するには
draggable="false"
属性を設定します。


上記画像はドラッグできません。

<img src="./imgs/0001s.jpg" style="width:100px; height:auto;" draggable="false" width="225" height="300"><br>
上記画像はドラッグできません。

Pull-to-Refresh(プル トゥ リフレッシュ)によるリロード禁止

Android ChomeやiOS Safariで一番上にスクロールしていて、上から下にスワイプすると更新(Pull-to-Refresh)されるのを止めるには
Androidの場合は bodyタグ のCSSに body{overscroll-behavior-y: none;} を入れるだけで止まりますが
iOSも止めるには以下を入れる必要があるようです。

<style>
html {
    overscroll-behavior-y: none;
    height  : 100%;
    overflow: hidden;
    position: relative;
}
body {
    height  : 100%;
    overflow: auto;
    position: relative;
}

(ご参考)overscroll-behavior について

overscroll-behavior:auto; /* 既定値 */
(※1)「スクロール領域末端」処理は行われる。
隣接するスクロール領域に対する(※2)「スクロール連鎖」処理も行われる。
overscroll-behavior:contain;
(※1)「スクロール領域末端」処理は行われる。
隣接するスクロール領域に対する(※2)「スクロール連鎖」処理は行われない。
overscroll-behavior:none;
(※1)「スクロール領域末端」処理は行われない。
隣接するスクロール領域に対する(※2)「スクロール連鎖」処理も行われない。
(※1)「スクロール領域末端」処理
スクロール領域最上部で更に下に引っ張るとリロードする「プルトゥリフレッシュ処理」や
スクロール領域末端でさらにスクロールさせると発生する「バウンド処理」などのこと。
(※2)「スクロール連鎖」
例えば body要素 がスクロール領域でその子要素の div要素 がスクロール領域の場合、
div要素上で末端までスクロールして更にスクロールすると連動してbodyもスクロールされる機能のこと。

拡大縮小できなくする

完全に防ぐことはできませんが、以下のJavaScriptとmetaタグの組み合わせにより、ユーザーによる拡大縮小操作をある程度制限することが可能です。特にスマートフォンのピンチズームや、PCでのCtrlキーによるズーム操作を抑制できます。

<head>
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
  <script>
    document.addEventListener("DOMContentLoaded",function(){
      document.addEventListener('gesturestart', function (e) {
        e.preventDefault();
      });
      document.addEventListener('gesturechange', function (e) {
        e.preventDefault();
      });
      document.addEventListener('gestureend', function (e) {
        e.preventDefault();
      });
      document.addEventListener('wheel', function (e) {
        if (e.ctrlKey) {
          e.preventDefault();
        }
      }, { passive: false });
      document.addEventListener('keydown', function (e) {
        if (e.ctrlKey && (e.key === ';' || e.key === '+' || e.key === '-' || e.key === '=')) {
          e.preventDefault();
        }
      }, { passive: false });
    });
  </script>
</head>