CSSグリッドレイアウトで作成されたカードがあります。左に画像、右上にテキスト、右下にボタンまたはリンクがある場合があります。
以下のコードでは、緑の領域ができるだけ多くのスペースを占有し、同時に青の領域ができるだけ小さなスペースを占有しないようにするにはどうすればよいですか?
緑は青い領域を可能な限り下に押します。
https://jsfiddle.net/9nxpvs5m/
.grid {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-areas:
"one two"
"one three"
}
.one {
background: red;
grid-area: one;
padding: 50px 0;
}
.two {
background: green;
grid-area: two;
}
.three {
background: blue;
grid-area: three;
}
<div class="grid">
<div class="one">
One
</div>
<div class="two">
Two
</div>
<div class="three">
Three
</div>
</div>
grid-template-rows: 1fr min-content;
を.grid
に追加すると、まさにあなたが求めているものが得られます:)。
.grid {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: 1fr min-content;
grid-template-areas:
"one two"
"one three"
}
.one {
background: red;
grid-area: one;
padding: 50px 0;
}
.two {
background: green;
grid-area: two;
}
.three {
background: blue;
grid-area: three;
}
<div class="grid">
<div class="one">
One
</div>
<div class="two">
Two
</div>
<div class="three">
Three
</div>
</div>
Jens edits:ブラウザーのサポートを改善するために、代わりにこれを使用できます:少なくともこの場合、grid-template-rows: 1fr auto;
。
グリッドは、交差する一連の行と列です。
2番目の列の2つのアイテムは、コンテンツの高さに基づいて行の高さを自動的に調整します。
それはグリッドの仕組みではありません。 2列目の行の高さに対するこのような変更は、1列目にも影響します。
CSSグリッドを使用する必要がある場合は、コンテナ、たとえば12行を指定し、必要に応じて項目を行に広げます。
.grid {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: repeat(12, 15px);
}
.one {
grid-row: 1 / -1;
background: red;
}
.two {
grid-row: span 10;
background: lightgreen;
}
.three {
grid-row: span 2;
background: aqua;
}
.grid > div {
display: flex;
align-items: center;
justify-content: center;
}
<div class="grid">
<div class="one">One</div>
<div class="two">Two</div>
<div class="three">Three</div>
</div>
それ以外の場合は、flexboxソリューションを試すことができます。
.grid {
display: flex;
flex-flow: column wrap;
height: 200px;
}
.one {
flex: 0 0 100%;
width: 30%;
background: red;
}
.two {
flex: 1 0 1px;
width: 70%;
background: lightgreen;
}
.three {
background: aqua;
}
.grid>div {
display: flex;
align-items: center;
justify-content: center;
}
<div class="grid">
<div class="one">One</div>
<div class="two">Two</div>
<div class="three">Three</div>
</div>
グリッドを使用し、グリッドテンプレート領域を使用している場合、特定の領域に幅を指定した場合、スペースグリッドが自動的に残ります。この状況では、grid-template-columnsをmin-contentまたはmax-contentのいずれかにすると、位置が自動的に調整されます。
間違いなく最もエレガントなソリューションではなく、おそらくベストプラクティスでもありませんが、
"one two"
あなたが持っている部分の前に
"one three"
だから最終的には
.grid {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-areas:
"one two"
"one two"
"one two"
"one three"
}
繰り返しますが、これは単なる回避策であり、より良い解決策があります...しかし、これはうまくいきます。
私はグリッドが初めてなので、これがうまくいかない場合はおologiesびします。
可能なアプローチは、two
とthree
をグループ化し、flexbox
?を使用することです。
.grid {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-areas: "one two"
}
.one {
background: red;
grid-area: one;
padding: 50px 0;
}
.wrap {
grid-area: two;
display: flex;
flex-direction: column;
}
.two {
background: green;
flex: 1;
}
.three {
background: blue;
}
<div class="grid">
<div class="one">
One
</div>
<div class="wrap">
<div class="two">
Two
</div>
<div class="three">
Three
</div>
</div>
</div>