代码之家  ›  专栏  ›  技术社区  ›  Stickers

如何修复HTML5输入框高度不一致的问题?

  •  7
  • Stickers  · 技术社区  · 7 年前

    HTML5中引入了一些新的输入类型,如 <input type="date">

    目标是使下面列出的所有输入类型(包括submit按钮)都具有相同的高度。原因:

    • 与设计相匹配,尤其是水平布置时。
    • 灵活性,当我需要一些输入框有更大的字体大小。

    $("input").each(function() {
      h = $(this).outerHeight();
      $(this).parent().append(h);
    });
    input {
      font: inherit;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
      border: 1px solid silver;
      padding: 0.5rem;
      margin: 0;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>Input Heights</h1>
    <p><input type="text" placeholder="text"></p>
    <p><input type="search" placeholder="search"></p>
    <p><input type="tel" placeholder="tel"></p>
    <p><input type="url" placeholder="url"></p>
    <p><input type="email" placeholder="email"></p>
    <p><input type="datetime" placeholder="datetime"></p>
    <p><input type="date" placeholder="date"></p>
    <p><input type="month" placeholder="month"></p>
    <p><input type="week" placeholder="week"></p>
    <p><input type="time" placeholder="time"></p>
    <p><input type="datetime-local" placeholder="datetime-local"></p>
    <p><input type="number" placeholder="number"></p>
    <!-- <p><input type="range" placeholder="range"></p> -->
    <!-- <p><input type="color" placeholder="color"></p> -->
    <p><input type="submit" value="submit"></p>
    6 回复  |  直到 7 年前
        1
  •  8
  •   Temani Afif    7 年前

    enter image description here

    font-size line-height 这就有点棘手了。

    min-height 以匹配这些箭头的高度。经过几次测试,我们可以有相同的高度,如果我们设置 min-height:1.5em box-sizing:content-box content-box 确保其他输入的高度不会收缩。

    $("input").each(function() {
      h = $(this).outerHeight();
      $(this).parent().append(h);
    });
    input {
      font: inherit;
      vertical-align: middle;
      border: 1px solid silver;
      padding: 0.5rem;
      margin: 0;
      display:inline-block;
      min-height: 1.5em;
      box-sizing:content-box;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>Input Heights</h1>
    <p><input type="text" placeholder="text"></p>
    <p><input type="search" placeholder="search"></p>
    <p><input type="tel" placeholder="tel"></p>
    <p><input type="url" placeholder="url"></p>
    <p><input type="email" placeholder="email"></p>
    <p><input type="datetime" placeholder="datetime"></p>
    <p><input type="date" placeholder="date"></p>
    <p><input type="month" placeholder="month"></p>
    <p><input type="week" placeholder="week"></p>
    <p><input type="time" placeholder="time"></p>
    <p><input type="datetime-local" placeholder="datetime-local"></p>
    <p><input type="number" placeholder="number"></p>
    <!-- <p><input type="range" placeholder="range"></p> -->
    <!-- <p><input type="color" placeholder="color"></p> -->
    <p><input type="submit" value="submit"></p>

    然后我们可以调整 padding , 字体大小 , height 等等,它们将始终保持相同的高度:

    input {
      font: inherit;
      vertical-align: middle;
      border: 1px solid silver;
      padding: 0.5rem;
      margin: 0;
      display:inline-block;
      min-height: 1.5em;
      box-sizing:content-box;
    }
    .big input{
       padding:20px;
    }
    .small input{
       padding:2px;
    }
    .h-big input{
       height:50px;
    }
    .h-small input{
       height:10px;
    }
    <p><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    <p style="font-size:25px;"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    <p style="font-size:10px;"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    
    <p class="big"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    <p class="small"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    
    <p class="h-big"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
    <p class="h-small"><input type="text" placeholder="text"><input type="date" placeholder="date"></p>
        2
  •  2
  •   tao    7 年前

    正如李斯特先生所指出的, max-height min-height ,表示为 em ,似乎是你最好的选择。我经常在生产系统中使用它,没有任何投诉:

    function updateInputs() {
      $("input").each(function() {
        $('span', $(this).parent()).remove();
        $('<span />', {
          text: $(this).outerHeight()
        }).appendTo($(this).parent())
      });
    }
    $('#fontSizer').on('input', function() {
      $('body').css('font-size', $(this).val() + 'px');
      updateInputs();
    });
    $(window).on('load',updateInputs);
    body {
      font-size: 16px
    }
    
    input {
      font: inherit;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
      border: 1px solid silver;
      padding: 0.5rem;
      margin: 0;
      max-height: 2.25em;
      min-height: 2.25em;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    
    .fixed-top {
      background-color: rgba(255, 255, 255, .85);
      display: flex;
      align-items: center;
      justify-content: center;
      top: 0;
      width: 100%;
      left: 0;
      position: fixed;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>Input Heights</h1>
    <p><input type="text" placeholder="text"></p>
    <p><input type="search" placeholder="search"></p>
    <p><input type="tel" placeholder="tel"></p>
    <p><input type="url" placeholder="url"></p>
    <p><input type="email" placeholder="email"></p>
    <p><input type="datetime" placeholder="datetime"></p>
    <p><input type="date" placeholder="date"></p>
    <p><input type="month" placeholder="month"></p>
    <p><input type="week" placeholder="week"></p>
    <p><input type="time" placeholder="time"></p>
    <p><input type="datetime-local" placeholder="datetime-local"></p>
    <p><input type="number" placeholder="number"></p>
    <!-- <p><input type="range" placeholder="range"></p> -->
    <!-- <p><input type="color" placeholder="color"></p> -->
    <p><input type="submit" value="submit"></p>
    
    <div class="fixed-top">
      <input type="range" step="0.01" id="fontSizer" max="54" min="10" value="16">
    </div>

    注意:范围滑块仅更改 font-size <body>


    一个完全不同的方法是增加正常的填充值,使它们达到与具有微调器的大小相同的大小。我最接近体面的事就是

    :root {
      --input-padding: 0.5rem;
    }
    input {
      padding: calc(var(--input-padding) + .1475em) var(--input-padding);
      line-height: 1.225em
    }
    input[type="date" i], input[type="datetime-local" i], input[type="month" i], input[type="time" i], input[type="week" i] {
      padding: var(--input-padding)
    }
    

    函数updateInputs(){
    $(“输入”).each(function(){
    $('span',$(this.parent()).remove();
    $('<span/>'{
    }).appendTo($(this).parent())
    });
    }
    $('#fontSizer').on('输入',函数(){
    $('body').css('font-size',$(this).val()+'px');
    updateInputs();
    $(window).on('load',updateInputs);
    body {
      font-size: 16px
    }
    input {
      font: inherit;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
      border: 1px solid silver;
      margin: 0;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    
    .fixed-top {
      background-color: rgba(255, 255, 255, .85);
      display: flex;
      align-items: center;
      justify-content: center;
      top: 0;
      width: 100%;
      left: 0;
      position: fixed;
    }
    :root {
      --input-padding: 0.5rem;
    }
    input {
      padding: calc(var(--input-padding) + .1475em) var(--input-padding);
      line-height: 1.225em
    }
    input[type="date" i], input[type="datetime-local" i], input[type="month" i], input[type="time" i], input[type="week" i] {
      padding: var(--input-padding)
    }
    <<h1>输入高度</h1>
    <p>&书信电报;输入type=“tel”placeholder=“tel”></p>
    <p>&书信电报;输入type=“url”placeholder=“url”></p>
    <p>&书信电报;输入type=“email”placeholder=“email”></p>
    <p>&书信电报;输入type=“date”placeholder=“date”></p>
    <p>&书信电报;输入type=“month”placeholder=“month”></p>
    <p>&书信电报;输入type=“time”placeholder=“time”></p>
    <p>&书信电报;输入type=“number”placeholder=“number”></p>
    <!--&书信电报;p>&书信电报;输入type=“range”placeholder=“range”></p>--&燃气轮机;
    <!--&书信电报;p>&书信电报;输入type=“color”placeholder=“color”></p>--&燃气轮机;
    <p>&书信电报;输入type=“submit”value=“submit”></p>
    
    <div class=“固定顶”>
    <输入type=“range”step=“0.01”id=“fontSizer”max=“54”min=“10”value=“16”>
    </部门>

    然而,这并不完美。这些误差不是线性的,我怀疑其中涉及到一些舍入。有时在上面,有时在下面。

        3
  •  1
  •   Yukulélé    7 年前

    在中定义高度(和填充) em 单位,在这种情况下输入的高度将跟随字体大小

    $("input").each(function() {
      var span = $('<span>');
      $(this).parent().append(span);
      setInterval(() => span.text($(this).outerHeight()), 100);
    });
    $('#button').on('click', function(){
      $('form').css('font-size', 10 + Math.random() * 15);
    });
    input {
      font: inherit;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
      border: 1px solid silver;
      margin: 0;
    
      padding: 0.5em;
      height: 2.5em;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>Input Heights</h1>
    <button id="button">change font size</button>
    <form>
    <p><input type="text" placeholder="text"></p>
    <p><input type="search" placeholder="search"></p>
    <p><input type="tel" placeholder="tel"></p>
    <p><input type="url" placeholder="url"></p>
    <p><input type="email" placeholder="email"></p>
    <p><input type="datetime" placeholder="datetime"></p>
    <p><input type="date" placeholder="date"></p>
    <p><input type="month" placeholder="month"></p>
    <p><input type="week" placeholder="week"></p>
    <p><input type="time" placeholder="time"></p>
    <p><input type="datetime-local" placeholder="datetime-local"></p>
    <p><input type="number" placeholder="number"></p>
    <!-- <p><input type="range" placeholder="range"></p> -->
    <!-- <p><input type="color" placeholder="color"></p> -->
    <p><input type="submit" value="submit"></p>
    </form>
        4
  •  0
  •   Jamie Barker    7 年前

    您可以设置线条高度:

    input {
      vertical-align: top;
      line-height: 22px;
    }
    <input type="text">
    <input type="date">
        5
  •  0
  •   Bryce Howitson    7 年前

    移除任何垂直填充并添加 max-height 然后将垂直衬垫更换为 line-height (请确保指定单位,空白是百分比)。

    box-sizing: border-box 将修复大多数输入。

    <button> 是唯一的问题。文本与底部垂直对齐。我似乎无法改变。我相信这些元素的默认浏览器样式是个问题,但是 appearance: none 似乎没有帮助。

    也许有人能改进一下?

    $("input").each(function() {
      h = $(this).outerHeight();
      $(this).parent().append(h);
    });
    input, button {
      font: inherit;
      display: inline-block;
      vertical-align: middle;
      box-sizing: border-box;
      border: 1px solid silver;
      padding: 0;
      margin: 0;
      line-height: 50px;
      max-height: 36px;
    }
    
    [type="search"] {
      -webkit-appearance: textfield;
    }
    
    button,
    [type="button"],
    [type="reset"],
    [type="submit"] {
      background-color: silver;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <h1>Input Heights</h1>
    <p><input type="text" placeholder="text"></p>
    <p><input type="search" placeholder="search"></p>
    <p><input type="tel" placeholder="tel"></p>
    <p><input type="url" placeholder="url"></p>
    <p><input type="email" placeholder="email"></p>
    <p><input type="datetime" placeholder="datetime"></p>
    <p><input type="date" placeholder="date"></p>
    <p><input type="month" placeholder="month"></p>
    <p><input type="week" placeholder="week"></p>
    <p><input type="time" placeholder="time"></p>
    <p><input type="datetime-local" placeholder="datetime-local"></p>
    <p><input type="number" placeholder="number"></p>
    <!-- <p><input type="range" placeholder="range"></p> -->
    <!-- <p><input type="color" placeholder="color"></p> -->
    <p><input type="submit" value="submit"></p>
    <p><button>submit</button>
        6
  •  -1
  •   Gust van de Wal user41410    7 年前

    您不仅需要设置元素高度,还需要设置字体大小

    input{
        height: 1em;
        font-family: Arial;
        font-size: 1em;
        font-size-adjust: 1;
        padding-top: 0.1em;
        padding-bottom: 0.1em;
    }
    

    https://jsfiddle.net/rahulsalvi2k7/50otuem2/

    推荐文章