【问题标题】:Why are images overlapping in CSS Grid?为什么图像在 CSS Grid 中重叠?
【发布时间】:2017-09-01 21:05:42
【问题描述】:

我正在尝试使用 CSS Grid 构建产品页面。出于某种原因,我的图像一直重叠,而不是位于彼此下方。

我在下面的代码中模仿了我的代码(没有所有的 drupal 绒毛)。我在那里有同样的问题。我尝试使用单个网格以及网格中的网格(如我的示例)

https://jsfiddle.net/e28mc4f5/1/

#mygrid {
	display: grid;
	grid-template-columns: 300px 1fr;
	grid-template-rows:	auto;
	grid-template-areas: 
		"images title"
		"images model"
		"images price"
		;
}

#mygrid .items  {
	background-color: red;
	grid-area: images;
	display: grid;
	grid-template-columns: 100px 200px;
	grid-template-rows: 100px 100px auto;
	grid-template-areas: 
		"thumbs main"
    "thumbs main"
    "thumbs main"
		;
}

#mygrid .items .item  {
	grid-area: thumbs;

}

#mygrid .items .item img{
  //why are there overlapping??
	width: 100px;
	height: auto;
  
}

#mygrid .items .item:first-child  {
	grid-area: main;
   
}

#mygrid .items .item:first-child img{
	width: 200px;
	height: auto;
}
<div id="mygrid">
  <div class="items">
    <div class="item">
      <img src="http://lorempixel.com/100/100/sports">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/food">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/cities">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/nature">
    </div>
  </div>
  <div class=info>MY TITLE</div>
  <div class=info>My Description</div>
  <div class=prijs>My Price</div>
  
</div>

我正在尝试将所有图像(第一个除外)放在名为“thumbs”的第一个网格列中。 (这行得通,但相互摔倒)

我将第一张图片放在更大尺寸的第二列中。 (这行得通)

我很确定我错过了一些基本的东西,但我已经尝试(和谷歌搜索)几个小时了。也许另一双眼睛可以启发我。


这是一个单网格版本。这里的问题是第一张图片不会把自己放在正确的位置。

https://jsfiddle.net/wrpt5g3b/1/

#mygrid {
	display: grid;
  grid-template-columns: 1fr 2fr 3fr;
	grid-template-rows:	25px 25px 25px auto;
  
	grid-template-areas: 
		"aside main model"
		"aside main price"
		"aside main input"
		"aside . ."
		;
}

#mygrid .items  {
}

#mygrid .items .item  {
	grid-area: aside;
}

#mygrid .items .item img{
	width: 100px;
	height: auto;
  
}

#mygrid .items .item:first-child  {
	grid-area: main;   //why is this ignoring it's place?
  justify-self: stretch;
}

#mygrid .items .item:first-child img{
	width: 200px;
	//height: auto;
}
#mygrid .title {
  grid-area: model;
	justify-self: stretch;
} 

#mygrid .info {
  grid-area: input;
	justify-self: stretch;
} 

#mygrid .price {
  grid-area: price;
	justify-self: stretch;
} 
<div id="mygrid">
  <div class="items">
    <div class="item">
      <img src="http://lorempixel.com/100/100/sports">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/food">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/food">
    </div>
    <div class="item">
      <img src="http://lorempixel.com/100/100/food">
    </div>
  </div>
  <div class=title>MY TITLE</div>
  <div class=info>My Description</div>
  <div class=price>My Price</div>
  
