对齐网格中的项目
Align items in a grid
如何将项目放在网格中,其中项目将接触容器边界,并且每个项目之间有特定的间隙?
https://i.imgur.com/zO1dQmr.png
这对我来说是一个微不足道但很重要的问题。我做了研究,有一些方法(我不喜欢其中任何一种,想找到更好的解决方案)
1. Bootstrap方法
演示:https://codepen.io/olegburakov/pen/MQORVX
.container{
overflow: hidden;
&__inner{
display: flex;
flex-wrap: wrap;
margin-left: -10px;
margin-right: -10px;
}
&__item{
padding: 10px;
width: 100%;
min-height: 100px;
@media screen and (min-width: 480px){
width: 50%;
}
@media screen and (min-width: 768px){
width: 33.33%;
}
@media screen and (min-width: 1024px){
width: 25%;
}
&-inner{
background: olive;
height: 100%;
}
}
}
我不喜欢这个解决方案,因为:
1) 容器中的负边距将项目压到它的边界并使项目接触它。
2)需要向容器添加包装器并溢出:隐藏以隐藏水平滚动条或 padding-left 和 padding-right 等于或大于容器的负边距。
3) HTML 中的其他块:container-wrapper 和 item-inner
2。第 N 个子方法
比bootstrap方法更难,而且不利于媒体查询。
3。网格布局方式
演示:https://codepen.io/olegburakov/pen/xYPeoK
.container{
display: grid;
grid-template-columns: 1fr;
grid-gap: 20px;
@media screen and (min-width: 480px){
grid-template-columns: 1fr 1fr;
}
@media screen and (min-width: 768px){
grid-template-columns: 1fr 1fr 1fr;
}
@media screen and (min-width: 1024px){
grid-template-columns: 1fr 1fr 1fr 1fr;
}
&__item{
width: 100%;
min-height: 100px;
background: olive;
}
}
我的最爱。只需4行代码!但我不确定它的兼容性(例如在我未更新的 Edge15 演示中看起来像这样 https://i.imgur.com/p8shL04.png)。我认为我们还需要一些时间才能完全使用网格布局。
4。流宽法
演示:https://codepen.io/olegburakov/pen/jYWyeW
我写了一个 mixin 来计算项目的宽度。所以你不需要额外的 HTML 或 padding/margin 属性。但是当最后一行多于一个项目且少于整行时,它不起作用。我试图用 :before :after 解决这个问题,但没有用。
.container{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
background: tomato;
&__item{
@include fluid-width-item(100%, 15px, 15px);
border: 1px solid #000;
min-height: 100px;
background-color: olive;
}
&__item{
@media screen and (min-width: 480px){
@include fluid-width-item(50%, 15px, 15px);
}
@media screen and (min-width: 768px){
@include fluid-width-item(33.33%, 15px, 15px);
}
@media screen and (min-width: 1024px){
@include fluid-width-item(20%, 15px, 5px);
}
}
}
所以也许我错过了没有额外 html/css 且具有良好兼容性的更有趣的方法?目前我使用 bootstrap 方法。
对于网格布局方法和兼容性问题,我非常喜欢Morten Rand-Hendriksen的方法,如果您首先让您的网站移动:
Forcing sites to look the same across all browsers is just a bad habit.
[...]
Accessible mobile-first layouts work well on all screen widths.
https://www.youtube.com/embed/txZq7Laz7_4?start=1313&end=1587
这里是您的代码:(对于纯 CSS 而没有 SASS 的片段)
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.container {
width: 100%;
max-width: 1000px;
margin: 0 auto;
}
.container__item {
min-height: 100px;
margin: 0 20px 20px 20px;
background: olive;
}
@supports (grid-area: auto) {
@media screen and (min-width: 480px) {
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 20px;
margin: 0;
}
.container__item {
margin: 0;
}
}
@media screen and (min-width: 768px) {
.container {
grid-template-columns: 1fr 1fr 1fr;
}
}
@media screen and (min-width: 1024px) {
.container {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
}
}
<div class="container">
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
</div>
也许这也是适合您的方法。 :)
如何将项目放在网格中,其中项目将接触容器边界,并且每个项目之间有特定的间隙?
https://i.imgur.com/zO1dQmr.png
这对我来说是一个微不足道但很重要的问题。我做了研究,有一些方法(我不喜欢其中任何一种,想找到更好的解决方案)
1. Bootstrap方法
演示:https://codepen.io/olegburakov/pen/MQORVX
.container{
overflow: hidden;
&__inner{
display: flex;
flex-wrap: wrap;
margin-left: -10px;
margin-right: -10px;
}
&__item{
padding: 10px;
width: 100%;
min-height: 100px;
@media screen and (min-width: 480px){
width: 50%;
}
@media screen and (min-width: 768px){
width: 33.33%;
}
@media screen and (min-width: 1024px){
width: 25%;
}
&-inner{
background: olive;
height: 100%;
}
}
}
我不喜欢这个解决方案,因为:
1) 容器中的负边距将项目压到它的边界并使项目接触它。
2)需要向容器添加包装器并溢出:隐藏以隐藏水平滚动条或 padding-left 和 padding-right 等于或大于容器的负边距。
3) HTML 中的其他块:container-wrapper 和 item-inner
2。第 N 个子方法
比bootstrap方法更难,而且不利于媒体查询。
3。网格布局方式
演示:https://codepen.io/olegburakov/pen/xYPeoK
.container{
display: grid;
grid-template-columns: 1fr;
grid-gap: 20px;
@media screen and (min-width: 480px){
grid-template-columns: 1fr 1fr;
}
@media screen and (min-width: 768px){
grid-template-columns: 1fr 1fr 1fr;
}
@media screen and (min-width: 1024px){
grid-template-columns: 1fr 1fr 1fr 1fr;
}
&__item{
width: 100%;
min-height: 100px;
background: olive;
}
}
我的最爱。只需4行代码!但我不确定它的兼容性(例如在我未更新的 Edge15 演示中看起来像这样 https://i.imgur.com/p8shL04.png)。我认为我们还需要一些时间才能完全使用网格布局。
4。流宽法
演示:https://codepen.io/olegburakov/pen/jYWyeW
我写了一个 mixin 来计算项目的宽度。所以你不需要额外的 HTML 或 padding/margin 属性。但是当最后一行多于一个项目且少于整行时,它不起作用。我试图用 :before :after 解决这个问题,但没有用。
.container{
display: flex;
flex-wrap: wrap;
justify-content: space-between;
background: tomato;
&__item{
@include fluid-width-item(100%, 15px, 15px);
border: 1px solid #000;
min-height: 100px;
background-color: olive;
}
&__item{
@media screen and (min-width: 480px){
@include fluid-width-item(50%, 15px, 15px);
}
@media screen and (min-width: 768px){
@include fluid-width-item(33.33%, 15px, 15px);
}
@media screen and (min-width: 1024px){
@include fluid-width-item(20%, 15px, 5px);
}
}
}
所以也许我错过了没有额外 html/css 且具有良好兼容性的更有趣的方法?目前我使用 bootstrap 方法。
对于网格布局方法和兼容性问题,我非常喜欢Morten Rand-Hendriksen的方法,如果您首先让您的网站移动:
Forcing sites to look the same across all browsers is just a bad habit.
[...]
Accessible mobile-first layouts work well on all screen widths.
https://www.youtube.com/embed/txZq7Laz7_4?start=1313&end=1587
这里是您的代码:(对于纯 CSS 而没有 SASS 的片段)
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.container {
width: 100%;
max-width: 1000px;
margin: 0 auto;
}
.container__item {
min-height: 100px;
margin: 0 20px 20px 20px;
background: olive;
}
@supports (grid-area: auto) {
@media screen and (min-width: 480px) {
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 20px;
margin: 0;
}
.container__item {
margin: 0;
}
}
@media screen and (min-width: 768px) {
.container {
grid-template-columns: 1fr 1fr 1fr;
}
}
@media screen and (min-width: 1024px) {
.container {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
}
}
<div class="container">
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
<div class="container__item"></div>
</div>
也许这也是适合您的方法。 :)