如何设置输入宽度以匹配占位符文本宽度

Posted

技术标签:

【中文标题】如何设置输入宽度以匹配占位符文本宽度【英文标题】:How to set an input width to match the placeholder text width 【发布时间】:2013-06-22 13:44:17 【问题描述】:

例如http://dabblet.com/gist/5859946

如果您有一个长占位符,则默认情况下输入显示的宽度不足以显示所有占位符文本。

例如

<input placeholder="Please enter your name, address and shoe size">

不设置固定宽度,最好不设置javascript,能否设置输入显示所有占位符文本?

【问题讨论】:

【参考方案1】:

这只能通过 javascript 通过设置 size = placeholder length 来完成:

input.setAttribute('size',input.getAttribute('placeholder').length);

这是一个用于所有输入的代码: http://jsfiddle.net/KU5kN/

【讨论】:

不一定总是完全正确的宽度,有用且非常简洁。谢谢。 我在下面发布了一个使用 jQuery 运行的答案,如果有人想要这样的话,也可以避免抛出错误 不幸的是,跨浏览器的结果非常不一致。 还是不一致吗?还有没有更好的方法来实现这一点? @BugWishperer 。我认为所有现代浏览器都支持它,但根据定义,“大小”属性不是固定长度。如果您在不同的浏览器(edge/chrome/ff)中打开我的 jsfiddle,您会注意到最后一个单词后或多或少有空格。那是因为“大小”的工作方式。另一种方法是使用占位符的相同字体的文本制作一个不可见的 div,动态获取它的宽度并将其设置为输入。【参考方案2】:

以防万一有人想将它与 jQuery 一起使用,该代码将在下面。此外,如果接受的答案中不存在 placeholder 属性,您将收到错误,下面的 jQuery 示例也解决了这一问题。

$("input[placeholder]").each(function () 
        $(this).attr('size', $(this).attr('placeholder').length);
    );

【讨论】:

【参考方案3】:

我采用了 Avner Solomon 的解决方案,正如上述部分的 cmets 中所建议的那样。

您需要一个 div 元素来包装一个 input 和另一个包含您的标签的 div 元素:

<div class="input-container">
     <!-- this element is hidden from display and screen readers. -->
     <div class="input-hidden-label" 
          aria-hidden="true">
       Your placeholder text
     </div>

     <input class="input" 
            type="text" 
            placeholder="Your placeholder text"/>
</div>

假设input-hidden-labelinput 的字体样式相同,您将在输入旁边看到一行文本。文本将与输入的长度相同,给定或取几个像素。

然后您可以应用这些样式:

.input-container 
  display: inline-block;
  margin-bottom: 2em;


.input 
  display: inline;
  width: 100%;
  font-size: 16px;
  font-family: Times;


.input-hidden-label 
  height: 0;
  visibility: hidden;

这通过给它height: 0 并删除visibility 来隐藏标签。但是,width 仍然存在。包含input 和标签的div 与其最长的孩子的width 匹配。如果您随后将input 设置为width: 100%,它将匹配已匹配占位符的父宽度。

See this fiddle.

注意事项

这个想法不是很容易理解,这个解决方案也不是。您应该为输入添加一个标签,而不是依赖占位符本身作为标签。

【讨论】:

我不明白你的警告,你说“这个想法不是很容易理解,这个解决方案也不是。”?对我来说似乎是一个很好的解决方案,并且可以方便地将 html/CSS 与 JavaScript 分开。 @user3773048 每个元素都需要有一个标签才能被访问。您不应该依赖占位符属性来符合 WCAG。 天才。我认为只要你也有标签,可访问性就很好。【参考方案4】:

我想到的解决方法:

使用与占位符相同的文本创建一个 span 元素。 测量跨度元素的宽度。 将输入设置为 span 元素的宽度。 隐藏跨度元素。 display none 不行,用其他方法吧。

http://jsfiddle.net/Timar/cwLp3rbo/

var input = document.getElementById('input-1');

// measure width of same text as placeholder
var placeholder =  document.getElementById('input-1-placeholder');


input.style.width = placeholder.offsetWidth + "px"

【讨论】:

以上是关于如何设置输入宽度以匹配占位符文本宽度的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 的宽度永远不会小于占位符文本的宽度

确定占位符的大小以匹配图像的实际大小

如何通过 Jquery/Javascript 知道以 px 为单位的占位符字符串宽度?

IE:输入字段的占位符影响选择框的宽度

如何在AngularJS中显示占位符图像

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?