为什么图像在 CSS 网格中重叠?
Why are images overlapping in CSS Grid?
我正在尝试使用 CSS 网格构建产品页面。出于某种原因,我的图像一直重叠,而不是彼此下方放置。
我在下面的代码中模仿了我的代码(没有所有的 drupal fluf)。我在那里有同样的问题。我尝试使用单个网格以及网格中的网格(如我的示例)
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 元素都需要在 DOM 中处于同一级别,并且是网格元素的直接后代。
当您在网格元素的 html 元素中有 html 元素时,您需要为下层 html 元素创建一个新的网格元素。
问题是您对所有图像容器应用了相同的网格区域名称。
每个 .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
我正在尝试使用 CSS 网格构建产品页面。出于某种原因,我的图像一直重叠,而不是彼此下方放置。
我在下面的代码中模仿了我的代码(没有所有的 drupal fluf)。我在那里有同样的问题。我尝试使用单个网格以及网格中的网格(如我的示例)
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 元素都需要在 DOM 中处于同一级别,并且是网格元素的直接后代。
当您在网格元素的 html 元素中有 html 元素时,您需要为下层 html 元素创建一个新的网格元素。
问题是您对所有图像容器应用了相同的网格区域名称。
每个 .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>