Vue でのテキストエリア適応高さソリューションの実装

Vue でのテキストエリア適応高さソリューションの実装

まず解決策を提示してください。Vueスタックが必要な学生はvue-awesome-textareaを直接ダウンロードできます。

隠れた問題

ネイティブ JS とは別に、フレームワークの UI ライブラリのほとんどは、適応型テキストエリアの高さ機能をサポートしていますが、一般的に見落とされがちな機能が 1 つあります。それが適応型の高さエコーです。

これらのライブラリを使用すると、テキストエリアにコンテンツを簡単に入力でき、範囲を超えると自動的に 1 行拡張されるため、コンテンツの適応性が高まります。コンテンツを送信し、同じ UI を使用して他のページでレンダリングすると、問題が発生します。一部の UI ライブラリはアダプティブ エコーをサポートしていないため、エコーを実現するには、行の高さ、行数、さらには高さの間の基本値を計算する必要があります。

適応高さのソリューション

一般的な解決策は 2 つあります。1 つは、ページの「リモート領域」にゴースト DOM を追加して、入力の改行をシミュレートすることです。この DOM は、editable 属性が true に設定された div または同一のテキスト領域である可能性があります。
element-uiの入力コンポーネントを例にとると、コンポーネントに値を入力すると、resizeTextareaメソッドが呼び出されます。

テキストエリアのサイズ変更() {
 if (this.$isServer) が戻ります;
 const { autosize, type } = this;
 if (type !== 'textarea') return;
 自動サイズ調整の場合
  this.textareaCalcStyle = {
   最小高さ: calcTextareaHeight(this.$refs.textarea).minHeight
  };
  戻る;
 }
 定数 minRows = autosize.minRows;
 定数maxRows = autosize.maxRows;

 this.textareaCalcStyle = calcTextareaHeight(this.$refs.textarea, minRows, maxRows);
}

autosize が true に設定されている場合、テキスト領域は適応型の高さに設定されます。このとき、テキストエリアの高さは calcTextareaHeight メソッドを通じてリアルタイムで計算されます。

エクスポートデフォルト関数calcTextareaHeight(
 ターゲット要素、
 最小行数 = 1、
 最大行数 = null
){
 if (!hiddenTextarea) {
  隠しテキストエリア = document.createElement('テキストエリア');
  document.body.appendChild(隠しテキスト領域)
 }

 させて {
  パディングサイズ、
  境界サイズ、
  ボックスサイズ、
  コンテキストスタイル
 } = ノードスタイルを計算します(ターゲット要素)。

 hiddenTextarea.setAttribute('style', `${contextStyle};${HIDDEN_STYLE}`);
 hiddenTextarea.value = targetElement.value || targetElement.placeholder || '';

 height = hiddenTextarea.scrollHeight; とします。
 定数結果 = {};

 if (boxSizing === 'border-box') {
  高さ = 高さ + 境界サイズ;
 } そうでない場合 (boxSizing === 'content-box') {
  高さ = 高さ - パディングサイズ;
 }

 隠しテキストエリアの値 = '';
 singleRowHeight を hiddenTextarea.scrollHeight - paddingSize とします。

 minRows !== null の場合 {
  minHeight = singleRowHeight * minRows とします。
  if (boxSizing === 'border-box') {
   minHeight = minHeight + パディングサイズ + 境界線サイズ;
  }
  高さ = Math.max(minHeight, 高さ);
  result.minHeight = `${minHeight}px`;
 }
 maxRows !== null の場合 {
  maxHeight = singleRowHeight * maxRows とします。
  if (boxSizing === 'border-box') {
   maxHeight = maxHeight + パディングサイズ + 境界線サイズ;
  }
  高さ = Math.min(maxHeight, 高さ);
 }
 result.height = `${height}px`;
 hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);
 隠しテキストエリア = null;
 結果を返します。
};

我々は見ることができる

if (!hiddenTextarea) {
  隠しテキストエリア = document.createElement('テキストエリア');
  document.body.appendChild(隠しテキスト領域)
}

Element-ui はテキストエリア DOM を作成し、calculateNodeStyling メソッドを通じて実際のテキストエリアのスタイルを hiddenTextarea にコピーします (オーバーフローは同期されず、実際のテキストエリアは非表示になります)。次に、textarea の入力値を監視し、それを hiddenTextarea に同期します。同時に、hiddenTextarea の scrollHeight を textarea の高さに同期し、最後に dom を破棄します。

スタイルの同期に関しては、要素は getComputedStyle と getPropertyValue の 2 つの API を使用します。もちろん、自分でラップする場合は、CSS プリプロセッサ ミックスインを使用することもできます。

2 番目のソリューションは最初のソリューションと似ていますが、追加の DOM は作成されません。冒頭の vue-awesome-textarea を例に挙げます。

初期化() {
  this.initAutoResize()
},
自動サイズ変更の初期化(){
  this.autoResize && this.$nextTick(this.calcResize)
}

ページがマウントされるか、コンテンツが変更され、autoResize がオンになっている場合、this.calcResize メソッドが実行されます。

 calcResize() {
 this.resetHeight()
 this.calcTextareaH()
},

