適応高さのtextareaの作成
4342 ワード
テキストボックスはよく見られる入力コントロールで、フォームを書いた人がtextareaという要素に触れたことがあると信じています.
OK.しかし、プロダクトマネージャは、ユーザーの入力内容に応じて高さを適応するには、このテキストボックスが必要だと話しています.
height: auto
一部の初心者は、適応高さは
したがって、
scrollHeight
この問題に遭遇した同級生(例えば当初の筆者)は、
では、問題は来ました.もし超えなかったら?
OK私はあなたが先に
次のセクションを削除します.
垂直スクロールバーがない場合、scrollHeightの値は、要素ビューにすべてのコンテンツを埋め込むために必要な最小値clientHeightと同じです.
split('')
DOM属性は当てにならないので、自分でテキストの高さを計算してはいけませんか?私がすべてのテキストを取り出して、改行で分割して、どれだけの行があるかを見て、
ええ...テキストが折り曲げられていない場合はそうです.の
contenteditable
contenteditableは確かに実行可能な案ですが、穴を踏んだ先駆者としてあなたを説得します:やむを得ず、contenteditableは触らないでください.これはブラウザごとに実現が異なり、さまざまな奇抜な行為があり、改行符だけで半日苦しめることができます.
もちろんここまで複雑ではありませんが、「コピー——貼り付け」の過去のスタイルを削除しなければなりません.
筆者の方法
あんなにくだらないことを言ったのに、いったいどうすればいいのだろう.ここで筆者は一つの方法を提供する.
もちろん、まず、筆者の方法は必ずしも最も簡単ではないと宣言します.他のもっと簡単な案があれば、伝言を歓迎します.
考えてみましょう.
このような考え方です.JSを使用して取得する必要はありません.
直接コード:
OK.しかし、プロダクトマネージャは、ユーザーの入力内容に応じて高さを適応するには、このテキストボックスが必要だと話しています.
height: auto
一部の初心者は、適応高さは
height: auto
ではないかと思っているかもしれません.しかし、あなたは考えてみて、1つのtextarea
は手でそれにスタイルを指定したことがなくて、デフォルトはheight: auto
ではありませんか?しかし、それはまだ独自の初期高さを持っていて、1つのdiv
のように高さが0ではありません.div
とは異なり、textarea
のデフォルトの高さは、その内容に応じて適応するのではなく、属性rowsによって指定され、そのデフォルト値は2
である.rows
この属性(Attribute)は正の整数のみを受け入れ、他の値を指定するとブラウザはその値を無視します.例えば、rows="auto"
を書くとrows
は2で、rows="0"
も2です.したがって、
height: auto
を指定することはできません.height
属性は、その値を手動で指定する必要があります.scrollHeight
この問題に遭遇した同級生(例えば当初の筆者)は、
scrollHeight
というDOM属性を思い浮かべたに違いない.考え方は簡単で、ユーザーが入力したテキストがテキストボックス自体の高さを超えたときにスクロールバーが現れるのではないでしょうか.自然とscrollHeightという属性が考えられます.scrollHeight
は、ユーザが入力したテキストの実際の高さであり、少なくともテキストボックスの既定の高さを超える場合にそうであるべきである.では、問題は来ました.もし超えなかったら?
OK私はあなたが先に
rows="1"
を指定してテキストボックスのデフォルトの高さを1行だけにすることを知っています.しかし、この場合、ユーザーはまず多くの行のテキストを入力しました.次のセクションを削除します.
scrollHeight
値に変化はありません.MDNでは、垂直スクロールバーがない場合、scrollHeightの値は、要素ビューにすべてのコンテンツを埋め込むために必要な最小値clientHeightと同じです.
scrollHeight
確かにユーザの入力内容の多少によって増減するが、スクロールバーが発生する場合に限られ、スクロールバーが発生しないこと(厳密には可視領域を超えている)が必要であるため、問題設定には適用されないに違いない.scrollHeight
の値を取得する前に、テキストボックスの高さを0に設定してスクロールバーを強制的に表示することができますが、ページが点滅し、パフォーマンスが低下する可能性があります.split('')
DOM属性は当てにならないので、自分でテキストの高さを計算してはいけませんか?私がすべてのテキストを取り出して、改行で分割して、どれだけの行があるかを見て、
*
は最終的なテキストの高さではありませんか?ええ...テキストが折り曲げられていない場合はそうです.の
contenteditable
contenteditableは確かに実行可能な案ですが、穴を踏んだ先駆者としてあなたを説得します:やむを得ず、contenteditableは触らないでください.これはブラウザごとに実現が異なり、さまざまな奇抜な行為があり、改行符だけで半日苦しめることができます.
もちろんここまで複雑ではありませんが、「コピー——貼り付け」の過去のスタイルを削除しなければなりません.
筆者の方法
あんなにくだらないことを言ったのに、いったいどうすればいいのだろう.ここで筆者は一つの方法を提供する.
もちろん、まず、筆者の方法は必ずしも最も簡単ではないと宣言します.他のもっと簡単な案があれば、伝言を歓迎します.
考えてみましょう.
textarea
は内容に応じて高さを適応できません.div
いいでしょう.まずテキストを1つのdiv
に記入することはできません.div
の高さはテキストボックスに必要な高さであるはずです(padding
、line-height
などのスタイルが一致している場合)、このときdiv
の高さをテキストボックスの高さに付与すればいいのではないでしょうか.このような考え方です.JSを使用して取得する必要はありません.
div
に親要素を支え、textarea
要素を絶対的に配置してテキストボックス全体の親要素のサイズを満たすだけでいいです.直接コード: