非主流の textarea 自己成長実装 js code_javascript スキル

WBOY
リリース: 2016-05-16 17:58:13
オリジナル
860 人が閲覧しました

それらのほとんどは、scrollHeight (IE によって導入された非 W3C 標準) および keyup イベントによって実現されます。より興味深いものの 1 つは、「ミラー要素」と setTimeout ポーリングを通じて実装されます。一般的な実装アイデアは次のとおりです。

Position:absolute を使用してクライアント ビューの外側に別の pre 要素を配置し、それを textarea と同じスタイルに設定します。この pre 要素を「ミラー」と呼びます。 setTimeout を通じて 200 ミリ秒のポーリングを実行し、テキストエリアの新しい値をミラー要素に更新します。ミラー要素はブロックに設定されているため、そのサイズはコンテンツの量に応じて変化し、ミラー要素を取得します。offsetHeight は対応する要素に適用されます。 textarea の高さがコンテンツに応じて変化するようにします。

これは確かに良いアイデアです。ただし、平均的なユーザーは入力を続けず、毎回 offsetHeight を計算する方がリソースを大量に消費するため、このようなポーリングは少し「無駄」であるように思えます。

問題を発見したので、他の人のアイデアに基づいて修正を加えます。これはそれほど難しいことではありません。

まず、ミラー要素の offsetHeight を計算する操作を削除します。ラッパーを使用してミラー要素とテキストエリアをラップし、ミラー要素が可視性によって非表示になるように設定します。 hidden (display:none ではないことに注意してください) なので、ミラー要素のスペースがまだ占有されている状態で、textarea をラッパーに対して絶対的に配置し、ミラー要素上の textarea をカバーします。この例では、textarea が pre をカバーします。 、 textarea の高さと幅の属性は 100% に設定されており、pre の高さの変更がラッパーに直接反映され、それに応じて textarea のサイズも変更されます。 「ブロックレベル」要素

の特性を利用して無限ポーリングを行うには、やはり keyup を使用する方が良いと思いますが、イベント処理の観点からは、ユーザーに時間間隔を与えることができ、その必要はありません。この例で設定されている時間間隔は 250 ミリ秒で、ユーザーが一時停止して 250 ミリ秒のギャップがある場合は、textarea の値を pre のスパンに割り当てます。

このアイデアについては説明しましたが、比較的単純なはずです。

以下は HTML とそれに対応する JavaScript です (最近 mootools にハマっています)。CSS は長いので、詳細についてはページの下部にある jsfiddle の共有を参照してください。 🎜>

コードをコピーします コードは次のとおりです。

<span class="mirror"></span><br/> ;