ドラッグ効果を実現するための純粋なCSSコード

ドラッグ効果を実現するための純粋なCSSコード

想像力を働かせれば、CSS でもドラッグ効果を実現できます。

1. ドラッグ効果の例

これはモバイルデバイスでは非常に一般的な効果です。以下のQidian中国語ウェブサイト[1]のタッチスクリーンバージョンのように、押してドラッグすることができます。

このような効果は、JS を使用すると簡単に実現できます。より多くの計算、より重要なシナリオ、そしてより多くのコードが必要になるだけです。しかし、よく考えてみると、CSS でこの効果をほぼ実現できることがわかりました。読み進めてみましょう。

2. CSS実装の原則

従来の Web では、ページのスクロールは一般的な操作であり、マウス ホイールを使用するか、スクロール バーを直接ドラッグして操作します。ただし、モバイルデバイスでは異なります。指でページをドラッグするだけでスクロールできます。通常、ページは垂直方向または水平方向にスクロールしますが、両方向にスクロールできるとしたらどうなるでしょうか?例えば

.ドラッグボックス{
  幅: 300ピクセル;
  高さ: 300px;
  オーバーフロー:自動
}
.dragcon{
  幅: 500ピクセル;
  高さ: 500px;
}

内部要素の幅と高さがコンテナよりも大きい限り、両方向へのスクロールが可能になります( overflow:autoを設定することを忘れないでください)。以下を参照してください。

通常、マウスホイールは一度に一方向にしかスクロールできません( Shiftキーを押しながらスクロールすると反対方向にスクロールできます)が、モバイルデバイスでは、以下に示すようにコンテンツを直接ドラッグしてスクロールできます。

次に、コンテンツ領域とともにスクロールする要素をコンテンツの中央に追加します。

次に、テキストを隠します

少しだるい感じがしますか?原理はとても簡単です!

3. CSS実装の詳細

まず、ドラッグ ターゲットとドラッグ コンテナーのサイズ関係を決定します。ドラッグ ターゲットのサイズがw * hであると仮定すると、サイズ関係を取得するのは簡単です。内部サイズはコンテナーの 2 倍からドラッグ ターゲットのサイズを引いたものになります。

.ドラッグボックス{
  幅: 100%;
  高さ: 100%;
}
.dragcon{
  幅: calc(200% - w);
  高さ: calc(200% - h);
}

動的な画像を使用して次のように説明します(中央のオレンジ色のブロックはドラッグターゲットを表します)

4. CSSレイアウト

次に、この機能をページに追加する必要があります。次の 2 つのレイアウトがあります。

1. 固定位置

以前のレイアウトをページに直接追加し、固定位置を追加します

<本文>
  ...ページ上の他の要素 <div class="dragbox">
    <div class="dragcon"></div>
    <div class="ball"></div> <!--要素をドラッグ-->
  </div>
</本文>

主なスタイルは次のとおりです

.ドラッグボックス{
  位置: 固定;
  左: 0;
  上: 0;
  右: 0;
  下部: 0;
  オーバーフロー:自動
}

階層関係は以下のとおりです

この方法では、ドラッグボックスはページの元の部分を確実にカバーするため、ドラッグ時にpointer-events: none;も追加する必要があります。同時に、 pointer-events: allも追加します。

.ドラッグボックス{
  /*...*/
  ポインタイベント: なし;
}
。ボール{
  /*...*/
  ポインタイベント: すべて;
}
.dragbox.active{
  /*...*/
  ポインタイベント: すべて;
}

JSを使用すると、押されたときに外側のコンテナをスクロールさせることができます。

ball.addEventListener('touchstart',(ev)=>{
   dragbox.classList.add('アクティブ');
})
document.addEventListener('touchend',()=>{
   dragbox.classList.remove('active');
})

実際の効果は次の通りです

完全なコードは https://codepen.io/xboxyan/pen/PobwxBK からアクセスできます (PC でアクセスするにはモバイル モードをオンにしてください)

以下のQRコードを直接スキャンすることもできます

1. 絶対的な位置付け + 階層

固定された配置レベルの影響により、以前のレイアウトでは JS を使用してコンテナーの状態を動的に変更する必要があります。元のページに影響を与えずにドラッグを実現する方法はありますか?絶対位置使用したこのレイアウトを見てみましょう

ここでは、次のように元のページをdivコンテナで囲む必要があります。

<本文>
  <div class="dragbox">
    <div class="dragcon"></div>
    <div class="ボール"></div>
  </div>
  <div class="body"> <!--ページスクロールを実現するには単一のレイヤーを使用します-->
    ...ページ上の他の要素</div>
</本文>

主なスタイルは次のとおりです

.ドラッグボックス{
  位置: 絶対;
  幅: 100%;
  高さ: 100%;
  オーバーフロー:自動;
}
。体{
  位置: 相対的;
  高さ: 100%;
  オーバーフロー:自動;
}
。ボール{
  位置: 相対的;
  z-index: 10; /*ドラッグターゲットのレベルを高く設定*/
}

階層は次のようになります

ここでは、元のページコンテンツがドラッグボックスドラッグターゲットの間に階層的に配置されているため、ドラッグ時に元のページのスクロールには影響がなく、JS 処理も必要ありません。

完全なコードは https://codepen.io/xboxyan/pen/bGBNQxL からアクセスできます (PC でアクセスするにはモバイル モードをオンにしてください)

以下のQRコードを直接スキャンすることもできます

ヒント: 上記の 2 つのレイアウト方法のうち、最初の方法はより適応性が高く、既存のプロジェクトに影響を与えません。2 番目の方法はより優れたエクスペリエンスを提供しますが、 div をページ スクロール コンテナーとして使用し、ページ構造に特定の変更を加えます。実際の状況に応じて選択できます。

5. CSSは他の機能を実装する

1. 吸着機能

多くの場合、記事の冒頭の図に示すように、端をドラッグするときに自動的に端にスナップする必要があります。では、吸着に関連する特性は何でしょうか?

答えはCSSスクロールスナップ[2]です。

<本文>
  ...ページ上の他の要素 <div class="dragbox">
    <div class="dragcon">あ</div>
    <div class="dragcon">B</div>
    <div class="ボール"></div>
  </div>
</本文>

主なスタイルは次のとおりです

.ドラッグボックス{
  ...
  scroll-snap-type: x 必須;
}
.dragcon{
  スクロールスナップ位置合わせ: 開始;
}

実際の効果は次の通りです

完全なコードは https://codepen.io/xboxyan/pen/XWNJyPw からアクセスできます (PC でアクセスするにはモバイル モードをオンにしてください)

以下のQRコードを直接スキャンすることもできます

1. 初期位置を設定する

デフォルトでは、ドラッグ ターゲットは右下隅にのみあります。 左下隅に移動するにはどうすればよいでしょうか。とても簡単です。ここでのドラッグはスクロール コンテナーによって実装されるため、scrollLeft または scrollTop を変更するだけで済みます

ドラッグボックスの左スクロール = 999;
ドラッグボックスのスクロールトップ = 999;

さらに、要素のオートフォーカス機能を使用して、可視範囲に自動的にフォーカスを合わせることで、純粋な HTML で実装することもできます。

<div class="dragcon">
  ...
  <button class="pos" autofocus></button> <!--自動フォーカス要素を追加します-->
</div>

たとえば、初期位置を左上隅にしたい場合は、右下隅にオートフォーカス要素を追加するだけです(もちろん、非表示にするには透明度も設定する必要があります)〜

1. 境界線を設定する

ドラッグ先の境界は画面の端になります。スペースを残す必要がある場合もあります。これは CSS で簡単にできます。左/上/右/下パディング境界線などをさまざまな方法で変更できます。

.ドラッグボックス{
  左: 10px;
  上: 10px;
  右: 10px;
  下: 10px;
  /*長方形: 10px;*/
}
.ドラッグボックス{
  パディング: 10px;
}

VI. 説明と要約

