为什么在Core UI的Bootstrap CSS中使用'position: sticky'无效?

9

我正在尝试使用Core UI的react模板构建一个React仪表板。

CSS

.top-stick {
    position: sticky !important;
    position: -webkit-sticky;
    top: 5rem;
    overflow-y: auto;
    height: calc(100vh - 5rem);
}

JSX

<div className="animated fadeIn">
  <Row className="app-scrollable-body">
    <Col xs="12" sm="4" md="3" className="top-stick">
      <Card className="toic">
        <CardBody>
          Lorem ipsum dolor sit amet
        </CardBody>
      </Card>
    </Col>
    <Col xs="12" sm="8" md="9">
      <Card>
        <CardHeader>Card title</CardHeader>
        <CardBody>
        Lorem ipsum dolor sit amet
        </CardBody>
      </Card>
    </Col>
  </Row>
  <div className="app-fixed-footer">
    <span>
      <a href="https://coreui.io">CoreUI</a> &copy; 2018
      creativeLabs.
    </span>
    <span className="ml-auto">
      Powered by{" "}
      <a href="https://coreui.io/react">CoreUI for React</a>
    </span>
  </div>
</div>

但是在滚动时,卡片似乎无法固定。
检查 CSS 后发现 CSS 代码确实存在。并且 CSS 树中也没有 overflow: hidden 的设置。
图片链接:Dash
1个回答

17
问题在于在 .app-body 中使用了 overflow 属性。这有点棘手,但是应该不会将任何元素的 overflow 属性设置为具有滚动条和粘性元素之间的元素。以下是一个基本示例来说明。滚动条位于视口中,并且我们有一个带有 overflow:hidden(甚至是 auto)的包装器,因此粘性行为将无法正常工作。

.container {
  display:flex;
  align-items:flex-start;
  border:2px solid green;
}
.content {
  flex:1;
  height:200vh;
  background:red;
  margin:10px;
}
.sticky {
  flex:1;
  height:100px;
  background:blue;
  margin:10px;
  position:sticky;
  top:0;
}

.wrapper {
  overflow:hidden;
  border:2px solid red;
}
<div class="wrapper">
  <div class="container">
    <div class="sticky"></div>
    <div class="content"></div>
  </div>
</div>

如果我们移除溢出(overflow)属性,它将按预期工作:

.container {
  display:flex;
  align-items:flex-start;
  border:2px solid green;
}
.content {
  flex:1;
  height:200vh;
  background:red;
  margin:10px;
}
.sticky {
  flex:1;
  height:100px;
  background:blue;
  margin:10px;
  position:sticky;
  top:0;
}

.wrapper {
  border:2px solid red;
}
<div class="wrapper">
  <div class="container">
    <div class="sticky"></div>
    <div class="content"></div>
  </div>
</div>

如果我们将overflow设置在包装器内,但将滚动条移动到容器元素中,也可以起作用,因为在滚动和粘性元素之间没有设置溢出的元素。

.container {
  display:flex;
  align-items:flex-start;
  border:2px solid green;
  max-height:200px;
  overflow:auto;
}
.content {
  flex:1;
  height:200vh;
  background:red;
  margin:10px;
}
.sticky {
  flex:1;
  height:100px;
  background:blue;
  margin:10px;
  position:sticky;
  top:0;
}

.wrapper {
  overflow:hidden;
  border:2px solid red;
}
<div class="wrapper">
  <div class="container">
    <div class="sticky"></div>
    <div class="content"></div>
  </div>
</div>

相关链接:什么是“滚动框”?


在我的情况下,Bootstrap的类table-responsive中有overflow: auto - Francisco Gomes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接