【问题标题】:How to create an input and button on the same line in Bootstrap 3.4?如何在 Bootstrap 3.4 的同一行上创建输入和按钮?
【发布时间】:2019-11-15 16:13:52
【问题描述】:

我看到了一些与此类似的问题,但是,我认为这些问题中提供的答案都没有暗示我正在寻找的正确方向。

我要创建的是同一行上的输入和按钮。输入总是需要尽可能多的空间,不管它的父元素有多大或多小。调整屏幕大小时,输入和按钮元素仍应保持内联(即响应式)。结果应该是这样的:

这些是我能想出的可能答案,但这些都不是我想要的:

<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="container">
  <br />
  <div class="row">
    <div class="col-md-12">
      <div class="panel panel-default">
        <div class="panel-body">
          <p>
            Not like this please:
          </p>
          <div class="form-group">
            <label for="exampleInputLabel1">Label</label>
            <input type="text" class="form-control" id="exampleInputText1" placeholder="Your value">
          </div>
          <button type="submit" class="btn btn-default">Action</button>
          <hr style="border-color: #ddd;" />
          <p>
            Also not like this please:
          </p>
          <div class="form-inline">
            <div class="form-group">
              <label for="exampleInputLabel2">Label</label>
              <input type="text" class="form-control" id="exampleInputLabel2" placeholder="Your value">
            </div>
            <div class="form-group">
              <label for="exampleInputLabel3">Label</label>
              <input type="email" class="form-control" id="exampleInputEmail2" placeholder="Your value">
            </div>
            <button type="submit" class="btn btn-default">Action</button>
          </div>
          <hr style="border-color: #ddd;" />
          <p>
            Or also not this:
          </p>

          <div class="input-group">
            <input type="text" class="form-control" placeholder="Your value">
            <span class="input-group-btn">
              <button class="btn btn-default" type="button">Action</button>
            </span>
          </div>
        </div>
        <!--panel-body end-->
      </div>
    </div>
  </div>
</div>

也许我可以使用 flexbox,但如果其他人可以通过将我引导到适当的解决方案来帮助我,我会非常有兴趣了解与此相关的任何事情。

我已经检查过的一些问题:

【问题讨论】:

  • 为什么不将它们包装成列,一个.col-xs-9 和一个.col-xs-3 用于按钮,即使在移动设备上它也会内联它们并适应父宽度。虽然,从列填充来看,它们之间可能存在一些中等差距。
  • 是的,我也想过这样做@darklightcode,但正如你所说,填充是非常不需要的。此外,当按钮的内容文本大于列时,内容将无法很好地对齐。

标签: html css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

有很多方法可以做到这一点。首先,我建议您使用 Bootstrap 4,因为它有更多有用的类并使用 flexbox。此外,请考虑将 js 放在 &lt;/body&gt; 标记之前,以便更好地加载页面,正如 Bootstrap 文档所建议的那样:

将以下&lt;script&gt;s 放在页面末尾附近,就在前面 结束标记,以启用它们。 jQuery必须先来,然后 Popper.js,然后是我们的 JavaScript 插件。

Bootstrap 3(带有自定义类):

.my-flex {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
  }

  .my-flex .input-container {
    flex-grow: 1;
  }

  .my-flex button {
    margin-left: 10px;
  }
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
  <div class="container">
    <br />
    <div class="row">
      <div class="col-md-12">
        <div class="panel panel-default">
          <div class="panel-body">
            <div class="form-group my-flex">
              <div class="input-container">
                <label for="exampleInputLabel1">Label</label>
                <input type="text" class="form-control" id="exampleInputText1" placeholder="Your value">
              </div>
              <button type="submit" class="btn btn-default">Fire this button</button>
            </div>

          </div>
          <!--panel-body end-->
        </div>
      </div>
    </div>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</body>
</html>

另一种解决方案:

  .my-flex .input-container {
    flex-basis: calc(100% - 75px);
  }