当初は互換性に問題はないだろうと考えていましたが、実際にテストしてみると、Safari のスクロール コンテナーの問題を中心に、iOS に多くの問題があることがわかりました。例えば、iOSの下位バージョンではスムーズにスクロールしないため、

-webkit-overflow-scrolling:touch はスムーズなスクロールと自動吸着を実現できますが、階層の問題が発生します。一部のドキュメントでは、このプロパティを設定すると、最高レベルのネイティブスクロールコンテナーが作成される、と説明されています。最初の固定レイアウトもあります。デフォルトでpoint-events: noneが設定されていてtouchstart後にautoに設定されている場合、iOS ではスクロールが失敗しますが、逆にすると機能します (デモは iOS と互換性があります)。

利点としては、CSS の柔軟性を継承し、コストがほぼゼロで、再利用が容易で、遅延のないネイティブスクロールを活用できることが挙げられます。

ただし、いくつか制限があります。ドラッグ先のサイズが固定されていない場合は、JS を使用して取得する必要がある場合があります。もちろん、比較すると、これは依然として非常に費用対効果の高い実装方法です。

今振り返ってみると、あまり目立たないプロパティは使っていませんでした (scroll-snap は 1 つかもしれませんが、あくまで補助的な機能です)。主な効果は一般的なものでした。その後、連想と発散を通じて、日々の積み重ねに基づいてネイティブ機能を十分に探求し、最終的に必要なインタラクションを完成させ、この記事に至りました。

読んでいただきありがとうございます。これが私の将来の仕事のインスピレーションになれば幸いです。

参考文献

[1] Qidian中国語ウェブサイト: https://m.qidian.com/

[2] CSSスクロールスナップ: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Scroll_Snap

純粋な CSS でドラッグ アンド ドロップ効果を実装するコードに関するこの記事はこれで終わりです。CSS でドラッグ アンド ドロップ効果を実装する方法に関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

<<:  Angularの親子コンポーネント通信の詳細な説明

>>:  Linux のメモリ管理とアドレス指定の詳細な紹介

推薦する

MySQLとPythonの相互作用の例

目次1. データを準備するデータテーブルを作成するデータの挿入2. SQLドリル1. SQL文の強化...

React Hook の使用例 (一般的なフック 6 つ)

1. useState: 関数コンポーネントに状態を持たせる使用例: // カウンター impor...

熟練デザイナーの7つの原則(1):フォントデザイン

まあ、あなたはデザインの達人かもしれませんし、あるいはそれは大げさすぎるかもしれませんが、少なくとも...

Docker デプロイメント MySQL8 クラスター (マスター 1 台とスレーブ 2 台) の実装手順

目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...

テンプレートタグの使用方法の詳細な説明(Vue での使用方法の概要を含む)

目次1. HTML5のテンプレートタグ2. テンプレートタグ操作のプロパティとメソッド3. Vueの...

CentOS 6.4 で rpm を使用して MySQL をオフラインでインストールする

rpmインストールパッケージを使用してmysqlをオフラインでインストールします。参考までに準備:公...

シンプルな CSS テキストアニメーション効果

成果を達成する 実装コードhtml <div id=コンテナ> いらっしゃいませ <...

ubuntu15.10 での hadoop2.7.2 の詳細なインストールと設定

Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...

MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...

Hタグはウェブページ制作において適切に使用すべきである

HTML タグには、ページのタイトルを処理するための特別なタグがあります。これらは h1、h2、h3...

Vueは透かし効果を簡単に実現します

序文: Vueプロジェクトで透かし効果を使用するには、コンテナを指定できます効果画像: 1. コンテ...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

MySQL: MySQL 関数

1. 組み込み関数1. 数学関数ランド()丸め(数値) ceil(数値)階数(数値)ランダム丸め切り...

Windows 環境に mysql-8.0.11-winx64 をインストールする際に発生する問題を解決する

MySQL インストール パッケージをダウンロードします。mysql-8.0.11-winx64 を...

Dockerコンテナのネットワーク管理とネットワーク分離の実装

1. Dockerネットワーク管理1. Dockerコンテナ方式1) Dockerが外部ネットワーク...