网格容器第一行的奇怪行为

Weird behavior of first Row of a Grid Container

为了了解前端,我决定创建一个简单的计算器。使用 grid-layout 似乎是个好主意,因为内容在前期就众所周知,不会改变,而且我希望能够在垂直和水平方向上使用不同大小的按钮。 使用 4x6 网格,我可以根据需要布置所有内容。

为了更好地可视化我的问题,我为其创建了一个 Codepen.io。我的问题是,虽然我使用的是 grid-layout,但第一行的行高不同。

这是 CSS:

.calculator-grid-container {
      height: 70vh;
      width: 60vw;
      max-width: 50vh;
      border-style: solid;
      border-width: 3px;
      border-color: white;
      background-color:#2e323a;
      border-radius: 1%;
      box-shadow: 0 0 10px whitesmoke;
      /* grid container config */
      display: grid;
      grid-template-columns: auto auto auto auto;
      grid-gap: 0px;
      padding: 10px;
    }

我在 div 上设置 class 并在其中渲染按钮和显示:

render() {
    return (
      <div className='calculator-grid-container'>
        <Display current={this.state.current} formula={this.state.formula}></Display>

        <Button name='AC' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='/' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='*' handleButtonPressed={this.handleButtonPressed}></Button>

        <Button name='1' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='2' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='3' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='-' handleButtonPressed={this.handleButtonPressed}></Button>

        <Button name='4' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='5' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='6' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='+' handleButtonPressed={this.handleButtonPressed}></Button>

        <Button name='7' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='8' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='9' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='=' handleButtonPressed={this.handleButtonPressed}></Button>

        <Button name='0' handleButtonPressed={this.handleButtonPressed}></Button>
        <Button name='.' handleButtonPressed={this.handleButtonPressed}></Button>
      </div>
    );
  }

在按钮上,我使用 flex-layout 使文本居中:

.button {
  display: flex;
  justify-content: center; /* align horizontal */
  align-items: center; /* align vertical */
}

当然要让它们相应地跨度,例如:

.AC-button {
  grid-column-start: 1;
  grid-column-end: 3;
}

现在,我的问题是第一行,它是一个包含两个 p 元素的 div 容器:

render() {
    return (
      <div className='display'>
        <p className='formula'>
          {this.props.formula}
        </p>
        <p className='current' id='display'>
          {this.props.current}
        </p>
      </div>
    );
  }

他们的CSS:

.display {
  background-color: black;
  text-align: right;
  font-family: digital;
  padding: 5px 10px 0 0;
  /* grid config */
  grid-column-start: 1;
  grid-column-end: 5;
  /* flex-layout inside the div to align the p-elements */
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: right;
}

.formula {
  opacity: 0.5;
  overflow-wrap: break-word;
  word-wrap: break-word; 
}

.current {
  font-size: 46px;
}

上述方法的问题: 1. 第一行的高度(.display)似乎与其他所有行的高度不同。我希望所有行的高度完全相同。 2. .display 的大小似乎随着 .formula.currentfont-size 而变化,我不希望它在更改 [=25= 时变大] 包含 p 个元素。 3. 如果 .formula 元素为空(即 ''),.display 的大小会发生根本变化。如果 p 元素为空,则它似乎不存在。如果 p 元素为空,我不希望大小发生变化。

也许我遗漏了什么。有人可以帮忙吗?

.formulap-elem = '')的截图,注意高度:

非空屏幕截图 .formula,请注意不同的高度:

我提出了以下解决方案,它确实解决了上述所有问题(1. 所有行的高度都固定且相等,2. .display-div 的高度无论内容如何都不会变化.formula p-标签和 3. 不管 font-size 设置在它们上)。

grid-template-rows: repeat(6, 1fr);

这是创建 6 个 rows,每个占用可用空闲 space 的 1 个相等部分(使用 fr 的一个警告:空闲 space 是在之后计算的任何非弹性物品)。

很明显,我缺少的东西实际上是指定我希望所有行的高度相等的事实。

感谢@arieljuod 在评论中指出 p-标签上的默认 margins

p {
  margin-top: 0; /* remove default margins */
  margin-bottom: 0;  /* remove default margins */
  min-height: 25%; /* avoid dropping height to 0 for empty p-tags */
}

我注意到 p 标签在没有内容时仍然折叠为 0 的 height,即使 row-height 不再改变。这仍然会导致一种不干净的行为,即当上部 p 元素被重置为占用可用的 height 然后返回时,下部 p 元素 'jumping' 向上当设置上部 p-标签 height 时按下按钮,因此 height 被上部 p- 元素回收。

为了避免这种情况,我将 min-height: 25% 添加到 p 标签,所以现在 height 永远不会低于可用 space 的 25%,这避免了p-元素的上述行为。

这是现在的样子: