【问题标题】:Align child elements of different blocks对齐不同块的子元素
【发布时间】:2021-08-17 00:18:37
【问题描述】:

我有一份商品清单。我需要在二维列表中显示它们。每个商品都有子元素:照片、标题、描述、价格和购买按钮,它们的大小和位置必须以这种方式:商品行中的所有标题、描述、价格和照片必须位于相同的 y 坐标位置,并且具有高度为一行中对应高度元素的最大值。

我试过这个:“grid-template-rows: 1fr 1fr 1fr 1fr 30px;”使一行中的所有子元素都处于相同的 y 位置,但我需要它们的高度以适应内容并且不高于一行中的最大元素。 附言您可以使用 flex 或任何您想要的方式提供代码。

代码

.Grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat( auto-fill, 280px);
}

.loon-card {
  grid-template-rows: 1fr 1fr 1fr 1fr 30px;
  display: grid;
  grid-gap: 10px;
  border: 1px solid #ddd;
  padding: 10px;
}

.long-description {
  border-top: 1px solid #ddd;
}
<div class="Grid">

  <div class="loon-card">
    <img src="">
    <div class="short-description">
      Title:1
      <br/>Title:2
      <br/>Title:3
      <br/>Title:4
    </div>
    <div class="long-description">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
    </div>
    <div class='price'>12.00$</div>
    <button>buy</button>
  </div>

  <div class="loon-card">
    <img src="">
    <div class="short-description">
      Title:1
      <br/>Title:2
      <br/>Title:3
      <br/>Title:4
      <br/>Title:5
      <br/>Title:6
      <br/>Title:7
      <br/>Title:8
      <br/>Title:9
      <br/>Title:10
      <br/>Title:2
      <br/>Title:3
      <br/>Title:4
      <br/>Title:5
      <br/>Title:6
      <br/>Title:7
      <br/>Title:8
      <br/>Title:9
      <br/>Title:10

    </div>
    <div class="long-description">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
    </div>
    <div class='price'>12.00$</div>
    <button>buy</button>
  </div>

  <div class="loon-card">
    <img src="">
    <div class="short-description">
      Title:1
      <br/>Title:2
      <br/>Title:3
      <br/>Title:4
    </div>
    <div class="long-description">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
    </div>
    <div class='price'>14.00$</div>
    <button>buy</button>
  </div>

  <div class="loon-card">
    <img src="">
    <div class="short-description">
      Title:1
      <br/>Title:2
      <br/>Title:3
      <br/>Title:4
    </div>
    <div class="long-description">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
    </div>
    <div class='price'>15.00$</div>
    <button>buy</button>
  </div>

</div>