リセット高さ() {
 this.height = 'auto'
},

calcTextareaH() {
 contentHeight = this.calcContentHeight() とします。
 this.height = this.calcHeightChange(contentHeight) + 'px'
 if (this.needUpdateRows(contentHeight)) {
  this.updateRows(コンテンツの高さ)
 }
 this.oldContentHeight = コンテンツ高さ
},

calcContentHeight() {
 const { パディングサイズ } = this.calcNodeStyle(this.$el)
 これを返します。$el.scrollHeight - paddingSize
},

resetHeight() はテキストエリアの高さを初期化するために使用され、デフォルトは auto です。 calcTextareaH() メソッドは、コンテンツ領域の高さ (テキスト領域の scrollHeight からパディングの高さを引いた値) を計算し、計算された高さをテキスト領域の高さにリアルタイムで同期するために使用されます。
this.height = this.calcHeightChange(contentHeight) + 'px'

ソリューション 1 と比較すると、このソリューションは同じアイデア (高さを動的に変更する) を採用していますが、追加の DOM 作成および破棄プロセスが削減されます。
さらに、vue-awesome-textarea は、適応プロセス中の行数のコールバックもサポートしており、データエコーをより適切にサポートできます。実装方法も非常に簡単です。

計算: {
 ...
 1行の高さ() {
  this.calcContentHeight() / Number(this.rows) || 0 を返します
 }
 ...
}

computed では 1 行の高さを計算し、this.calcTextareaH() メソッドを実行するときにコンテンツの高さを記録します。

 this.oldContentHeight = コンテンツ高さ

次に、行の追加操作があるかどうかを確認します。追加されている場合、新しいコンテンツの高さは古いコンテンツの高さと異なります。

行の更新が必要です(新しいコンテンツの高さ) {
  this.oldContentHeight !== newContentHeight を返します
},

この時点で、最新の行の高さをコンポーネントの外部に出力します。

行を更新(コンテンツの高さ) {
  this.$emit('getRows', Math.round(contentHeight / this.oneRowsHeight))
}

Vue での textarea の適応型高さソリューションの実装に関するこの記事はこれで終わりです。より関連性の高い Vue textarea の適応型コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 入力行数を固定し、テキストエリアに下線スタイルを追加するVueのアイデアの詳細な説明
  • Vueはテキストエリア内の残りの単語の動的な表示を実装します

<<:  CSS3で実装されたテキストポップアップ効果

>>:  テーブル適応とオーバーフローのいくつかの設定の詳細な説明

推薦する

行の高さと垂直方向の配置に関する包括的な理解

前の単語line-height、font-size、vertical-align は、インライン要素...

要素の幅(高さ)の適応を実現するCSSおよびCSS3の柔軟なボックスモデル

1. CSSは左の固定幅と右の適応幅を実現します1. ポジショニング <!DOCTYPE ht...

Vue プロジェクトでブラウザ キャッシュ設定を無効にする例

プロジェクトをリリースするときに、キャッシュをクリーンアップする必要があるという問題に遭遇することが...

MySQL並列レプリケーションの簡単な説明

1. 並列レプリケーションの背景まず、並列レプリケーションの概念はなぜ存在するのでしょうか? 1. ...

CSS の flex と inline-flex の違いの詳細な説明

inline-flex は inline-block と同じです。内部要素用の display:fl...

CSS を使用してデータ ホットスポット効果を実現する方法

効果は以下のとおりです。 分析する1. ここでは、点を囲む 3 つの円がズームアニメーションを実行し...

Alibaba Cloud Ubuntu 16.04 が IPSec サービスを構築

IPSec の概要IPSec (インターネット プロトコル セキュリティ): ネットワーク層と適用さ...

dns-prefetch とは何ですか? フロントエンドの最適化: DNS の事前解決によりページ速度が向上します

目次背景1. dns-prefetch とは何ですか? 2. dns-prefetch を設定するに...

MySQL5.7 並列レプリケーションの原理と実装

データ操作とメンテナンスに少しでも知識のある人なら、MySQL 5.5 以前では再生に単一の SQL...

Nginx イントラネット スタンドアロン リバース プロキシの実装

目次1 Nginxのインストール2 Nginxの設定3 ホストファイルを変更する4 テストNginx...

マテリアルデザインで水滴アニメーションボタンを実現するための純粋なCSS

序文こういう特殊効果ってよく見かけますよね。すごくかっこいいですよね。 これは、Google Mat...

ウェブ開発におけるクロスドメインの理由に対する複数のソリューション

目次クロスドメインの理由JSONP Nginxソリューションバックエンドソリューションクロスドメイン...

CSS3でアニメーションを実装する3つの方法

これは、面接者の CSS に関する基本的な知識をテストするものです。 CSSでアニメーションを実装す...

DIVマスクを使用して、マウスでチェックボックスを直接チェックすることが無効である問題を解決します

フロントエンドの開発過程で、チェックボックスが必要な状況が発生しました。ユーザー操作の利便性を考慮し...

nginx を使用して静的リソース サーバーを構築する方法

Windows を例にとると、Linux も実際には同じです。静的リソースサーバーを構築するパソコン...