ホームページ ウェブフロントエンド jsチュートリアル JavaScript フレームワーク (xmlplus) コンポーネントの紹介 (8) DividedBox

JavaScript フレームワーク (xmlplus) コンポーネントの紹介 (8) DividedBox

May 06, 2017 pm 03:29 PM

xmlplus は、フロントエンドおよびバックエンド プロジェクトを迅速に開発するための JavaScript フレームワークです。この記事では主に xmlplus レイアウト コンポーネントのパーティション ボックスを紹介します。興味のある方は参考にしてみてください

パーティション ボックス (pidedBox) は 2 つのカテゴリに分類できるレイアウト コンポーネントです。 1 つは水平分離ボックス (HpidedBox) と呼ばれ、もう 1 つは垂直分離ボックス (VpidedBox) と呼ばれます。水平分割ボックスは子を 2 列に分割し、垂直分割ボックスは子を 2 行に分割します。通常、列と行の間には区切りバーがあり、これをドラッグして子コンポーネントのサイズを変更できます。以下では、そのようなコンポーネントがどのように設計および実装されるかを紹介する例として垂直分離ボックスのみを使用します。

完成したコンポーネントのユースケース

過去の設計経験に基づいて、最初に想像上の完成したコンポーネントのユースケースを書き留めることができ、それはその後の設計と実装に役立ちます。垂直分離ボックスはレイアウト クラスのコンポーネントであるため、上で説明した 3 つのサブレベル コンポーネントを含むコンテナでもある必要があります。使いやすさを考慮して、分離ボックスをコンポーネントの内部に実装する必要はありません。分析後、次のアプリケーション例が得られます:

Example1: {
 css: "#example p { width: 80%; height: 80%; background: #AAA; }",
 xml: `<VpidedBox id="example">
    <p id=&#39;top&#39;/>
    <p id=&#39;bottom&#39;/>
   </VpidedBox>`
}
ログイン後にコピー

この例は、2 つの p 要素をラップする垂直分割ボックス コンポーネントで構成されます。ここでは、2 つの p 要素の幅と高さが親の 80% に設定され、背景色がグレーに設定されています。これはテストの便宜のためです。さらに、サブフレームの初期比率の割り当ても考慮する必要があります。デフォルトの比率を 50:50 に設定できますが、比率設定用の動的なインターフェイスを提供しながら、コンポーネントのインスタンス化時に比率を静的に指定するのが最善です。したがって、次のような改良されたユースケースがあります。

Example2: {
 css: "#example p { width: 80%; height: 80%; background: #AAA; }",
 xml: `<VpidedBox id="example" percent=&#39;30&#39;>
    <p id=&#39;top&#39;/>
    <p id=&#39;bottom&#39;/>
   </VpidedBox>`,
 fun: function (sys, items, opts) {
  sys.top.on("click", e => sys.example.percent = 50);
 }
}
ログイン後にコピー

この使用例では、垂直分離ボックスが初期化されるときに、サブボックスの初期比率分布が 30:70 に設定され、ユーザーが最初のサブボックスをクリックすると、比率分布が 50:50 に復元されます。ただし、この比率は仕切りバーのスペースを除いた残りのスペースの比率を指します。

設計と実装

次に、コンポーネントの内部に注目してみましょう。まずはコンポーネントの基本構成を大まかに決めましょう。直観的には、垂直分割フレーム表示には、上部サブフレーム部分、分割バー、および下部サブフレーム部分の 3 つのコンポーネント部分が含まれています。したがって、次のビュー項目部分を一時的に取得できます:

VpidedBox: {
 xml: `<p id=&#39;hbox&#39;>
   <p id=&#39;top&#39;/>
   <p id=&#39;handle&#39;/>
   <p id=&#39;bottom&#39;/>
   </p>`
}
ログイン後にコピー