【问题讨论】:

    标签: css css-grid


    【解决方案1】:

    目前 (2019/06)* 无法使用任何 CSS 布局方法。

    display:subgrid 解决了这个问题,但它在浏览器中非实验性采用是有限的。*

    *[2019/12 更新] - Subgrid 现在在 Firefox 71 中提供

    Support @ CanIuse.com

    --

    默认情况下,它在 Firefox 71+ 中启用,因此可以进行测试。直到完全采用 Javacript 才能均衡元素高度。

    来自 Rachel Andrew(CSS-Grid 倡导者)的一些资源链接

    1. https://rachelandrew.co.uk/archives/2019/04/16/css-subgrid-news-and-demos/

    1. YouTube video 在子网格上

    2. And Another

    * {   margin: 0;   padding: 0;   box-sizing: border-box; }  ::before, ::after {   box-sizing:inherit; }
    
    .Grid {
      display: grid;
      width:90%;
      margin:auto;
      grid-gap: 10px;
      grid-template-columns: repeat( auto-fill, 280px);
    }
    
    .loon-card {
      display:grid;
      grid-row: span 5; /* as we have 5 card components in each card */
      grid-template-rows:subgrid;
      border: 1px solid #ddd;
      padding: 10px;
    }
    
    .long-description {
      border-top: 1px solid #ddd;
    }
    
    .price {
    padding:.5em;
    text-align:center;
    }
    
    img {
      max-width:100%;
      display: block;
    }
    <div class="Grid">
    
      <div class="loon-card">
        <img src="http://www.fillmurray.com/300/200">
        <div class="short-description">
          Title:1
          <br/>Title:2
          <br/>Title:3
          <br/>Title:4
        </div>
        <div class="long-description">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
        </div>
        <div class='price'>12.00$</div>
        <button>buy</button>
      </div>
    
      <div class="loon-card">
        <img src="http://www.fillmurray.com/300/200">
        <div class="short-description">
          Title:1
          <br/>Title:2
          <br/>Title:3
          <br/>Title:4
          <br/>Title:5
          <br/>Title:6
    
        </div>
        <div class="long-description">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
        </div>
        <div class='price'>12.00$</div>
        <button>buy</button>
      </div>
    
      <div class="loon-card">
        <img src="http://www.fillmurray.com/300/200">
        <div class="short-description">
          Title:1
          <br/>Title:2
          <br/>Title:3
          <br/>Title:4
        </div>
        <div class="long-description">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
        </div>
        <div class='price'>14.00$</div>
        <button>buy</button>
      </div>
    
      <div class="loon-card">
        <img src="http://www.fillmurray.com/300/200">
        <div class="short-description">
          Title:1
          <br/>Title:2
          <br/>Title:3
          <br/>Title:4
        </div>
        <div class="long-description">
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla scelerisque egestas.
        </div>
        <div class='price'>15.00$</div>
        <button>buy</button>
      </div>
    
    </div>

    结果输出(FF Nightly)

    【讨论】:

      【解决方案2】:

      可以说,没有subgrid 也可以实现同样的目标,尽管这有点痛苦。

      在我的示例中,我没有更改 HTML,所以我使用display: contents 将子级提升到 DOM 树的上一级。但是,如果您可以更改您的标记并且不介意造成的混乱,您也可以在没有display: contents 的情况下实现这一点。

      .Grid {
          display: grid;
          grid-gap: 10px;
      }
      .loon-card {
          display: contents;
      }
      img {
          width: 100%;
          grid-row-start: 1;
      }
      .short-description {
          grid-row-start: 2;
      }
      .long-description {
          grid-row-start: 3;
      }
      .price {
          grid-row-start: 4;
      }
      button {
          grid-row-start: 5;
      }
      <div class="Grid">
      
      	<div class="loon-card">
      		<img src="http://www.fillmurray.com/300/200">
      		<div class="short-description">
      			Title:1
      			<br />Title:2
      			<br />Title:3
      			<br />Title:4
      		</div>
      		<div class="long-description">
      			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla
      			scelerisque egestas.
      		</div>
      		<div class='price'>12.00$</div>
      		<button>buy</button>
      	</div>
      
      	<div class="loon-card">
      		<img src="http://www.fillmurray.com/300/200">
      		<div class="short-description">
      			Title:1
      			<br />Title:2
      			<br />Title:3
      			<br />Title:4
      			<br />Title:5
      			<br />Title:6
      
      		</div>
      		<div class="long-description">
      			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla
      			scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec
      			et lorem ac nulla scelerisque egestas.
      			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla
      			scelerisque egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec
      			et lorem ac nulla scelerisque egestas.
      		</div>
      		<div class='price'>12.00$</div>
      		<button>buy</button>
      	</div>
      
      	<div class="loon-card">
      		<img src="http://www.fillmurray.com/300/200">
      		<div class="short-description">
      			Title:1
      			<br />Title:2
      			<br />Title:3
      			<br />Title:4
      		</div>
      		<div class="long-description">
      			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla
      			scelerisque egestas.
      		</div>
      		<div class='price'>14.00$</div>
      		<button>buy</button>
      	</div>
      
      	<div class="loon-card">
      		<img src="http://www.fillmurray.com/300/200">
      		<div class="short-description">
      			Title:1
      			<br />Title:2
      			<br />Title:3
      			<br />Title:4
      		</div>
      		<div class="long-description">
      			Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae mauris arcu. Donec et lorem ac nulla
      			scelerisque egestas.
      		</div>
      		<div class='price'>15.00$</div>
      		<button>buy</button>
      	</div>
      </div>

      【讨论】:

      • 显示:内容;不支持IE和EDGE
      • @mat only 不支持 IE
      • 截至今天,并非所有浏览器都完全支持display:subgrid。目前这不是解决方案。 caniuse.com/#feat=css-subgrid
      • @Wreeecks 这就是为什么我提出一个没有子网格的解决方案。
      • @RazvanZamfir 这取决于确切的要求。 display: contents 对 flexbox 也很有用,但 flexbox 并不总是最适合像这样的 2D 布局,因此您通常最终会拥有一个父 flex 和许多 flex 子级,有时您仍然无法做您想要做的事情'正在尝试做。取决于要求。
      【解决方案3】:

      一点点 JavaScript 可以提供帮助。通过获取最大高度,您可以将其定义到所有类

      function textHeight() {
        var reed = document.getElementsByClassName("titles")
      
        let lengths = Array.from(reed).map(e => e.offsetHeight);
        let max = Math.max(...lengths);
      
        for (let i = 0; i < reed.length; i++) {
          reed[i].style.minHeight = max + "px"
        }
      }
      textHeight();
      .kind-words {
        margin-top: 3%;
        margin-left: 10%;
        margin-right: 10%;
        display: flex;
      }
      
      .word {
        background-color: #F5F5F5;
        float: left;
        width: 50%;
        margin-left: 1%;
        margin-right: 1%;
        padding-left: 5%;
        padding-right: 5%;
        padding-top: 3%;
        padding-bottom: 3%;
        border: solid 1px #B1976B;
        display: flex;
        flex-flow: column;
      }
      <div class="kind-words" style="margin-bottom: 4%;">
        <div class="word">
          <h1 style="text-align: center; font-family: avenirNext; font-size: 30px; color: #B1976B;">Mark D. Griffith</h1>
          <h1 style="text-align: center; font-family: avenirNext; font-size: 20px; color: #B1976B;" class="titles">Griffith & Associates</h1>
          <h1 style="text-align: center; text-align:justify;  font-family: avenirnext; font-size: 20px; line-height: 1.5em; color: #54595F;">I would not try any level criminal allegation regarding sexual assault without the help of Dr. Pierce. I have tried many of these cases and the most valuable asset when I do is Dr. Pierce. He has testified in many of my cases with the outcome being
            the two word verdict my client so badly needs. The most clear and concise witness I have ever used. I have come to the point where I feel the only way to be truly effective is to have him on our team when we go to trial. He is approachable, understanding,
            and infinitely knowledgeable.
          </h1>
        </div>
        <div class="word">
          <h1 style="text-align: center; font-family: avenirNext; font-size: 30px; color: #B1976B;">Katheryn H. Haywood
          </h1>
          <h1 style="text-align: center;  font-family: avenirNext; font-size: 20px; color: #B1976B;" class="titles">The Law Office of<br> Katheryn H. Haywood, PLLC </h1>
          <h1 style="text-align: center;  text-align:justify; font-family: avenirnext; font-size: 20px; line-height: 1.5em; color: #54595F;">Dr. Pierce is my ONLY expert for child abuse cases. He is a national leader in understanding false accusations based on fear of the boogey man/family dynamics/hyper-sensitivity to touching based on past trauma. I have been doing sex defense work for
            20 years. Dr. Pierce is the expert I rely on to help me understand the intricacies of my cases. He is a straight shooter. And perhaps more importantly, he speaks very well to juries in common language which is clear, concise, and not elitist. I
            have 5 cases pending with Dr. Pierce and have yet to lose one where he has consulted/testified.
          </h1>
        </div>
      </div>

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多