コンテンツの位置をランダムにドラッグするHTMLを実装する2つの方法

コンテンツの位置をランダムにドラッグするHTMLを実装する2つの方法

テスト: Chrome v80.0.3987.122 は正常です

方法は2つあります。通常のラベルの位置をドラッグするか、キャンバス内のテキストボックスの位置をドラッグします。

1. マウスドラッグでラベル要素を任意の位置に配置

デモアドレス

CSSコード

#範囲 {
    位置: 相対的;
    幅: 600ピクセル;
    高さ: 400px;
    マージン: 10px;
    背景色: rgb(133, 246, 250);
}

.アイコン {
    位置: 絶対;
    高さ: 100px;
    幅: 100ピクセル;
    カーソル: 移動;
    背景色: #ff9204;
    ユーザー選択: なし;
}

HTMLコード

<div id="範囲">
    <div class="icon">100*100</div>
</div>

jsコード

const main = document.getElementById('range');
const icon = document.querySelector('.icon');
移動 = false にします。
deltaLeft = 0、deltaTop = 0 とします。

// ドラッグ開始イベント。移動された要素にバインドされます。icon.addEventListener('mousedown', function (e) {
    /*
    * @des deltaLeft は移動中に変化しない値です*/
    デルタ左 = e.clientX-e.target.offsetLeft;
    デルタTop = e.clientY-e.target.offsetTop;
    移動 = true;
})

// モバイルトリガーイベントはエリアコントロール要素に配置する必要があります main.addEventListener('mousemove', function (e) {
    (移動)の場合{
        cx は、クライアント X の定数です。
        定数 cy = e.clientY;
        /** 親要素からの相対位置を取得するために減算します*/   
        dx = cx - deltaLeftとします
        dy = cy - deltaTopとします

        /** 親要素の範囲を超えないようにする */
        (dx < 0)の場合、dx = 0
        (dy < 0)の場合dy = 0
        (dx > 500)の場合、dx = 500
        (dy > 300)の場合dy = 300
        icon.setAttribute('style', `左:${dx}px;上:${dy}px`)
    }
})

// ドラッグ終了トリガーはエリアコントロール要素に配置する必要があります main.addEventListener('mouseup', function (e) {
    移動 = false;
    console.log('マウスアップ');
})

2. キャンバスにテキストボックスを描き、マウスで任意の位置にドラッグします。

CSSコード

.cus-canvas{
    背景: rgb(50, 204, 243);
}

.入力要素{
    表示: なし;
    位置: 固定;
    幅: 180ピクセル;
    境界線: 0;
    背景色: #fff;
}

HTMLコード

<div>
    <canvas id="canvas" class="cus-canvas" width="800" height="600"></canvas>
    <input id="inputEle" class="input-ele"/>
</div>

jsコード

実装原理は、マウスの動きの位置を記録し、四角形とテキストコンテンツを継続的に再描画することです。

mouseDown を false にします。
deltaX = 0 とします。
deltaY = 0 とします。
テキストを「hello」にします
定数キャンバス = document.getElementById('キャンバス');
const ctx = canvas.getContext('2d');
定数 cw = canvas.width、ch = canvas.height;
定数矩形 = {
    x: 20,
    y: 20,
    幅: 150,
    高さ: 50
}

/** テキストと境界線のスタイルを設定する */
ctx.font="16px Arial";
ctx.fillStyle = "#fff"; 
/** 中央に設定すると、テキストセグメントの中心は fillText の x ポイントになります*/
ctx.textAlign = 'center';
ctx.lineWidth = '2';
ctx.strokeStyle = '#fff';

ストローク矩形()

定数 inputEle = document.getElementById('inputEle');
inputEle.onkeyup = 関数(e) {
    if(e.keyCode === 13) {
        テキスト = inputEle.value
        ストローク矩形()
        inputEle.setAttribute('style', `display:none`)
    }
}

canvas.ondblclick = function(e){ 
    inputEle.setAttribute('style', `左:${e.clientX}px;上:${e.clientY}px;表示:block`);
    入力エレメント.focus();
}

キャンバス.onmousedown = 関数(e){ 
    /** ビューポートの左端とキャンバスの左端の間の距離と、マウスのクリック位置とキャンバスの左端の間の長さを取得します。この値は、相対移動中の定数値です*/
    デルタX = e.clientX - rect.x;
    deltaY=e.clientY - rect.y;
    マウスダウン = true
};  

定数 judgeW = cw-rect.width、 judgeH = ch-rect.height;

キャンバス.onmousemove = 関数(e){ 
    if(マウスダウン) {
        /** 四角形の左端とキャンバスの左端の間の長さを減算します*/
        dx = e.clientX-deltaX とします。 
        dy = e.clientY-deltaY とします。 
        dx < 0 の場合
            dx = 0;
        } そうでない場合 (dx > judgeW) {
            dx = 裁判官W;
        }
        dy < 0の場合{
            dy = 0;
        } そうでない場合(dy > judgeH) {
            dy = 裁判官H;
        }
        rect.x = dx;
        rect.y = dy; 
        ストローク矩形()
    }
};  
キャンバス.onmouseup = 関数(e){ 
    マウスダウン = false
};  

/** 指定された領域をクリアします */
関数clearRect() {
    ctx.clearRect(0, 0, cw, ch)
}

/** 四角形を描画します */
関数strokeRect() {
    クリア矩形()

    /** beginPath がここで呼び出されない場合、履歴矩形が再描画されます*/
    ctx.beginPath() 
    ctx.rect(rect.x、rect.y、rect.width、rect.height)
    ctx.stroke();
    // フォントの内容とキャンバス上の位置を設定します ctx.fillText(text, rect.x + 70, rect.y + 30);
}

Githubへようこそ

これで、HTML でコンテンツを任意にドラッグする 2 つの方法についての説明は終わりです。HTML でコンテンツを任意にドラッグする方法に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決します

>>:  MySQL インポートおよびエクスポートのバックアップの詳細

推薦する

Vscode が Ubuntu にリモート接続する際のエラー問題の解決方法

1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...

Navicat for Mysql 接続エラー 1251 (接続失敗) の問題を解決する

以前書いた内容が詳細さに欠けていたため、今回は修正・補足しました。ただし、以前の MySQL バージ...

HTML で 2 つの div タグの間に垂直線を描く方法

最近、インターフェースを描画しているときに、インターフェースに垂直線を描画し、この垂直線の高さが親 ...

JavaScript は 3 つの一般的な Web 効果 (オフセット、クライアント、スクロール シリーズ) を実装します。

目次1. 要素オフセットシリーズ2. 要素表示領域クライアントシリーズ3. 要素スクロールシリーズ1...

Vue コンポーネントの構成構造とコンポーネント登録の詳細

目次1. コンポーネントの構成2. コンポーネント名2.1 コンポーネントの命名3. グローバル登録...

仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

この記事では、Windows Server オペレーティング システムのインストールと企業でのそのア...

.Net Core を使用して数千万のデータを MySQL にインポートする手順

目次事前準備実施方法: 1. 単一のデータを挿入する2. マージデータ挿入3. MySqlBulkL...

Nginx で複数のドメイン名がドメインをまたいでアクセスできるようにマップを使用する方法

一般的なNginx構成ではクロスドメインが可能 サーバー{ 11111 を聞いてください。 serv...

Vue vee-validateプラグインの簡単な使い方

目次1. インストール2. インポート3. 検証ルールを定義します(エクスポート用に js ファイル...

5分でWebRTCビデオチャットを構築する

前回の記事では、Ubuntu 上の webrtc ベースの多人数ビデオチャット サービスの詳細なコー...

CSS 8 目を引く HOVER 効果のサンプル コード

1. エフェクトHTMLを送信する <div id="送信ボタン">...

Jenkins統合Dockerプラグインの問題を解決するいくつかの方法

目次背景質問1エラー 2エラー 3エラー4要約する背景テスト環境では、docker プラグインを統合...

vuex データの永続化のための 2 つの実装ソリューション

目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...

MySQLクエリ条件におけるonとwhereの配置の違いの分析

導入今日SQLを書いているときに、問題が発生しました。要件は、データを照会し、スコアと過去 1 週間...

ウェブ上でチャートを描くための 9 つの優れた JavaScript フレームワーク スクリプト

ウェブ上でチャートを描くための 9 つの優れた JavaScript フレームワーク スクリプト 1...