最近、vue を使用しているときに、中央部分をドラッグして左右の div の幅を調整できることを実現したいという要件に遭遇しました。この記事ではそれを整理して共有します。詳細は次のとおりです。 レンダリング コンポーネントの分解フレックスレイアウトを全体的に使用する 左パネル
右パネル
入力パラメータの分解小道具
スロット
具体的な実装ドラッグする方法は?左パネルと右パネルの間に隠しボックスを追加し、このボックスを box-shadow で非表示にします。特定のイベントはこのdivに実装されます <div id="line" class="w-2 cursor-move hidden md4:block"onMousedown={hnadleMouseDown}> </div> イベントリスニングconst hnadleMouseDown = (イベント: マウスイベント) => { /* 開始点を取得して保存します*/ {pageX, pageY} = evtとします。 ベース位置.pageX = pageX; ベース位置.pageY = pageY; /* マウス移動イベントをリッスンする*/ document.addEventListener("mousemove"、handleMouseMove); document.addEventListener("mouseup"、handleMouseUp); }; const ハンドルマウス移動 = evt => { /* ブラウザのデフォルトイベントがブラウザのジェスチャ機能をトリガーしないようにする*/ evt.preventDefault(); /* DOM が複数回リフローするのを防ぐためにタイマーを設定します */ タイムアウトをクリアします(タイマー値); タイマー値 = setTimeout(() => { {pageX} = evtとします。 const baseDiv = document.querySelector(".right-border-shadow"); /* プロセス幅が最大値/最小値の範囲内かどうか*/ baseWidth: 数値 | undefined = とします Number(baseDiv?.clientWidth) + (pageX - basePosition.pageX); ベース幅 = baseWidth > Number(props?.maxWidth) ? props.maxWidth : baseWidth; ベース幅 = 数値(基本幅) < 数値(props?.最小幅) ? プロパティの最小幅 : ベース幅; baseDiv?.setAttribute("style", `width:${baseWidth}px`); /* 幅変更イベントを発行 */ ctx.emit("drugend"); /* ストアからストアへ */ ストアを設定します(ベース幅)。 }, 50); }; 定数handleMouseUp = evt => { /* ドラッグが終了したら、イベントのリスニングをキャンセルし、最終的な幅を出力します*/ 定数幅 = document.querySelector(".right-border-shadow")?.clientWidth; document.removeEventListener("mousemove"、handleMouseMove); document.removeEventListener("mouseup"、handleMouseUp); ctx.emit("drugend", 幅); }; 幅処理スタイル={`幅:${ store.get("split-width") ? store.get("split-width") : props.minWidth ? プロパティの最小幅 : 384 }px`} 最適化ブラウザウィンドウの幅を手動で変更する 次のティック(() => { ctx.emit("load", ctx); MutationObserver = window.MutationObserver; if (ミューテーションオブザーバー) { /* ブラウザウィンドウの変更を監視します。この API は場合によっては必要です */ mo = 新しい MutationObserver(関数() { const __wm = document.querySelector("#rezie-id"); // __wm 要素が変更された場合にのみ __canvasWM を再呼び出しします もし (!__wm) { // mo.disconnect() が常にトリガーされないようにする。 mo = null; ctx.emit("サイズ変更"); } }); mo.observe(document.querySelector("#rezie-id"), { 属性: true、 サブツリー: true、 子リスト: true、 }); } }); 効果がありません。アドバイスをお願いします バグ親コンポーネントの onMounted フックで子要素のスロット要素ノードを取得するときにエラーが発生しました。値は null です。現在の解決策は、子コンポーネントの onMounted フックでロード イベントをスローし、親コンポーネントが onLoad を使用して後続のロジックを処理することです。 git アドレス倉庫住所プレビューアドレス Vue3 ドラッグ可能な左右のパネル分割コンポーネントの実装に関するこの記事はこれで終わりです。Vue3 ドラッグ可能な左右のパネル分割コンポーネントに関するその他の関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL 自動インクリメント ID のオーバーサイズ問題のトラブルシューティングと解決策
テーブル内の min-width と max-width プロパティの設定 <テーブル>...
1. dfコマンドを使用してディスク全体の使用量を表示します。 df コマンドは、ハードディスクのマ...
1. コンポーネントと実装機能Keepalived: Haproxy サービスの高可用性を実現し、...
私は SQL の初心者で、オープンソースのインストールは非常に簡単だと思っていましたが、その過程でい...
Nginx (「エンジン エックス」と発音) は、インターネット上の最大規模のサイトの負荷を処理す...
まとめDocker-compose は複数の Docker コンテナ サービスを簡単に組み合わせるこ...
目次01 問題の説明02 ソリューション1. 他のスレーブライブラリを見つけてすぐに置き換える2. ...
写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正...
1. クエリプロセスプロセスリストを表示2. 対応するプロセスを照会し、IDを強制終了します。検証(...
この記事では、MySql のインデックス、ロック、トランザクションに関する知識のポイントをまとめてい...
目次1. データベース設計2. フロントエンドページ3. 完全なデモフロントエンド開発では、カスケー...
この記事では、例を使用して、MySQL で GROUP_CONCAT を使用する方法について説明しま...
いくつかのテーブルまたは単一のデータベースのみをバックアップする場合は、innobackup よりも...
この記事では、お絵かきボード/サインボード機能を実現するためのJSキャンバスの具体的なコードを参考ま...
ドロップダウンボックス、テキストフィールド、ファイルフィールド 上半分はデモンストレーション効果、下...