Sass 可以简化此自定义SCSS网格吗?

Sass 可以简化此自定义SCSS网格吗?,sass,grid,Sass,Grid,我写了这个SCSS网格。还有一个js变量,用于设置每行的最大项数(min=4,max=8)。使用该变量,我向网格包装器添加一个类,并获得不同的CSS 正如您在中所看到的,它工作得很好,但感觉不必要地复杂。有没有更优雅的方式来编写这个SCS .grid-wrap { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: flex-start; align-items: stretch; w

我写了这个SCSS网格。还有一个js变量,用于设置每行的最大项数(min=4,max=8)。使用该变量,我向网格包装器添加一个类,并获得不同的CSS

正如您在中所看到的,它工作得很好,但感觉不必要地复杂。有没有更优雅的方式来编写这个SCS

.grid-wrap {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: stretch;
  width: calc(100% + 20px);
  margin: 0 -10px;

  .grid-item,
  .grid-orphan {
    margin: 20px 10px 0;
    align-self: stretch;
    flex: 1;
    min-height: 1px;
    background-color: #0000CC;
    height: 50px;

  }

  .grid-orphan {
    height: 0;
    min-height: 0;
    margin: 0 10px;
  }

  /*

  EIGHT


  */
  &.eight {

    // eight
    @media screen and (min-width: 2201px) {
      .grid-item {
        min-width: calc(12.5% - 20px);
      }
    }

    // seven
    @media screen and (min-width: 2021px) and (max-width: 2200px) {
      .grid-item {
        min-width: calc((100% / 7) - 20px);

      }
    }

    // six
    @media screen and (min-width: 1827px) and (max-width: 2020px) {
      .grid-item {
        min-width: calc((100% / 6) - 20px);

      }
    }

    // five
    @media screen and (min-width: 1527px) and (max-width: 1826px) {
      .grid-item {
        min-width: calc(20% - 20px);
      }
    }

    // four
    @media screen and (min-width: 1277px) and (max-width: 1526px) {
      .grid-item {
        min-width: calc(25% - 20px);
      }
    }

    // three
    @media screen and (min-width: 992px) and (max-width: 1276px) {
      .grid-item {
        min-width: calc((100% / 3) - 20px);
      }
    }

    // two
    @media screen and (min-width: 601px) and (max-width: 991px) {
      justify-content: space-between;

      .grid-item {
        min-width: calc(50% - 20px);
      }
    }
  }

  /*

  SEVEN


  */
  &.seven {

    // seven
    @media screen and (min-width: 2021px) {
      .grid-item {
        min-width: calc((100% / 7) - 20px);
      }
    }

    // six
    @media screen and (min-width: 1827px) and (max-width: 2020px) {
      .grid-item {
        min-width: calc((100% / 6) - 20px);
      }
    }

    // five
    @media screen and (min-width: 1527px) and (max-width: 1826px) {
      .grid-item {
        min-width: calc(20% - 20px);
      }
    }

    // four
    @media screen and (min-width: 1277px) and (max-width: 1526px) {
      .grid-item {
        min-width: calc(25% - 20px);
      }
    }

    // three
    @media screen and (min-width: 992px) and (max-width: 1276px) {
      .grid-item {
        min-width: calc((100% / 3) - 20px);
      }
    }

    // two
    @media screen and (min-width: 601px) and (max-width: 991px) {
      justify-content: space-between;

      .grid-item {
        min-width: calc(50% - 20px);
      }
    }
  }

  /*

  SIX


  */
  &.six {

    // six
    @media screen and (min-width: 1827px) {
      .grid-item {
        min-width: calc((100% / 6) - 20px);
      }
    }

    // five
    @media screen and (min-width: 1527px) and (max-width: 1826px) {
      .grid-item {
        min-width: calc(20% - 20px);
      }
    }

    // four
    @media screen and (min-width: 1277px) and (max-width: 1526px) {
      .grid-item {
        min-width: calc(25% - 20px);
      }
    }

    // three
    @media screen and (min-width: 992px) and (max-width: 1276px) {
      .grid-item {
        min-width: calc((100% / 3) - 20px);
      }
    }

    // two
    @media screen and (min-width: 601px) and (max-width: 991px) {
      justify-content: space-between;

      .grid-item {
        min-width: calc(50% - 20px);
      }
    }
  }

  /*

  FIVE


  */
  &.five {

    // five
    @media screen and (min-width: 1527px) {
      .grid-item {
        min-width: calc(20% - 20px);
      }
    }

    // four
    @media screen and (min-width: 1277px) and (max-width: 1526px) {
      .grid-item {
        min-width: calc(25% - 20px);
      }
    }

    // three
    @media screen and (min-width: 992px) and (max-width: 1276px) {
      .grid-item {
        min-width: calc((100% / 3) - 20px);
      }
    }

    // two
    @media screen and (min-width: 601px) and (max-width: 991px) {
      justify-content: space-between;

      .grid-item {
        min-width: calc(50% - 20px);
      }
    }
  }

  /*

  FOUR


  */
  &.four {

    // four
    @media screen and (min-width: 1600px) {
      .grid-item {
        min-width: calc(25% - 20px);
      }

    }

    // three
    @media screen and (min-width: 1200px) and (max-width: 1599px) {
      .grid-item {
        min-width: calc((100% / 3) - 20px);
      }
    }

    // two
    @media screen and (min-width: 601px) and (max-width: 1199px) {
      justify-content: space-between;

      .grid-item {
        min-width: calc(50% - 20px);
      }
    }
  }

  @media screen and (min-width: 0) and (max-width: 600px) {
    justify-content: center;
    width: 100%;
    margin: 0;

    .grid-item {
      min-width: 100%;
      margin: 20px 0 0;

      &:first-child {
        margin-top: 0;
      }
    }

    .grid-orphan {
      min-width: 100%;
      margin: 0;
    }
  }
}

你可以先给那些你不止一次吃过的东西做一些调味品来保持干燥

e、 g

变成:

@mixin two {
  @media screen and (min-width: 601px) and (max-width: 991px) {
    justify-content: space-between;

    .grid-item {
      min-width: calc(50% - 20px);
    }
  }
}
然后,在上面有第一个代码块的所有地方,只需添加:

@include two;

最好把你的魔法数字也分配给sass变量,这样读起来会更好。您可能会涉及到一些地图和循环,但它不应该真的需要它。

这里有一个直接的建议,可以使用它来解决布局问题

我对最小的屏幕做了一个自以为是的更改,这样在媒体查询中只使用
min width
就更容易了

如果不需要根据助手类设置不同的列,甚至可以删除所有媒体查询,并让8列的规则适用于所有情况

编辑:

下面是一个简化的(讽刺的是)尝试:


非常感谢。我可能会使用一些混音器,但媒体的最小/最大宽度可能会发生变化,因此我可能需要对其进行编码。我会使用sass变量来表示每行的最大计数,但客户机希望能够在一个位置更改它,而不必编译任何内容:(我明白了,今天我会有另一个想法。如果你认为这对其他人有帮助,请投赞成票。干杯!我最终将我的flex容器转换成了网格。这是一个相当庞大的网站,在几十个不同的页面上有几十个网格,有着不同的实现,所以我害怕重构它,但看到你的例子鼓励我去尝试,这很容易简单。唯一的改变是我为断点添加了一些mixin,并且我必须添加一个minmax,所以:
网格模板列:repeat(4,minmax(0,1fr));
这听起来是个聪明的解决方案,很高兴我能帮上忙!
@include two;
.grid-wrap {
    display: grid;
    grid-gap: 20px;

    .grid-item,
    .grid-orphan {
        background-color: #0000cc;
        height: 50px;
    }

    // Breakpoints are initially the same in all columns variations
    @media screen and (min-width: 601px) {
        grid-template-columns: repeat(2, 1fr);
    }

    @media screen and (min-width: 992px) {
        grid-template-columns: repeat(3, 1fr);
    }

    @media screen and (min-width: 1277px) {
        grid-template-columns: repeat(4, 1fr);
    }

    @media screen and (min-width: 1527px) {
        grid-template-columns: repeat(5, 1fr);
    }

    @media screen and (min-width: 1827px) {
        grid-template-columns: repeat(6, 1fr);
    }

    @media screen and (min-width: 2021px) {
        grid-template-columns: repeat(7, 1fr);
    }

    @media screen and (min-width: 2201px) {
        grid-template-columns: repeat(8, 1fr);
    }

    &.four {
        // Different breakpoint values in 4 column variations
        @media screen and (min-width: 601px) {
            grid-template-columns: repeat(2, 1fr);
        }

        @media screen and (min-width: 1200px) {
            grid-template-columns: repeat(3, 1fr);
        }

        @media screen and (min-width: 1600px) {
            grid-template-columns: repeat(4, 1fr);
        }
    }

    &.five {
        // No overrides
    }

    &.six {
        // No overrides
    }

    &.seven {
        // No overrides
    }

    &.eight {
        // No overrides
    }
}