コンテンツの位置をランダムにドラッグする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 インポートおよびエクスポートのバックアップの詳細

推薦する

Nginx リバース プロキシから go-fastdfs へのケースの説明

背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...

Dockerイメージのサイズを縮小する6つの方法

2017 年に Vulhub に取り組み始めてから、私は厄介な問題に悩まされてきました。Docker...

JavaScript で同時実行制御を実装する方法

目次1. 同時実行制御の概要1.1 フェーズ1 1.2 フェーズ2 1.3 フェーズ3 2. 同時実...

Bootstrap 3.0 学習ノート CSS関連補足

この記事の主な内容は次のとおりです。 1. ブラウザのサポート2. 画像3. レスポンシブツール4....

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

フロントエンドの面接でよく聞かれる JavaScript の質問の完全なリスト

目次1. 手書きのインスタンス2.配列のマップメソッドを実装する3. Reduceは配列のmapメソ...

nginx で同時接続リクエストの数を制限する方法

導入同時接続数を制限するモジュールは http_limit_conn_module です。アドレス:...

JavaScript でピンボール ゲームの Web バージョンを実装する

参考までに、JavaScriptのオブジェクトとメソッドを使用して実装されたWebピンボールゲームを...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

HTMLタグの説明

HTMLタグの説明1. HTMLタグタグ: !DOCTYPE説明: HTML ドキュメントが準拠する...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例

最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの...

MySQLログシステムの詳細情報共有

大規模なシステムに取り組んだことがある人なら誰でも、ログの役割を過小評価してはならないことを知ってい...