使 html 文本输入字段随着我的输入而增长?

IT技术 javascript jquery html css
2021-01-21 06:36:56

我可以在 css 中设置初始文本输入大小,如下所示:

width: 50px;

但我希望它在我输入时增长,直到达到例如 200px。这可以在直接的 css、html 中完成,最好没有 javascript 吗?

当然也要发布您的 js/jquery 解决方案,但是如果没有它们也可以这样做 - 那就太好了。

我在这里尝试:

http://jsfiddle.net/jszjz/2/

6个回答

这是一个只有 CSS 和Content Editable的示例

jsFiddle 示例

CSS

span 
{
    border: solid 1px black;
}
div 
{
    max-width: 200px;   
}

HTML

<div>
    <span contenteditable="true">sdfsd</span>
</div>

有关的重要说明 contenteditable

制作 HTML 元素contenteditable允许用户将复制的 HTML 元素粘贴到该元素内。这可能不适合您的用例,因此在选择使用它时请记住这一点。

这是否与表格一起发送?
2021-03-16 06:36:56
对于我在 Chrome 中,当它达到最大宽度时,这会将元素向下扩展一行。如果输入旨在成为表单的一部分,它也将不起作用。
2021-03-17 06:36:56
对于多行输入字段(自定义换行符),替换spandiv. 请注意,这word-wrap: break-word将是必要的或长于max-width将溢出 div 框的单词jsfiddle.net/YZPmC/157
2021-03-30 06:36:56
耶。我刚刚在 IE6-9、最新的 Opera、Firefox 和 Chrome 以及 OMG 中尝试过它 - 它在任何地方都有效!
2021-04-09 06:36:56
确保您清除了可能通过复制和粘贴进入 contenteditable 范围的不需要的 html。
2021-04-14 06:36:56

我只是为你写的,我希望你喜欢它 :) 不能保证它是跨浏览器的,但我认为它是 :)

(function(){
    var min = 100, max = 300, pad_right = 5, input = document.getElementById('adjinput');

    input.style.width = min+'px';
    input.onkeypress = input.onkeydown = input.onkeyup = function(){
        var input = this;
        setTimeout(function(){
            var tmp = document.createElement('div');
            tmp.style.padding = '0';
            if(getComputedStyle)
                tmp.style.cssText = getComputedStyle(input, null).cssText;
            if(input.currentStyle)
                tmp.style.cssText = input.currentStyle.cssText;
            tmp.style.width = '';
            tmp.style.position = 'absolute';
            tmp.innerHTML = input.value.replace(/&/g, "&amp;")
                                       .replace(/</g, "&lt;")
                                       .replace(/>/g, "&gt;")
                                       .replace(/"/g, "&quot;")
                                       .replace(/'/g, "&#039;")
                                       .replace(/ /g, '&nbsp;');
            input.parentNode.appendChild(tmp);
            var width = tmp.clientWidth+pad_right+1;
            tmp.parentNode.removeChild(tmp);
            if(min <= width && width <= max)
                input.style.width = width+'px';
        }, 1);
    }
})();

JSFiddle

我如何允许它针对超过 1 (4) 个输入 id='adjinput'
2021-03-15 06:36:56
谢谢你的这个。我决定用 contenteditable 属性来做,尽管它不需要 js。
2021-03-24 06:36:56
这假设内容更改仅通过使用键盘发生。
2021-04-02 06:36:56
“我只是为你写了这个”。+1 表示努力:)
2021-04-03 06:36:56
很有创意我喜欢
2021-04-03 06:36:56

如果您将 span 设置为 display: inline-block,自动水平和垂直调整大小效果很好:

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

如何以编程方式修改输入的 size 属性?

在语义上 (imo),这个解决方案比公认的解决方案更好,因为它仍然使用输入字段作为用户输入,但它确实引入了一点点 jQuery。Soundcloud 为他们的标签做了类似的事情。

<input size="1" />

$('input').on('keydown', function(evt) {
    var $this = $(this),
        size = parseInt($this.attr('size'), 10),
        isValidKey = (evt.which >= 65 && evt.which <= 90) || // a-zA-Z
                     (evt.which >= 48 && evt.which <= 57) || // 0-9
                     evt.which === 32;

    if ( evt.which === 8 && size > 0 ) {
        // backspace
        $this.attr('size', size - 1);
    } else if ( isValidKey ) {
        // all other keystrokes
        $this.attr('size', size + 1);
    }
});

http://jsfiddle.net/Vu9ZT/

删除键使这个增长
2021-03-29 06:36:56
我想计数value.length会更容易也更可靠。
2021-03-31 06:36:56
如果您突出显示文本并按退格键,这将不起作用,因为它仅计为 size-1 而不是 size- $('input').val().length
2021-04-06 06:36:56

我想到了几件事:

onkeydown在文本字段中使用处理程序,测量文本*,并相应地增加文本框大小。

:focuscss 类附加到具有较大宽度的文本框。那么你的盒子在聚焦时会更大。这不完全是你所要求的,但相似。

* 在 javascript 中测量文本并不简单。查看这个问题以获得一些想法。

到目前为止最好的答案。 :focus { width: 100% }
2021-03-27 06:36:56