在 CSS 网格内垂直对齐
Vertical align inside CSS grid
我想要一个巨大的进度条,它在 CSS 网格内垂直对齐。
问题是,CSS 网格内的垂直对齐对我不起作用。我在 Firefox 上试过,也在 Chrome.
上试过了
我尝试了 vertical-align: middle
,但它不起作用。我已经在网格项目中放置了一个 Flexbox,但它仍然无法正常工作。
这是我的最小示例:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
width: 100vw;
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
一个演示:
https://codepen.io/anon/pen/OOpdPW
如何垂直对齐上述演示项目的进度条(在其网格项内)?
对于 Flexbox 方案,你必须在 .two 中添加 display:flex
和 align-items: center
,因此 CSS 变成这样:
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
display: flex;
align-items: center;
}
然后将flex: 1
添加到.vertical:
.vertical {
flex: 1
}
完整代码如下:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
/* width: 100vw; not needed */
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
display: flex;
align-items: center;
}
.vertical {
flex: 1;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
将 display: grid
和 align-items: center
添加到 .two
div,但您也可以在 .vertical
div 如果避免在父级上使用 align-items: center
:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
width: 100vw;
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
display: grid; /* Added */
align-items: center; /* Added */
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4 ;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
/* Optional, without the usage of the align-items: center; on the .two div
.vertical {
align-self: center;
}
*/
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
给进度额外的风格。 position absolute
、top
和 transform: translate
。
不要忘记将 position:relative
添加到进度的父级:
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
position: absolute;
top: 50%;
transform: translate(0, -50%);
height: 2em;
}
您是否总是忘记如何使用 CSS 网格在 div 中垂直对齐元素?不要感到孤独,因为我也是,而且我总是会在这里结束。本质上,这两个属性可以应用于 div 包含需要垂直居中的元素:
.some-class {
display: grid;
align-items: center;
}
这里有一个 JSFiddle 示例,供任何好奇这些属性如何工作的人使用。
资源
我想要一个巨大的进度条,它在 CSS 网格内垂直对齐。
问题是,CSS 网格内的垂直对齐对我不起作用。我在 Firefox 上试过,也在 Chrome.
上试过了我尝试了 vertical-align: middle
,但它不起作用。我已经在网格项目中放置了一个 Flexbox,但它仍然无法正常工作。
这是我的最小示例:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
width: 100vw;
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
一个演示: https://codepen.io/anon/pen/OOpdPW
如何垂直对齐上述演示项目的进度条(在其网格项内)?
对于 Flexbox 方案,你必须在 .two 中添加 display:flex
和 align-items: center
,因此 CSS 变成这样:
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
display: flex;
align-items: center;
}
然后将flex: 1
添加到.vertical:
.vertical {
flex: 1
}
完整代码如下:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
/* width: 100vw; not needed */
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4;
display: flex;
align-items: center;
}
.vertical {
flex: 1;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
将 display: grid
和 align-items: center
添加到 .two
div,但您也可以在 .vertical
div 如果避免在父级上使用 align-items: center
:
.wrapper {
display: grid;
border-style: solid;
border-color: red;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-gap: 10px;
width: 100vw;
height: 100vh;
}
.one {
border-style: solid;
border-color: blue;
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.two {
display: grid; /* Added */
align-items: center; /* Added */
border-style: solid;
border-color: yellow;
grid-column: 1 / 3;
grid-row: 2 / 4 ;
}
.three {
border-style: solid;
border-color: violet;
grid-column: 1;
grid-row: 4 / 5;
}
.four {
border-style: solid;
border-color: aqua;
grid-column: 2;
grid-row: 4 / 5;
}
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
height: 2em;
}
/* Optional, without the usage of the align-items: center; on the .two div
.vertical {
align-self: center;
}
*/
<div class="wrapper">
<div class="one">One</div>
<div class="two">
<div class="vertical">
<progress max="100" value="80">
<div class="progress-bar">
<span style="width: 80%;">Progress: 80%</span>
</div>
</progress>
</div>
</div>
<div class="three"> Three</div>
<div class="four">Four</div>
</div>
给进度额外的风格。 position absolute
、top
和 transform: translate
。
不要忘记将 position:relative
添加到进度的父级:
progress {
width: 100%;
background-color: #f3f3f3;
border: 0;
position: absolute;
top: 50%;
transform: translate(0, -50%);
height: 2em;
}
您是否总是忘记如何使用 CSS 网格在 div 中垂直对齐元素?不要感到孤独,因为我也是,而且我总是会在这里结束。本质上,这两个属性可以应用于 div 包含需要垂直居中的元素:
.some-class {
display: grid;
align-items: center;
}
这里有一个 JSFiddle 示例,供任何好奇这些属性如何工作的人使用。
资源