次に、垂直分割ボックス コンポーネント インスタンスの子部分が、上部のサブボックスの上部と下部のサブボックスの底部に正しくマッピングされていることを確認します。方法としては、まずすべての子要素オブジェクトを上部のサブボックス上部に追加し、次に下部の子要素を機能項目内の下部のサブボックス下部に追加します。

VpidedBox: {
 xml: `<p id=&#39;hbox&#39;>
   <p id=&#39;top&#39;/>
   <p id=&#39;handle&#39;/>
   <p id=&#39;bottom&#39;/>
   </p>`,
 map: {appendTo: "top" },
 fun: function (sys, items, opts) {
  sys.bottom.elem().appendChild(this.last().elem());
 }
}
ログイン後にコピー

次に、最上位の p 要素の配置方法を相対配置に設定します。 3 つの子要素は絶対配置に設定されます。また、ディバイダーの高さを 5px に設定します。

VpidedBox: {
 css: `#hbox { position:relative; width:100%; height:100%; box-sizing: border-box; }
   #top { top: 0; height: 30%; } #bottom { bottom: 0; height: calc(70% - 5px); }
   #top,#bottom { left: 0; right: 0; position: absolute; }
   #handle { height: 5px; width: 100%; position:absolute; left:0; top: 30%; z-index:11; cursor:row-resize; }`,
 xml: `<p id=&#39;hbox&#39;>
   <p id=&#39;top&#39;/>
   <p id=&#39;handle&#39;/>
   <p id=&#39;bottom&#39;/>
   </p>`,
 map: {appendTo: "top" },
 fun: function (sys, items, opts) {
  sys.bottom.elem().appendChild(this.last().elem());
 }
}
ログイン後にコピー

最後に、分割バーのドラッグイベントに応答してサブボックスの割り当て比率を変更する方法を見てみましょう。サブボックスの比率を変更し、区切りバーのドラッグ イベントをリッスンする関数を定義する必要があります。以下は実装の 1 つです。

VpidedBox: {
 // 视图项同上
 map: { format: {"int": "percent"}, appendTo: "top" }, 
 fun: function (sys, items, opts) {
  var percent = 50;
  sys.handle.on("dragstart", function (e) {
   sys.hbox.on("dragover", dragover);
  });
  sys.hbox.on("dragend", function (e) {
   e.stopPropagation();
   sys.hbox.off("dragover", dragover);
  });
  function dragover(e) {
   e.preventDefault();
   setPercent((e.pageY - sys.hbox.offset().top) / sys.hbox.height() * 100);
  }
  function setPercent(value) {
   sys.handle.css("top", value + "%");
   sys.top.css("height", value + "%");
   sys.bottom.css("height", "calc(" + (100 - value) + "% - 5px)");
  }
  setPercent(opts.percent || percent);
  sys.bottom.elem().appendChild(this.last().elem());
  return Object.defineProperty({}, "percent", {get: () => {return percent}, set: setPercent});
 }
}
ログイン後にコピー

上記のコードのマッピング項目にはパーセント形式の設定があり、パーセントが整数であることが保証されます。また、機能項目内のサブボックスの割合の設定にはcss3のcalc計算機能を使用していますので、ブラウザフォームのサイズが変わっても変更後の機能が動作します。より多くのブラウザと互換性を持たせたい場合は、さらに作業を行う必要があります。また、コンポーネントの良好なパフォーマンスを確保するために、dragover イベントはユーザーがドラッグを開始したときにのみリッスンされることにも注意してください。

さらなる改善

ここで簡単なテストを行って、子として 2 つのテキスト フィールドを含む垂直区切りボックスのアプリケーション例を作成してみましょう。区切りバーをドラッグして、何が起こるか見てみましょう。

Example3: {
 css: `#example textarea { width: 80%; height: 80%; }`,
 xml: `<VpidedBox id="example">
    <textarea id=&#39;top&#39;/>
    <textarea id=&#39;bottom&#39;/>
   </VpidedBox>`
}
ログイン後にコピー

この例では、分割バーが誤動作することがあり、分割バーの位置によってサブボックスの比率が変化しなくなります。問題は、テキストフィールドがドラッグイベントをハイジャックし、コンポーネントが応答イベントを受け取らないことです。いくつかのパッチを作成する必要があります。

VpidedBox: {
 css: "#hbox { position:relative; width:100%; height:100%; box-sizing: border-box; }\
   #top { top: 0; height: 30%; } #bottom { bottom: 0; height: calc(70% - 5px); }\
   #top,#bottom { left: 0; right: 0; position: absolute; }\
   #handle { height: 5px; width: 100%; position:absolute; left:0; top: 30%; z-index:11; cursor:row-resize; }\
   #mask { width: 100%; height: 100%; position: absolute; display: none; z-index: 10; }",
 xml: "<p id=&#39;hbox&#39;>\
   <p id=&#39;top&#39;/>\
   <p id=&#39;handle&#39; draggable=&#39;true&#39;/>\
   <p id=&#39;bottom&#39;/>\
   <p id=&#39;mask&#39;/>\
   </p>",
 map: { format: {"int": "percent"}, appendTo: "top" }, 
 fun: function (sys, items, opts) {
  var percent = 50;
  sys.handle.on("dragstart", function (e) {
   sys.mask.show();
   sys.hbox.on("dragover", dragover);
  });
  sys.hbox.on("dragend", function (e) {
   sys.mask.hide();
   e.stopPropagation();
   sys.hbox.off("dragover", dragover);
  });
  function dragover(e) {
   e.preventDefault();
   setPercent((e.pageY - sys.hbox.offset().top) / sys.hbox.height() * 100);
  }
  function setPercent(value) {
   sys.handle.css("top", value + "%");
   sys.top.css("height", value + "%");
   sys.bottom.css("height", "calc(" + (100 - value) + "% - 5px)");
  }
  setPercent(opts.percent || percent);
  sys.bottom.elem().appendChild(this.last().elem());
  return Object.defineProperty({}, "percent", {get: () => {return percent}, set: setPercent});
 }
}
ログイン後にコピー

この問題を解決するために、コンポーネント内の追加の p 要素オブジェクト マスクを参照しました。この要素はデフォルトでは表示されません。ドラッグを開始するとサブボックスとセパレーターバーが覆われ、ドラッグが終了すると再び非表示になります。これにより、テキスト フィールドによるドラッグ イベントのハイジャックが回避されます。

横分割枠と併用します

上記の縦分割枠のデザイン経験があれば、横分割枠の作成は難しくないので、ここでは記載しません。ここでは主に、水平分離ボックスと垂直分離ボックスを総合的に使用する例を示します。もちろん、設計当初はこのような使い方は考えていませんでした。

Example4: {
 css: `#example p { width: 100%; height: 100%; }`,
 xml: `<HpidedBox id=&#39;example&#39;>
    <VpidedBox percent=&#39;30&#39;>
     <p/><p/>
    </VpidedBox>
    <VpidedBox percent=&#39;30&#39;>
     <p/><p/>
    </VpidedBox>
   </HpidedBox>`
}
ログイン後にコピー

この例は主に、分割ボックスがネストされている場合のパフォーマンスを示すために使用されます。この例には水平方向の分離ボックスが含まれており、その中に 2 つの垂直方向の分離ボックスが含まれています。このレイアウトは多くのエディターで非常に一般的であり、ここでは簡単かつ効率的に実装しました。

この一連の記事は、xmlplus フレームワークに基づいています。 xmlplus についてあまり詳しくない場合は、www.xmlplus.cn にアクセスしてください。詳細な入門ドキュメントはここから入手できます。

【関連おすすめ】

1. 無料のjsオンラインビデオチュートリアル

3. php.cn Dugu Jiijian (3) - JavaScriptビデオチュートリアル

以上がJavaScript フレームワーク (xmlplus) コンポーネントの紹介 (8) DividedBoxの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles