代码之家  ›  专栏  ›  技术社区  ›  Ramon de Klein

如何使用CSS网格对齐嵌套HTML中的列

  •  0
  • Ramon de Klein  · 技术社区  · 6 年前

    我需要使用网格,但我的列不是网格的直接子项。网格有两列:

    1. 第2列包含输入框。

    标签列应与最大列一样大(但不大于)。输入列应使用所有剩余空间。我尝试了以下CSS/HTML组合。

    * {
      border: 1px solid black;
      background: #2222;
    }
    
    .container {
      display: grid;
      width: 550px;
      grid-gap: 10px;
      grid-template-rows: [a] auto [b] auto [c] auto;
      grid-template-columns: [label] auto [input] 1fr;
      align-items: stretch;
    }
    
    label { grid-column-start: label; }
    input { grid-column-start: input; }
    
    .a { grid-row-start: a; }
    .b { grid-row-start: b; }
    .c { grid-row-start: c; }
    <div class="container">
      <div class="a">
        <label>A</label>
        <input>
      </div>
      <div class="b">
        <label>Label B</label>
        <input>
      </div>
      <div class="c">
        <label>Longest C label</label>
        <input>
      </div>
    </div>

    我知道 grid-column-start

    使用多个网格(每行一个)可以,但我需要同步第一列的宽度。我读过 subgrids ,但它还没有被任何主流浏览器实现。我是否有其他办法来解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Temani Afif    6 年前

    * {
     box-sizing:border-box;
    }
    .container {
      display: table;
      width: 550px;
      border:1px solid;
    }
    
    .container>div {
      display: table-row;
    }
    
    label,
    input {
      display: table-cell;
      border:1px solid green;
    }
    label {
      width:5%; /*a small value*/
      white-space:nowrap;
    }
    input {
     width:100%;
    }
    <div class="container">
      <div class="a">
        <label>A</label>
        <input>
      </div>
      <div class="b">
        <label>Label B</label>
        <input>
      </div>
      <div class="c">
        <label>Longest C label</label>
        <input>
      </div>
    </div>
        2
  •  1
  •   TWS    4 年前

    如果 the browser support 对你来说已经足够了,还有 display: contents 从呈现中“排除”包装器元素并仅显示其内容(类似于 display: none

    * {
      border: 1px solid black;
      background: #2222;
    }
    
    .container {
      display: grid;
      width: 550px;
      grid-gap: 10px;
      grid-template-rows: [a] auto [b] auto [c] auto;
      grid-template-columns: [label] auto [input] 1fr;
      align-items: stretch;
    }
    
    label { grid-column-start: label; }
    input { grid-column-start: input; }
    
    .a { grid-row-start: a; display: contents; }
    .b { grid-row-start: b; display: contents; }
    .c { grid-row-start: c; display: contents; }
    <div class="container">
      <div class="a">
        <label>A</label>
        <input>
      </div>
      <div class="b">
        <label>Label B</label>
        <input>
      </div>
      <div class="c">
        <label>Longest C label</label>
        <input>
      </div>
    </div>