561

I have this text input in a form:

<input type="text"
       cols="40" 
       rows="5" 
       style="width:200px; height:50px;" 
       name="Text1" 
       id="Text1" 
       value="" />

I am trying to get it to take multiple lines of input. The width and height make the box to be bigger, but the user can enter text all (s)he wants yet it fills one line only.

How do I make the input more like a textarea?

Jeroen
  • 60,696
  • 40
  • 206
  • 339
Beginner
  • 28,539
  • 63
  • 155
  • 235

10 Answers10

908

You need to use a textarea to get multiline handling.

<textarea name="Text1" cols="40" rows="5"></textarea>
lambda
  • 3,295
  • 1
  • 26
  • 32
Ólafur Waage
  • 68,817
  • 22
  • 142
  • 198
78

You can't. At the time of writing, the only HTML form element that's designed to be multi-line is <textarea>.

Álvaro González
  • 142,137
  • 41
  • 261
  • 360
69

It is possible to make a text-input multi-line by giving it the word-break: break-word; attribute. (Only tested this in Chrome)

Sté
  • 771
  • 5
  • 2
  • 1
    Thanks! I noticed that Chrome was allowing multiple lines for inputs, which I totally didn't want to, and the reason was word-break which was inherited from the body element – rap1ds Nov 12 '14 at 14:12
  • 7
    Looks good in Chrome 39 and Safari 8.0.2, but not Firefox 34 in my brief testing. :( http://jsfiddle.net/msybs9g7/ – Jeremy Wadhams Dec 18 '14 at 22:47
  • 27
    This solution is outdated and not supported in most browsers anymore. Use – Dror Bar Jul 06 '20 at 13:54
63

Use the textarea

<textarea name="textarea" style="width:250px;height:150px;"></textarea>

don't leave any space between the opening and closing tags Or Else This will leave some empty lines or spaces.

themightysapien
  • 8,309
  • 2
  • 17
  • 15
38

If you need Multiline Textarea with Auto Height Increase feature, You can use following simple javascript,

function auto_height(elem) {  /* javascript */
    elem.style.height = '1px';
    elem.style.height = `${elem.scrollHeight}px`;
}
.auto_height { /* CSS */
  width: 100%;
}
<textarea rows="1" class="auto_height" onInput="auto_height(this)"></textarea>
Prasad Gayan
  • 1,424
  • 17
  • 26
  • 1
    Thanks. I modified this and used it in my react textarea – Cuado Oct 08 '21 at 10:46
  • 2
    P.S you want to add overflow: hidden to the textarea, or else it will add the extra height few letters before the actual needed one. – Art3mix Jan 26 '22 at 17:35
  • 1
    For me this caused the textarea to slightly increase in height when you start typing. A workaround is to set padding to 0 and restore it after setting the height: https://codepen.io/mrexodia/pen/LYdrBqM – mrexodia Aug 08 '22 at 20:37
  • Probably nered a `ResizeObserver` too for if the window is size changed – run_the_race Mar 05 '23 at 02:51
  • in react.js I applied it and it worked. – KD.S.T. Aug 25 '23 at 19:21
21

Check this:

The TEXTAREA element creates a multi-line text input control

Matías Fidemraizer
  • 63,804
  • 18
  • 124
  • 206
14

You should use textarea to support multiple-line inputs.

<textarea rows="4" cols="50">
Here you can write some text to display in the textarea as the default text
</textarea>
Osanda Deshan
  • 1,473
  • 3
  • 14
  • 30
8

Use <div contenteditable="true"> (supported well) with storing to <input type="hidden">.

HTML:

<div id="multilineinput" contenteditable="true"></div>
<input type="hidden" id="detailsfield" name="detailsfield">

jQuery:

$("#multilineinput").on('keyup',function(e) {   
    $("#detailsfield").val($(this).text()); //store content to input[type=hidden]
});
//optional - one line but wrap it
$("#multilineinput").on('keypress',function(e) {    
    if(e.which == 13) { //on enter
        e.preventDefault(); //disallow newlines     
        // here comes your code to submit
    }
});
Kalnode
  • 9,386
  • 3
  • 34
  • 62
Fanky
  • 1,673
  • 1
  • 18
  • 20
-5

If you're using React, you could use the 3rd-party UI library MUI. It has a custom proprietary <Input> element with a multiline option.

As LSE commented, ultimately it gets rendered as <textarea>.

  <FormControl>
    <InputLabel htmlFor="textContract">{`textContract`}</InputLabel>
    <Input
      id="textContract"
      multiline
      rows="30"
      type="text"
      value={props.textContract}
      onChange={() => {}}
    />
  </FormControl>

https://material-ui.com/components/text-fields/#multiline

Kalnode
  • 9,386
  • 3
  • 34
  • 62
Alan
  • 9,167
  • 4
  • 52
  • 70
  • From the documentation : `The multiline prop transforms the text field into a – LSE Nov 11 '21 at 01:05
-9

If you don't need to edit it, you can use a

<span>text here</span>

It will expand with the text.

ThePrince
  • 818
  • 2
  • 12
  • 26