</div>

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    问题是您将相同的网格区域名称应用于所有图像容器。

    每个.item 元素都被命名为thumbs

    您的 HTML

    <div class="items">
      <div class="item">
        <img src="http://lorempixel.com/100/100/sports">
      </div>
      <div class="item">
        <img src="http://lorempixel.com/100/100/food">
      </div>
      <div class="item">
        <img src="http://lorempixel.com/100/100/cities">
      </div>
      <div class="item">
        <img src="http://lorempixel.com/100/100/nature">
      </div>
    </div>
    

    你的 CSS

    #mygrid .items  {
       background-color: red;
       grid-area: images;
       display: grid;
       grid-template-columns: 100px 200px;
       grid-template-rows: 100px 100px auto;
       grid-template-areas: 
                            "thumbs main"
                            "thumbs main"
                            "thumbs main"
       ;
    }
    
    .item {
       grid-area: thumbs;
    }
    
    .item:first-child  {
       grid-area: main;
    }
    
    .item img {
       width: 100px;
       height: auto;
    }
    
    .item:first-child img {
       width: 200px;
       height: auto;
    }
    

    发生了什么事

    • 第一个图像容器命名为main,覆盖thumbs。根据您的 grid-template-areas 规则,此容器位于第二列。
    • 第二个、第三个和第四个图像容器命名为thumbs。因为所有三个元素都具有相同的名称,所以前两个被忽略并呈现最后一个(per the rules of HTML parsing,通常基于源文档中出现的顺序)。
    • 因此,最终没有重叠图像。您得到的是第二列中的 image1 和第一列中的 image4。
    • image1 比 image4 高,因为它的宽度是原来的两倍(根据您的 CSS)。

    解决方案

    给每个项目一个唯一的网格区域名称。

    #mygrid {
    	display: grid;
    	grid-template-columns: 300px 1fr;
    	grid-template-rows:	auto;
    	grid-template-areas: 
    		"images title"
    		"images model"
    		"images price"
    		;
    }
    
    .items {
    	background-color: red;
    	grid-area: images;
    	display: grid;
    	grid-template-columns: 100px 200px;
    	grid-template-rows: 100px 100px auto;
    	grid-template-areas: 
                  "thumbs2 main"
                  "thumbs3 main"
                  "thumbs4 main"    
    		;
    }
    
    .item:first-child   { grid-area: main; }
    .item:nth-child(2)  { grid-area: thumbs2; }
    .item:nth-child(3)  { grid-area: thumbs3; }
    .item:nth-child(4)  { grid-area: thumbs4; }
    
    .item img {
    	width: 100px;
    	height: auto;
    }
    
    .item:first-child img {
    	width: 200px;
    	height: auto;
    }
    <div id="mygrid">
      <div class="items">
        <div class="item">
          <img src="http://lorempixel.com/100/100/sports">
        </div>
        <div class="item">
          <img src="http://lorempixel.com/100/100/food">
        </div>
        <div class="item">
          <img src="http://lorempixel.com/100/100/city">
        </div>
        <div class="item">
          <img src="http://lorempixel.com/100/100/nature">
        </div>
      </div>
      <div class=info>MY TITLE</div>
      <div class=info>My Description</div>
      <div class=prijs>My Price</div>
    </div>

    jsFiddle

    【讨论】:

    • 谢谢迈克尔。我得出了类似的结论。感谢您解释这一切的“原因”。我曾经 - 错误地 - 假设一个网格的行为就像一个 div,你可以继续向它添加东西,它们会一个接一个地定位自己。 (对不起,无法投票给你,没有足够的代表)
    • “我曾经 - 错误地 - 假设一个网格的行为就像一个 div,你可以继续向它添加东西,它们会一个接一个地定位自己。” .. .你的假设实际上是正确的......
    • Grid 有一个 auto-placement algorithm 可以做到这一点,您也可以控制它的流程(rowcolumndense)...
    • 当您给一类项目赋予相同的网格区域名称时会出现问题。
    【解决方案2】:

    好的,我找到了奇怪的原因。

    万一其他人遇到类似情况:

    将放置在网格中的 HTML 元素都需要在 DOM 中处于同一级别,并且是网格元素的直接后代。
    当一个 html 元素中有一个 html 元素在一个网格元素中时,您需要为较低层的 html 元素创建一个新的网格元素。

    【讨论】:

    • 我认为这不是问题的原因。但请发布一个包含您的解决方案的工作示例以进行验证。
    • 你好,我缺乏在我的帖子中添加另一个链接的声誉。这是我最终解决方案的 jsFiddle。 jsfiddle.net/e28mc4f5/2 我必须为 items 元素中的所有项目图像创建第二个网格。而且我必须在它自己的元素中手动设置每个图像。因为当我将它们添加到同一个元素时,它们会相互叠加。所以我做了 thumbs1、thumbs2 和 thumbs3 而不是一个大拇指区域
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多