这个flex-basis: calc(100% - 75px) 表示输入将占用所有可用空间减去按钮宽度(+边距)。

另一种解决方案:

  .my-flex .input-container {
    flex-basis: 85%;
  }

  .my-flex button {
    flex-basis: 15%;
    margin-left: 10px;
  }

引导程序 4:

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
</head>
<body>
  <div class="container">
    <br />
    <div class="row">
      <div class="col-md-12">
        <div class="card">
          <div class="card-body">
            <div class="form-row align-items-end">
              <div class="form-group col">
                <label for="exampleInputLabel1">Label</label>
                <input type="text" class="form-control" id="exampleInputText1" placeholder="Your value">
              </div>

              <div class="form-group col-auto">
                <button type="submit" class="btn btn-light">Action</button>
              </div>
            </div>
          </div>
          <!--panel-body end-->
        </div>
      </div>
    </div>
  </div>

  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
</body>
</html>

【讨论】:

  • SO sn-ps 按照我提供的示例中所示的方式自动处理脚本。它的目的是使脚本在大多数情况下不相关,并使代码尽可能少(有关更多信息,请参阅minimal reproducible example)。我的问题首先与页面加载无关(尽管指出它仍然很棒!)。另外,选择 Bootstrap 3 还是 Bootstrap 4 的决定权不在于我,所以我必须用我所拥有的。否则,我不会专门要求 Bootstrap 3。
  • 我看到您正在使用 75px 从 flex-basis 宽度中删除(按钮宽度)。按钮宽度是可变的(任何文本值都可以在里面,我只是以“动作”这个词为例)所以我认为硬编码这似乎是一个令人讨厌的选择。如果我把flex-basis: calc(100% - 75px)的75px去掉,好像不会影响最终的外观?
  • 对于您的第一条评论,我只是提到它,请记住 :) 。对于第二条评论,例如,您可以在按钮上设置 flex-basis 18%,在输入容器上设置 80%。但是你应该在移动设备上包装元素。
  • 您的意思是在按钮上设置 flex-basis 18% 吗?这是否意味着您正在尝试在按钮上设置固定宽度?我的问题的目标不是设置固定宽度。我想在按钮中输入任何类型的文本,按钮应该根据它的值增长或缩小(默认情况下它会这样做而不添加任何 CSS),它左侧的输入应该根据如何增长或缩小之后剩下很多空间。 flex-basis: calc(100%) 仅仅做到这一点还不够吗?或者甚至是width: 100% 上的.my-flex .input-container
  • 弹性增长:1;是你需要的(输入容器)。请查看我的编辑。
【解决方案2】:

创建一个 div,作为父 div 或 2 个具有固定宽度的其他 div 的行。

  • .inline-form 包含 2 个 div; .input-container.button-container

  • .input-container 具有 display:inline-block 和 80% 的固定宽度。

  • .button-container 有 display:inline-block 和一个 20%-1px 的固定宽度。

  • 将两个 div 都设置为 float:left,这会将它们限制在特定的行中。

  • .input-container 上添加padding-right 作为输入和按钮之间的空间。

.inline-form {
  width: 100%;
  display: block;
}

.inline-form>div {
  float: left;
}

.inline-form .input-container {
  display: inline-block !important;
  width: 80% !important;
  padding-right: 5px;
}

.inline-form .button-container {
  display: inline-block !important;
  width: calc(20% - 1px) !important;
}

.inline-form .button-container button {
  width: 100%;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="container">
  <br />
  <div class="row">
    <div class="col-md-12">
      <div class="panel panel-default">
        <div class="panel-body">
          <div class="form-group">
            <label for="exampleInputLabel1">Label</label>
            <div class="inline-form">
              <div class="input-container">
                <input type="text" class="form-control" id="exampleInputText1" placeholder="Your value">
              </div>
              <div class="button-container">
                <button type="submit" class="btn btn-default">Action</button>
              </div>
            </div>
          </div>
        </div>
        <!--panel-body end-->
      </div>
    </div>
  </div>
</div>

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多