最近、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 のオーバーサイズ問題のトラブルシューティングと解決策
データベースは、どのオブジェクトにどのフィールドが含まれているかを照会します。 *を選択 sysob...
コンテナ間の通信1. コンテナのネットワーク共有このモードの Docker コンテナはネットワーク ...
目次序文1. 取引の基本原則の簡単な分析原子性:持続性分離:一貫性: 2. 分離レベルの基本原理の分...
目次背景メタバースとは何ですか?成果を達成するトライアル 1: THREE.TorusGeometr...
目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...
tomcat の containerID を見つけて、tomacat ディレクトリに入ります。 [r...
Shutdown.batファイルには次の文があります "%CATALINA_HOME%&q...
目次1. 需要方法1方法2方法3 2. 実装3. 問題解決質問1: トークンの複数回の更新を防ぐ方法...
この記事は主に、初心者に XHTML の基本的な知識と、XHTML と HTML の違いを理解しても...
デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...
1 BEM命名標準とはBem は、ブロック、要素、修飾子の略語であり、Yandex チームによって...
これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...
mysql 5.6.35 winx64無料インストールバージョン構成チュートリアルwin10、具体的...
序文実際、クエリ中に結果に番号が付けられるこのような状況に遭遇したことは一度もありません。同僚が転職...
これを実現するには、次のコードを追加するだけです。方法1: メタを使用する使用方法: <Met...