输入/按钮元素不会在Flex容器中缩小

vid*_*zer 32 html css css3 flexbox

在Flex容器中使用输入和按钮元素时,flex和/或flex-grow属性似乎没有做任何事情.

代码,演示我的问题.

button,
input {
  font-size: 1rem;
}

button {
  border: none;
  background-color: #333;
  color: #EEE;
}

input {
  border: 1px solid #AAA;
  padding-left: 0.5rem;
}

.inputrow {
  width: 30rem;
  display: flex;
  margin: 0 -.25rem;
}

.inputrow>* {
  margin: 0 .25rem;
  border-radius: 2px;
  height: 1.75rem;
  box-sizing: border-box;
}

.nickname {
  flex: 1;
}

.message {
  flex: 4;
}

.s-button {
  flex: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div class="inputrow">
  <input type="text" class="nickname" placeholder="Nickname">
  <input type="text" class="message" placeholder="Message">
  <button type="submit" class="s-button">Submit</button>
</div>
Run Code Online (Sandbox Code Playgroud)

显示我期待的代码.(使用DIV代替inputbutton).

.inputrow {
  width: 30rem;
  display: flex;
  flex-flow: row nowrap;
  margin: 0 -.25rem;
}

.inputrow>* {
  margin: 0 .25rem;
  height: 1.75rem;
}

.nickname {
  flex: 1;
  background-color: blue;
}

.message {
  flex: 4;
  background-color: red;
}

.s-button {
  flex: 1;
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
<div class="inputrow">
  <div class="nickname">Nickname</div>
  <div class="message">Message</div>
  <div class="s-button">Submit</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 71

一种input元素,不像div,带有默认的宽度.

以下是此设置的简单说明:

在此输入图像描述

浏览器自动给出input宽度.

input {
  border: 1px solid blue;
  display: inline;
}

div {
  border: 1px solid red;
  display: inline;
}
Run Code Online (Sandbox Code Playgroud)
<form>
  <input>
  <br><br>
  <div></div>
</form>
Run Code Online (Sandbox Code Playgroud)

此外,flex项目的初始设置是min-width: auto.这意味着物品不能在主轴上收缩到其宽度以下.

因此,input元素不能收缩到其默认宽度以下,并且可能被迫溢出Flex容器.

您可以通过将输入设置为min-width: 0(修改后的codepen)来覆盖此行为

以下是一个完整的解释:为什么flex项目不会缩小内容大小?

在某些情况下,您可能需要使用width: 100%或覆盖输入宽度width: 0.

  • 最后,仅对输入本身使用“ width:0”即可解决此问题。在我的示例中无需```min-width:0```:https://jsbin.com/dokataxupa/edit?html,css,output (6认同)
  • 最小宽度就是这样!:d (4认同)
  • 我还必须将 `size="5"` 放在我的 `input` 上,因为我的浏览器似乎确保了至少 20 个字符的默认值是可见的,尽管有 `min-width: 0` 和 `flex-shrink: 1`。 (2认同)
  • `宽度:100% || 0` 在这里为我工作,但是 min-width: 0 没有。我猜想`[分钟|| max]-width` 和 `width` 本身在元素大小调整上有一个主要特征。Flex 紧随其后,基于这些价值观,添加其特性以提供灵活性等。奇怪的是,在这种情况下,“flex-basis”在宽度上没有任何流行,而在其他一些情况下,它却有。[CSS 令人敬畏]一些...哈哈 (2认同)
  • 使用 `min-width: 0` 让它根据需要缩小。使用“width: 100%”让它根据需要增长。 (2认同)

小智 11

我需要用样式元素包装输入元素,然后设置输入widthmin-width如下所示:

.field__input input {
  width: 0;
  min-width: 100%;
}
Run Code Online (Sandbox Code Playgroud)


oya*_*lhi 5

如果弹性框中有一个输入元素,您可以定义width: 0并且仍然可以使用flex: 1您需要的任何值。

\n

这是Christof K\xc3\xa4lin\在另一个答案的评论中的答案。把它放在这里是为了可见性。

\n

\r\n
\r\n
const\n  setValue = (btn, amount) => {\n    const input = btn.closest(\'.stepper\').querySelector(\'.stepper-val\');\n    input.value = +input.value + amount;\n  },\n  handleDecr = e => setValue(e.target, -1),\n  handleIncr = e => setValue(e.target, 1);\n\ndocument.querySelectorAll(\'.stepper\').forEach(s => {\n  s.querySelector(\'.stepper-minus\').addEventListener(\'click\', handleDecr);\n  s.querySelector(\'.stepper-plus\').addEventListener(\'click\', handleIncr);\n});
Run Code Online (Sandbox Code Playgroud)\r\n
html {\n  font-family: Arial, Helvetica, sans-serif;\n  /* font-size: 3vw; */\n}\n\nhtml, body, div, button, input {\n  box-sizing: border-box;\n}\n\n#atf {\n  height: 100vh;\n  /* flex-container */\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.stepper {\n  /* flex-container */\n  display: flex;\n  /* formatting */\n  width: 12rem;\n  height: 2rem;\n}\n\n.stepper-minus {\n  /* flex-item */\n  flex-grow: 1;\n  /* flex-container */\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  /* formatting */\n  background-color: deepskyblue;\n  border: 1px solid lightgray;\n  border-radius: .6rem 0 0 .6rem;\n  cursor: pointer;\n}\n\n.stepper-val {\n  /* flex-item */\n  flex-grow: 2;\n  /* flex-container */\n  text-align: center;\n  /* formatting */\n  border-top: 1px solid lightgray;\n  border-bottom: 1px solid lightgray;\n  border-left: none;\n  border-right: none;\n  width: 0;\n}\n\n.stepper-plus {\n  /* flex-item */\n  flex-grow: 1;\n  /* flex-container */\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  /* formatting */\n  background-color: deepskyblue;\n  border: 1px solid lightgray;\n  border-radius: 0 .6rem .6rem 0;\n  cursor: pointer;\n}\n\n.stepper>button:hover {\n  background-color: blue;\n}
Run Code Online (Sandbox Code Playgroud)\r\n
<div id="atf">\n  <div class="stepper">\n    <button class="stepper-minus">&minus;</button>\n    <input class="stepper-val" type="text" name="val" value="32">\n    <button class="stepper-plus">&plus;</button>\n  </div>\n</div>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

编辑:将此答案作为社区维基,这样我就不会获得不劳而获的荣誉。

\n