従来のtextareaの高さ指定はstyleでheightを指定するか、rows属性で行数を指定するの2通りで、指定行より改行が多くなれば、スクロールバーが表示されえてしまいます。iOSでスクロールバーがないのが当たり前になった時分にはふさわしくないデザインの一つです。そこでtextareaの内容行数に合わせて、scrollなしでheight:100%かautoを作る方法をやってます。
(2018年4月現在のこのサイトのコメント欄に利用してます)

DEMO

RAW HTML CSS JS

keyup()

jqueryのkeyup()でtextarea上のキーボードの打鍵eventを感知します。

$('textarea').on('keyup', function(event) {
// :
}
ソースコード装飾ならGoogle code prettify

str.replace()

textarea内の改行の文字コードは、¥rか¥nなので、細工せずにそのままclone()やhtml()を使かうとスペースになります。
そこでJSのreplaceを利用して、改行をBRに置換します。

$('textarea').on('keyup', function(event) {
    var str = $(this).val();
    str = str.replace(/\r?\n/g, '') + '';
}
ソースコード装飾ならGoogle code prettify

html()

keyup()でイベント毎にtextareaの次に配置したdivにHTMLをコピーします。

<textarea></textarea>
<div class="mirror"></div>
ソースコード装飾ならGoogle code prettify

$('textarea').on('keyup', function(event) {
    // :
$(this).next('.mirror').html(str);
}
ソースコード装飾ならGoogle code prettify

最後に

後は.mirrorをvisibility: hidden;にして表示領域を保ったまま非表示にします。textareaをposition: absolute;にすれば表示領域が確保されずに.mirrorがtextareaに覆いかぶる形になります。