Вот вариант с size. Но без моноширинного шрифта (зато любого размера) не обойтись. Можно, конечно, пошаманить с maxlength и зазорами, но это от лукавого.
<!DOCTYPE HTML>
<html>
<head>
<style type = "text/css">
.resiz {
font-size: 15px;
font-family: monospace;
}
</style>
</head>
<body>
<input type = "text" id = "needResize" size = "1" class = "resiz">
<input type = "text" id = "needResize2" size = "3" class = "resiz">
<script>
makeRubber = (function () {
function boomer() {
this.size = this.value.length + 1;
}
return function (input) {
input.onkeydown = boomer;
input.onkeyup = boomer;
input.onkeydown();
}
})()
makeRubber(document.getElementById("needResize"));
makeRubber(document.getElementById("needResize2"));
</script>
</body>