make html text input field grow as I type?

前端 未结 12 1058
陌清茗
陌清茗 2020-11-27 12:02

I can set initial text input size in css, like so:

width: 50px;

But I would like it to grow when I type until it reaches for example 200px.

相关标签:
12条回答
  • 2020-11-27 12:20

    A couple of things come to mind:

    Use an onkeydown handler in your text field, measure the text*, and increase the text box size accordingly.

    Attach a :focus css class to your text box with a larger width. Then your box will be larger when focused. That's not exactly what you're asking for, but similar.

    * It's not straightforward to measure text in javascript. Check out this question for some ideas.

    0 讨论(0)
  • 2020-11-27 12:20

    Here's a method that worked for me. When you type into the field, it puts that text into the hidden span, then gets its new width and applies it to the input field. It grows and shrinks with your input, with a safeguard against the input virtually disappearing when you erase all input. Tested in Chrome. (EDIT: works in Safari, Firefox and Edge at the time of this edit)

    function travel_keyup(e)
    {
        if (e.target.value.length == 0) return;
        var oSpan=document.querySelector('#menu-enter-travel span');
        oSpan.textContent=e.target.value;
        match_span(e.target, oSpan);
    }
    function travel_keydown(e)
    {
        if (e.key.length == 1)
        {
            if (e.target.maxLength == e.target.value.length) return;
            var oSpan=document.querySelector('#menu-enter-travel span');
            oSpan.textContent=e.target.value + '' + e.key;
            match_span(e.target, oSpan);
        }
    }
    function match_span(oInput, oSpan)
    {
        oInput.style.width=oSpan.getBoundingClientRect().width + 'px';
    }
    
    window.addEventListener('load', function()
    {
        var oInput=document.querySelector('#menu-enter-travel input');
        oInput.addEventListener('keyup', travel_keyup);
        oInput.addEventListener('keydown', travel_keydown);
    
        match_span(oInput, document.querySelector('#menu-enter-travel span'));
    });
    #menu-enter-travel input
    {
    	width: 8px;
    }
    #menu-enter-travel span
    {
    	visibility: hidden;
        position: absolute;
        top: 0px;
        left: 0px;
    }
    <div id="menu-enter-travel">
    <input type="text" pattern="^[0-9]{1,4}$" maxlength="4">KM
    <span>9</span>
    </div>

    0 讨论(0)
  • 2020-11-27 12:29

    From: Is there a jQuery autogrow plugin for text fields?


    See a demo here: http://jsbin.com/ahaxe

    The plugin:

    (function($){
    
        $.fn.autoGrowInput = function(o) {
    
            o = $.extend({
                maxWidth: 1000,
                minWidth: 0,
                comfortZone: 70
            }, o);
    
            this.filter('input:text').each(function(){
    
                var minWidth = o.minWidth || $(this).width(),
                    val = '',
                    input = $(this),
                    testSubject = $('<tester/>').css({
                        position: 'absolute',
                        top: -9999,
                        left: -9999,
                        width: 'auto',
                        fontSize: input.css('fontSize'),
                        fontFamily: input.css('fontFamily'),
                        fontWeight: input.css('fontWeight'),
                        letterSpacing: input.css('letterSpacing'),
                        whiteSpace: 'nowrap'
                    }),
                    check = function() {
    
                        if (val === (val = input.val())) {return;}
    
                        // Enter new content into testSubject
                        var escaped = val.replace(/&/g, '&amp;').replace(/\s/g,'&nbsp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                        testSubject.html(escaped);
    
                        // Calculate new width + whether to change
                        var testerWidth = testSubject.width(),
                            newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
                            currentWidth = input.width(),
                            isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
                                                 || (newWidth > minWidth && newWidth < o.maxWidth);
    
                        // Animate width
                        if (isValidWidthChange) {
                            input.width(newWidth);
                        }
    
                    };
    
                testSubject.insertAfter(input);
    
                $(this).bind('keyup keydown blur update', check);
    
            });
    
            return this;
    
        };
    
    })(jQuery);
    
    0 讨论(0)
  • 2020-11-27 12:29

    I know this is a seriously old post - but my answer might be useful to others anyway, so here goes. I found that if my CSS style definition for the contenteditable div has a min-height of 200 instead of a height of 200 , then the div scales automatically.

    0 讨论(0)
  • 2020-11-27 12:30

    If you set the span to display: inline-block, automatic horizontal and vertical resizing works very well:

    <span contenteditable="true" 
          style="display: inline-block;
                 border: solid 1px black;
                 min-width: 50px; 
                 max-width: 200px">
    </span>

    0 讨论(0)
  • 2020-11-27 12:30

    If you are just interested in growing, you can update the width to scrollWidth, whenever the content of the input element changes.

    document.querySelectorAll('input[type="text"]').forEach(function(node) {
      node.onchange = node.oninput = function() {
        node.style.width = node.scrollWidth+'px';
      };
    });
    

    But this will not shrink the element.

    0 讨论(0)
提交回复
热议问题