【问题标题】:CSS - Exact same height and alignment of button and input text boxCSS - 按钮和输入文本框的高度和对齐方式完全相同
【发布时间】:2011-10-07 06:08:16
【问题描述】:

我需要一个按钮和一个 tex 框并排放置,它们必须完美对齐,好像一个比另一个大,然后它会立即引人注目。

通常我不会担心浏览器之间的微小差异,但这两个输入在每个页面上都处于非常突出的位置,并且是网站的一大特色,因此它们必须在所有主要浏览器和缩放级别中完美对齐。

有没有人对如何实现这一点有任何建议。

作为我想要实现的目标的一个简单示例:新的谷歌主页。开始输入后,自动完成功能启动,搜索框移动到顶部,蓝色按钮与文本框完美对齐。它可以完美地跨浏览器工作,但它在表格中标记。这是否表明这可能是实现这一目标的最佳方式?

【问题讨论】:

  • 嗨 - 尝试了很多不同的东西,我试图将任何额外的标记保留到一个最小值,所以理想情况下它应该是一个带有标签的表单、一个输入框和一个带有提交类型的按钮.
  • 您也可以尝试在新的User Experience beta site 上提问。
  • @David,是的:但是您已经使用标记了吗?我们在做什么;了解您已经掌握的内容有助于我们提供更好的答案并为您提供更好的帮助。
  • 如果您提供带有示例代码的jsFiddle demo,并准确说明您需要高度/对齐方式保持一致的浏览器/版本,我会试一试。
  • 如果问题是 Firefox,这个答案为我解决了它:stackoverflow.com/a/12734594/970551

标签: css forms cross-browser


【解决方案1】:

我建议尝试设置input/button 配对的父元素的样式(在我的示例中为fieldset),以便给出一个共同的font-sizefont-family,然后使用em 测量子元素的样式尺寸/填充/边距。理想情况下,所有子元素的样式都使用相同的 CSS。

鉴于以下标记:

<form action="#" method="post">
    <fieldset>
        <label for="something">A label for the text-input</label>
        <input type="text" name="something" id="something" />
        <button>It's a button!</button>
    </fieldset>
</form>

我会建议一些类似的东西,但要适应您的特定设计,采用以下 CSS:

fieldset {
    font-size: 1em;
    padding: 0.5em;
    border-radius: 1em;
    font-family: sans-serif;
}

label, input, button {
    font-size: inherit;
    padding: 0.2em;
    margin: 0.1em 0.2em;
    /* the following ensures they're all using the same box-model for rendering */
    -moz-box-sizing: content-box; /* or `border-box` */
    -webkit-box-sizing: content-box;
    box-sizing: content-box;
}

JS Fiddle demo.


在澄清这是为了复制/复制 Google 相邻的文本输入/提交按钮的样式之后:
fieldset {
    font-size: 1em;
    padding: 0.5em;
    border-radius: 1em;
    font-family: sans-serif;
    border-width: 0;
}

label, input, button {
    font-size: inherit;
    padding: 0.3em 0.4em;
    margin: 0.1em 0.2em;
    -moz-box-sizing: content-box;
    -webkit-box-sizing: content-box;
    box-sizing: content-box;
    border: 1px solid #f90;
    background-color: #fff;
}

input {
    margin-right: 0;
    border-radius: 0.6em 0 0 0.6em;
}
input:focus {
    outline: none;
    background-color: #ffa;
    background-color: rgba(255,255,210,0.5);
}
button {
    margin-left: 0;
    border-radius: 0 0.6em 0.6em 0;
    background-color: #aef;
}
button:active,
button:focus {
    background-color: #acf;
    outline: none;
}

JS Fiddle demo.

尽管上述方法在 Chromium 12.x 和 Opera 11.5 (Ubuntu 11.04) 中运行良好,但 Firefox 在后面的演示中似乎显示了一两个额外的像素。

【讨论】:

  • 非常感谢您在这方面的时间,但您遇到的问题与我完全相同。鉴于表单元素的重要性,它必须在每个主要浏览器中都是完美的。我是一个相当有经验的开发人员,所以知道让表单元素表现出来是多么困难,并且可以在一定程度上做到这一点,只是这些元素需要始终 100% 完全对齐。
  • 哇,这是解决问题的最简单的 CSS 解决方案“一个按钮和一个 tex 框并排放置,它们必须完美对齐”
【解决方案2】:

我认为这是非常防弹的:

http://codepen.io/herrfischer/pen/pbkyoJ

在这两个元素上只使用:

