如何拉伸元素的宽度,使其100% - 其兄弟姐妹的宽度?

Wil*_*Niu 27 html css

说,我有以下无序列表.按钮有width: auto.如何设置元素的样式,以便#textField尽可能地拉伸,因此#textField按钮的宽度加起来会达到100%?即#textField宽度==(宽度的100%) - (按钮的计算宽度).

<ul>
  <li>
    <input id="textField" type="text" /><input type="button" />
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

因此,例如,假设100%宽度li为100像素:如果按钮的计算宽度为30px,则#textField宽度为70px; 如果按钮的计算宽度为25px,则#textField宽度将变为75px.

Wex*_*Wex 52

您可以使用的混合物迅速达到这种效果floatoverflow: hidden:

<ul>
    <li>
        <input class="btn" type="button" value="Submit"/>
        <div class="inputbox"><input id="textField" type="text" /></div>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

CSS:

ul { 
  list-style: none; 
  padding: 0; }
.btn { float: right; }
.inputbox { 
  padding: 0 5px 0 0;
  overflow: hidden; }
.inputbox input { 
  width: 100%;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box; }
Run Code Online (Sandbox Code Playgroud)

预览(带框大小):http://jsfiddle.net/Wexcode/E8uHf/546/

以下是没有盒子尺寸的样子:http://jsfiddle.net/Wexcode/E8uHf/

  • 这很好用,但更改了HTML顺序,这改变了键盘标签顺序,当按钮在文本输入之前被聚焦时,这将使许多键盘用户感到困惑. (6认同)
  • 这可能会有所帮助,但请记住,"tabindex"会覆盖*整个文档*的Tab键顺序,而不仅仅是表单.也就是说,具有正"tabindex"的任何元素都将移动到Tab键顺序的前面,并导航到页面上任何其他元素之前.http://www.w3.org/TR/html401/interact/forms.html#adef-tabindex (3认同)
  • 对于您的平均表单,设置Tab键顺序并不太繁琐.这个解决方案非常可靠. (3认同)
  • 难道你不能只使用`tabindex`来纠正任何标签排序问题吗? (2认同)

And*_*ich 6

试试这个:

HTML

<ul>
  <li>
    <input id="textField" type="text" /><input value="Button!" class="btn"type="button" />
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

CSS

ul li {
    width:100%;
}

#textField, .btn {
    float:left;
}

#textField {
    width:70%;
}

.btn {
    width:auto;
}
Run Code Online (Sandbox Code Playgroud)

这是一个演示:

http://jsfiddle.net/andresilich/RkCvf/


以下是我为您考虑的几个演示.

这个演示使用CSS3的flex-box模型input在没有给定宽度的情况下在其区域内拉伸场.但是,IE8及以下版本不支持.


这个演示只使用CSS模仿的表.IE8及以上版本支持它.

  • @WilliamNiu你对CSS3的flex-box好吗?这是一个演示:http://jsfiddle.net/andresilich/NFEab/ (3认同)

Poi*_*ars 5

使用支持CSS-2.x的布局引擎的用户代理中的CSS可以实现这一点:

  …
  <style type="text/css">
    .full-width {
      width: 100%;
    }

    .table {
      display: table;
    }

    .row {
      display: table-row;
    }

    .cell {
      display: table-cell;
    }
  </style>
</head>

<body>
  <ul class="table">
    <li class="row">
      <span class="cell full-width">
        <input type="text" id="textField" class="full-width" />
      </span>
      <span class="cell">
        <input type="button" value="foobar" />
      </span>
    </li>
  </ul>
</body>
Run Code Online (Sandbox Code Playgroud)

在以下浏览器中测试为阳性:

  • Chromium 16.0.912.75(Developer Build 116452 Linux),Apple WebCore 535.7
  • Chromium 16.0.912.63(Developer Build 113337 Linux),Apple WebCore 535.1

请注意,input由于固定宽度,元素上的填充和边距会发生干扰.

但是:我看没有很好的理由,为什么你应该使用table元素在这里(表格和CSS 混合).在语义上它是有意义的(表可以序列化),并且兼容性很可能比display上面的CSS 属性值更好:

<body>
  <ul>
    <li>
      <table class="full-width"
             summary="Input text field with &#8220;foobar&#8221; button">
        <tr>
          <td class="full-width">
            <input type="text" id="textField" class="full-width" />
          </td>
          <td>
            <input type="button" value="foobar" />
          </td>
        </tr>
      </table>
    </li>
  </ul>
</body>
Run Code Online (Sandbox Code Playgroud)

这也有可能是你应该使用只有一个table元素在这里摆在首位.

  • 您不应该使用表的原因是表单数据不是表格. (2认同)