【问题标题】:Width of textarea and input is different when wrapping in flexbox column在 flexbox 列中换行时,textarea 和 input 的宽度不同
【发布时间】:2020-10-09 04:30:15
【问题描述】:

我尝试通过使用包装的 flexbox 将 texarea 包装到“第二列”中来设置多列联系表单。我希望 textarea 与文本输入的宽度相同。实际上,文本输入(第一列)比文本区域(第二列)宽。在我在 codepen 上创建的示例中,不同之处在于,例如12 像素。

在下面的示例中,文本区域比字段集宽。在这个例子中,texarea(和提交按钮)比文本输入宽 10px,分别是字段集。为什么一个元素被包裹在 flexbox 中时比另一个更宽?

在代码中单个元素不能高于整个弹性盒的max-height

* {
  box-sizing: border-box;
}

form {
  display: flex;
  flex-flow: column wrap;
  max-height: 116px;
}

input[type=text] {
  min-width: 0;
  padding: 0;
  margin: 0;
  min-width: 0;
  margin-bottom: 1em;
  display: block;
  width: 100%
}

fieldset {
  padding: 0;
  margin: 0;
}

textarea {
  min-height: 50px;
  max-height: 84px;
  min-width: 0;
  resize: vertical;
}


textarea, input[type="submit"] {
  padding: 0;
  margin: 0;
}
<form action="/doit" method="post">
    <fieldset>
        <input type="text" value="Text">
        <input type="text" value="Text">
        <input type="text" value="Text">
        <input type="text" value="Text">
    </fieldset>
    <textarea>I am wider than the fieldset.</textarea>
    <input type="submit" />
</form>

我在 Safari (Mojave) 和 Chrome 85 中尝试过。

谁能告诉我是什么导致了这种行为?

【问题讨论】:

  • 你试过在inputtextareamedium.com/developedbyjohn/equal-width-flex-items-a5ba1bfacb77上使用flex-grow:1
  • 您希望它们彼此相邻吗?因为它在你的 codepen 链接中是这样的
  • @Awais 据我所知,如果我不想实现不同的 flow-grow 行为,我不必提供任何 flex-grow。顺便说一句,是的,我已经尝试过了。谢谢! :)
  • @ModusTollens 很抱歉打扰您。我的意思是现在伤害。当我想在这里回答我的问题时,有人告诉我我应该更新我原来的问题,而不是回答我自己的问题。 “后续问题”是指一个全新的问题?感谢您的帮助。
  • @ModusTollens 是的,我已经注意到,十多年来,除了阅读问题和相应的答案之外,提出问题完全是另一种野兽。谢谢你的支持。 :)

标签: html css flexbox


【解决方案1】:

问题仍然存在于您的代码中。您已将formmax-height 设置为116px(这次)。 input 元素和textarea 的高度之和肯定会比116px 增长更多,因为你的flex-wrapwrap,它会变成一行。所以你不应该期望它们的宽度相等。

如果您希望文本输入大小相等且彼此相邻,则必须使用flex-direction: row。您的代码可能类似于:

* {
  box-sizing: border-box;
}

form {
  display: flex;
  flex-flow: row wrap;
  
}

input[type=text] {
  min-width: 0;
  padding: 0;
  margin: 0;
  min-width: 0;
  margin-bottom: 1em;
  display: block;
  width: 100%
}

fieldset {
  flex:1;
  padding: 0;
  margin: 0;
}

.textarea {
  min-height: 50px;
  max-height: 84px;
  min-width: 0;
  resize: vertical;
}
.submit{
  align-self:center;
}

textarea, input[type="submit"] {
  padding: 0;
  margin: 0;
}

div{
  flex:1;
  display:flex;
  flex-direction:column;
}
<form action="/doit" method="post">
    <fieldset>
        <input type="text" value="Text">
        <input type="text" value="Text">
        <input type="text" value="Text">
        <input type="text" value="Text">
    </fieldset>
    <div >
      <textarea class="textarea">I am wider than the fieldset.</textarea>
      <input class="submit" type="submit" />
    </div>
</form>

请注意,我已将您的 textarea 和按钮包装在 &lt;div&gt; 中,使其成为 form 元素的子元素,并给它一个 flex:1。然后将 &lt;div&gt; 本身设为垂直弹性框。

【讨论】:

  • 再次感谢 Omid 为我提供的帮助。我知道我可以像您一样解决这个特定问题。但是a)我想保留额外的div b)我不明白为什么宽度不以相同的值结尾。如果您尝试使用两个 divs 并包裹它们,您将获得完全相同的宽度。有什么解释为什么使用textarea 结合文本输入会发生这种行为,但使用divs 不会发生这种行为?我知道这是一个相当理论的讨论,但我无法向自己解释。
  • @MarcelKoch 我已经回答了为什么会这样!您的 flexbox 的最大高度设置为 116px,其中的元素无法适应该高度,因此它们必须位于两列中,但不能保证它们的宽度大小相同。请注意,您的&lt;input&gt;s 的宽度设置为 100%,这在某种程度上是模棱两可的。因为这意味着元素的父元素(flexbox)的全宽,但它不会发生,因为某些宽度被&lt;textarea&gt; 占用。我会给你一个有用的链接:developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
相关资源
最近更新 更多