display: inline-block;
padding: 10px 15px;
font-size: 20px;
border-radius: 0;
-webkit-appearance: none;
border: 1px solid transparent;

并使用“normalize.css”——仅此而已。在 iPhone 上看起来也不错:

【讨论】:

    【解决方案3】:

    为了实现这一目标,我已经努力了好几个小时。经过大量研究和实验,以下是解决(至少是当代版本)Chrome、Firefox、IE、Opera 和 Safari 中 OP 问题的秘诀:

    1. 对所有需要对齐的节点类型(按钮、输入、选择)使用与框模型相同的 CSS;
    2. 务必明确指定边框(或至少指定其宽度);
    3. 请勿明确指定高度。

    是的,仅此而已。这是产生所需结果的最简约的 CSS:

    select, input, button {
        border-width: 0px;
    }
    

    如果您需要进一步的样式,请随意添加颜色、填充和边距 - 一切都会好起来的。但是,无论您做什么,都不要明确指定高度。这是唯一的交易破坏者,因为每个浏览器计算高度的方式不同;有些会在选择而不是按钮上方留下一两个额外的像素,有些会在按钮而不是选择上方留下一两个像素,有些会按预期工作。

    根据记录,Chrome 在这方面似乎是最一致的(也就是说,如果您确实指定了高度)——但话又说回来,谁在乎呢。

    【讨论】:

    • 感谢您的反馈——但如果您要提供反馈,请用几句话解释究竟是什么不工作(什么类型的元素在什么浏览器上)。
    • 很好的提示。要在不同的浏览器/平台上获得完全相同的高度,需要指定输入和选择的高度(当然是在 em 中),而不是按钮和链接(a 元素)。
    • 我可以指定填充吗?他们的?
    【解决方案4】:

    在 2019 年,您希望在表单中使用 CSS Grid,即使它们只有一个输入和一个按钮。

    这样可以减轻很多痛苦。

    我的工作示例有很多工作要做,所以我不会在这里发布工作示例。相反,这里有你需要知道的事情。

    外层容器可以是form,CSS为display: grid; grid-template-rows: 2em; grid-template-columns: 1fr auto;

    输入应该有一个标签,我假设它被设置为隐藏。所以输入的CSS有grid-column: 1; height: 100%;按钮有grid-column: 2; height: 100%

    您将使用边距、背景、填充、边框、边框半径等来做自己的事情。

    让按钮与输入对齐的关键是网格行在 ems 或其他敏感的响应友好单元中具有固定高度,并且输入和按钮设置为 100% 的高度。

    我没有发现任何上述答案可以像 CSS Grid 选项一样简洁和易于管理,该选项适用于 Firefox、Chrome 和基于 Webkit 的浏览器。

    请注意,如果使用 CSS Grid,那么您的表单中需要精确为零的 div 元素,但是,如果使用字段集,您可能需要将它们设置为 display: content,因为 CSS Grid 不适用于 fieldset

    【讨论】:

      【解决方案5】:

      我已经检查了 WEB 中的许多资源,如何做到最好、跨浏览器、独立于主题。我希望我有解决方案,它不是 100%(它需要通过垂直 CSS 填充来修剪)。我的问题是标签和文本输入具有相同的宽度和紧凑度

      希望的结果: 通过几次实验找到的解决方案在我的博客中描述:http://vasvadev.blogspot.cz/2013/02/css-exact-same-height-and-alignment-of.html

      解决方案 CSS:

      div.lf-ui-label {
        margin: 0px;
        font-size: inherit;
        font-weight: bold;
        background-color: #CCCCCC;
        border-width: 0px;
        display: inline-block;
        vertical-align: middle;
        overflow: hidden;
        padding-top: 4px;
        padding-bottom: 4px;
      }
      div.lf-ui-label + input.lf-ui-form-item {
        padding: 5px 10px 5px 10px;
        margin: 0px 0px 0px -10px;
        font-size: inherit;
        background-color: #2b55a8 !important;
        vertical-align: middle;
        border-width: 0px;
      }
      input.lf-ui-form-item {
        background-color: #3b3b3b;
        font-size: inherit;
        padding: 4px 7px 4px 7px;
        font-weight: bold;
        border: none 0px;
        outline: none;
      }
      

      HTML:

      <div style="padding:10px; font-family: Calibri; font-size: 14px;">
         <div class="lf-ui-label" 
          style="width:25%; padding-left: 10px;">Field text 14px&nbsp;</div><input 
          class="lf-ui-form-item" type="text" id="fr" name="fr" value="some value"      style="width:71%" />
      </div>
      <div  style="padding:10px; font-family: Calibri; font-size: 14px;">
        Field text <input class="lf-ui-form-item" type="text" value="some other value"/>
      </div>
      

      我的实验代码由 JSFIDDLE 共享:css-exact-same-height-and-alignment-of.html

      【讨论】:

        【解决方案6】:

        我试图解决这个问题好几天了,但每个解决方案都不完整,并且不能在不同的浏览器中工作。

        我发现这段代码可以工作:

        float: left;
        -webkit-box-sizing:border-box;
        -moz-box-sizing:border-box;
        box-sizing:border-box;
        height: 33px;
        

        我已经更新了 Fiddle - https://jsfiddle.net/p9maozk2/

        【讨论】:

          【解决方案7】:

          您的另一个选择是使用 Bootstrap。我通过将类“input-group”分配给包装输入和按钮的 div 来解决这个问题。

          【讨论】:

            【解决方案8】:

            当尝试以跨浏览器的方式实现像素完美尺寸时,您应该做的第一件事是考虑实现 CSS 重置。我更喜欢HTML5 Boilerplate,但你可以通过谷歌搜索找到其他的。

            CSS 重置对于规范跨浏览器差异非常重要(尤其是在处理表单时)。

            【讨论】:

            • @David 你有一个好的开始。下一个合乎逻辑的步骤将是实现@madflow 的使用 IE 条件类的建议,或者为 IE 提供替代样式表(再次使用条件类)。但是,如果您需要任何进一步的指导或帮助,您需要使用代码更新您的问题,并让我们知道您在使用特定浏览器时遇到了什么问题。
            【解决方案9】:

            对于 IE:您可以使用条件样式表来设置不同的样式:

            <!--[if lt IE 7]> <html class="ie6" lang="en"> <![endif]-->
            <!--[if IE 7]>    <html class="ie7e" lang="en"> <![endif]-->
            <!--[if IE 8]>    <html class="ie8" lang="en"> <![endif]-->
            <!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]-->
            

            所以你会写:

            .ie6 .my-button-class {
              //
            }
            

            【讨论】:

              【解决方案10】:

              现在尝试这样做的任何人我发现这个解决方案似乎有效。尝试添加:

                -webkit-box-sizing:border-box;
                -moz-box-sizing:border-box;
                box-sizing:border-box;
              

              到您当前的css 两个元素上仍然会使它们稍微未对齐,然后在未对齐的元素中使用顶部填充。我发现:

              padding-top: 2px;
              

              为我工作。

              【讨论】:

                【解决方案11】:

                使用带有图像的背景 div 作为输入。这更容易保持一致。此外,绝对定位也适合这种情况。

                编辑:我在 5 年前写了这个答案,现在有更好的方法。

                【讨论】:

                  【解决方案12】:

                  .sdiv {
                  padding-top: 33px;
                  padding-left: 33px;
                  height: 123px;
                  border: 1px dotted red;
                  border-radius: 7px;
                  background-color: Black;
                  }
                  
                  .sbtn {
                  float:left;
                  height:24px;
                  width: 24px;
                  padding: 3px 0 0 0;
                  border:none;
                  margin-top: 14px;
                  background-color: white;
                  }
                  
                  .stxt {
                  width: 180px;
                  height:22px;
                  float:left;
                  border:none;
                  padding-left:3px;
                  margin-top: 14px;
                  }
                  <div class="sdiv">
                  <form action="/">
                  
                  <input class="stxt" type="text" placeholder="Search..." value="">
                  
                  <button class="sbtn" type="submit">
                  <svg xmlns="http://www.w3.org/2000/svg" role="icon" viewBox="0 0 18 18" width="18" height="18">
                  <path fill-rule="evenodd" d="M 12.864 11.32 h -0.813 l -0.288 -0.277 A 6.66 6.66 0 0 0 13.38 6.69 a 6.69 6.69 0 1 0 -6.69 6.69 a 6.66 6.66 0 0 0 4.354 -1.617 l 0.278 0.288 v 0.813 L 16.467 18 L 18 16.467 l -5.136 -5.146 Z m -6.174 0 a 4.625 4.625 0 0 1 -4.632 -4.63 A 4.625 4.625 0 0 1 6.69 2.058 a 4.625 4.625 0 0 1 4.63 4.632 a 4.625 4.625 0 0 1 -4.63 4.63 Z" />
                  </svg>
                  </button>
                  
                  </form>
                  </div>

                  所有优秀的答案!但没有一个是我真正想要的......

                  我从更直接的方法中获得了更多的满足:

                  【讨论】:

                    猜你喜欢
                    • 2015-08-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-11-24
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多