正在寻找一种更好的方法来编写此 css 网格 (scss)

Looking for a better way to write this css grid (scss)

我有以下网格:https://codesandbox.io/s/react-and-scss-forked-bwy6v?file=/src/index.js,我正在寻找一种 better/shorter 方法来编写此网格。 我第一次使用网格。
这实际上是我正在构建的响应式网站的一小部分。

.addTransaction {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 50px;

  & div {
    border: solid 1px red;
  }

  & .buySell {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 1;
    grid-row-end: 2;

    display: grid;
    grid-template-columns: 0.5fr 0.5fr;
    column-gap: 5px;

    & .sell {
      width: 100%;
    }

    & .buy {
      width: 100%;
    }

  }

  & .token {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 2;
    grid-row-end: 3;
  }


  & .quantity {
    grid-column-start: 1;
    grid-column-end: 1;
    grid-row-start: 3;
    grid-row-end: 4;
  }

  & .price {
    grid-column-start: 2;
    grid-column-end: 2;
    grid-row-start: 3;
    grid-row-end: 4;
  }

  & .date {
    grid-column-start: 1;
    grid-column-end: 1;
    grid-row-start: 4;
    grid-row-end: 5;
  }

  & .exchange {
    grid-column-start: 2;
    grid-column-end: 2;
    grid-row-start: 4;
    grid-row-end: 5;
  }

  & .totalSpent {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 5;
    grid-row-end: 6;
  }

  & .addToCalc {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 6;
    grid-row-end: 7;
  }

  & .submit {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 7;
    grid-row-end: 8;
  }
}

import styles from "./styles.module.scss";

const App = () => (
  <div className={styles.addTransaction}>
    <div className={styles.buySell}>
      <div>
        <button className={styles.buy}>BUY</button>
      </div>
      <div>
        <button className={styles.sell}>SELL</button>
      </div>
    </div>
    <div className={styles.token}>token</div>
    <div className={styles.quantity}>quantity</div>
    <div className={styles.price}>price</div>
    <div className={styles.date}>date</div>
    <div className={styles.exchange}>exchange</div>
    <div className={styles.totalSpent}>totalSpent</div>
    <div className={styles.addToCalc}>addToCalc</div>
    <div className={styles.submit}>submit</div>
  </div>
);

请提出更好的方法
谢谢

我建议使用网格库而不是创建自己的网格库。 Pure-CSS 有一个非常轻便的漂亮网格。

https://purecss.io/grids/

如果您想创建自己的网格,请以更加模块化的方式进行。 我为我自己的项目做了一个模块,其中文件大小很关键,并为网格本身使用了框布局。您可以在此处查看起点。

https://github.com/domis4/wnderlvst-grid/blob/main/index.js

您的 React 模板将如下所示:

<div className="row">
    <div className="col-xs-6">Buy</div>
    <div className="col-xs-6">Sell</div>
</div>
<div className"row">
    <div className="col-xs-12">token</div>
</div>
<div className"row">
    <div className="col-xs-6">quantity</div>
    <div className="col-xs-6">price</div>
  [...]
</div>

一些让它更短的方法:

  • CSS 网格自动排列,因此您无需指定每一 行和列,除非您要重新排序单元格
  • 对于跨两列的单元格,您可以使用 shorthand 语法:
    grid-column: auto / span 2;
    
  • 如果您有很多具有相同 属性 的单元格(例如,跨越两列),您可以为它们添加一个通用的 class 名称。如果这不是一个选项,您还可以使用逗号链接多个选择器以添加公共属性:
    .firstClass, .secondClass { example-property: 4px; }
    

结果短了很多

.addTransaction {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 50px;

  & div {
    border: solid 1px red;
  }

  & .buySell {
    display: grid;
    grid-template-columns: 0.5fr 0.5fr;
    column-gap: 5px;

    & .buy,
    & .sell {
      width: 100%;
    }
  }

  & .buySell,
  & .token,
  & .totalSpent,
  & .addToCalc,
  & .submit {
    grid-column: auto / span 2;
  }
}

https://codesandbox.io/s/react-and-scss-forked-t8hcw?file=/src/styles.module.scss

其他一些选项:

  • 考虑 .grid-template-areas 真正复杂的布局。与多次手动指定 grid-columngrid-row 相比,它可以成为可读性救星。
  • 应该只有第一行有空隙吗?您可以在任何地方添加该间隙,然后就不需要嵌套网格了。如果您的内容是嵌套的,您可以使用 display: contents 来展平 CSS 中的层次结构
    & .addTransaction {
      /* ... */
      column-gap: 5px;
    
      /* ... */
      & .buySell { 
        display: contents;
    
        & button {
          width: 100%;
        }
      }
    }