css网格中单行和单列的粘滞区域

rwqw0loc  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(86)

我面临的问题是,在CSS网格中只允许一个区域具有粘性。
在代码中看起来如何:

.wrapper {
    display: grid;
    gap: 32;
    grid-template-columns: 1fr 478px;
    grid-template-areas:
        'Images Details'
        'Tabs Tabs';
}
.child1 {
    grid-area: Images;
}
.child2 {
    align-self: flex-start;
    grid-area: Details;
    position: sticky;
    top: 0;
}
.child3 {
    grid-area: Tabs;
}

因此,Images部分比Details大得多(更大的高度),我想实现的是在向下滚动时使Details具有粘性,但一旦我到达Images的底部,它应该停止向下移动。目前,区域ImagesTabs重叠,因为它对 Package 器来说是粘性的。
有办法解决吗?
演示https://stackblitz.com/edit/web-platform-a8znlr?file=styles.css

8yparm6h

8yparm6h1#

我想这会解决你的问题。

.wrapper {
  display: grid;
  gap: 32px;
  grid-template-columns: 1fr 478px;
  grid-template-areas:
    'Images Details'
    'Tabs Tabs';
}

.child1 {
  grid-area: Images;
  display: flex;
  flex-wrap: wrap;
}

.child1 img {
  width: 350px;
  height: 200px;
  margin-bottom: 16px;
}

.child2 {
  grid-area: Details;
  position: sticky;
  top: 0;
}

.child3 {
  grid-area: Tabs;
}

.child2 img {
  width: 350px;
  height: 200px;
  margin-bottom: 16px;
}
cnwbcb6i

cnwbcb6i2#

你所要求的解决方案不能用纯css和html来实现,但是你可以用一些JavaScript来实现:

window.addEventListener('DOMContentLoaded', () => {
  const images = document.querySelector('.child1');
  const details = document.querySelector('.child2');

  const handleScroll = () => {
    const imagesRect = images.getBoundingClientRect();
    const detailsHeight = details.offsetHeight;

    if (imagesRect.bottom - detailsHeight < 0) {
      details.style.position = 'absolute';
      details.style.top = `${images.offsetHeight - detailsHeight}px`;
    } else {
      details.style.position = 'sticky';
      details.style.top = '0';
    }
  };

  window.addEventListener('scroll', handleScroll);
});

相关问题