【问题标题】:CSS horizontal scroll snap to TOP of a slideCSS水平滚动捕捉到幻灯片的顶部
【发布时间】:2022-01-05 13:33:41
【问题描述】:

(编辑:原帖中的 JS 被错误收录 - 现在已删除)

我的水平滚动条工作得很好。

问题是我的幻灯片是垂直可滚动的(这很好,因为有很多内容)这意味着当我向下滚动到幻灯片 1 的底部,然后水平滚动到幻灯片 2 时,视口确实会捕捉到幻灯片 2 的左侧,但视口位于幻灯片的底部。我希望视口也能捕​​捉到幻灯片 2 的顶部。

我无法找到解决此问题的方法,并且似乎只有 startendcenter 作为 scroll-snap-align 的工作值,但这并不能解决我的问题。

有人知道解决这个问题的方法吗?

参见下面的代码n-p。

#slidesContainer {
  height: auto;
  width: auto;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  position: relative;
  overflow: scroll;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
}

#slides {
  color: black;
  width: 100%;
  height: auto;
  font-size: 100px;
  position: static;
  flex-grow: 0;
  flex-shrink: 0;
  scroll-snap-align: start;
  scroll-snap-stop: always;
}
<div id="slidesContainer">
  <div id="slides" style="background-color:blue;">Slide 1<br><br> Scroll down until there is no more text, then scroll right text text text text text text text text text text text text text </div>
  <div id="slides" style="background-color:green;">Slide 2<br><br>This text is not visible unless you scroll back up - this is the problem.</div>
  <div id="slides" style="background-color:yellow;">Slide 3<br><br></div>
</div>

非常感谢。

【问题讨论】:

  • 在没有任何视觉效果的情况下很难理解你想说什么。你是否有一个视觉原型/线框/gif/屏幕截图来说明你想要完成什么以及你有什么结果?您也可以将您的 HTML/CSS/JS 代码放在 Runnable Snippet 中吗?你想让你的水平滚动是垂直滚动的吗?
  • @maiakd 我重新创建了一个简单的代码 sn-p。如果您在幻灯片 1 上向下滚动直到没有更多文本,然后水平滚动,您将看不到标题“幻灯片 2”,除非您滚动到顶部。我正在寻找一种让这种情况自动发生的方法。
  • 重复使用ID无效。不唯一的 ID 不会识别任何内容。改用类,这是更好的做法。

标签: javascript html css horizontal-scrolling


【解决方案1】:

如果我对您的理解正确,这应该可以正常工作。本质上,我通过 CSS 在注释 /* manual scrollbar */ 下添加了一个自定义滚动条。你可以随心所欲地设计它,但我只是让它变得基本。然后,您可以使用 transform: rotateX(180deg); 将水平滚动条置于元素顶部。我在 CSS 中添加的注释应该会有所帮助。

#slidesContainer {
  height: 100vh;
  width: auto;
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  position: relative;
  overflow: scroll;
  /* important for manual scrollbar to show */
}

#slides {
  color: black;
  width: 100%;
  height: 100%;
  font-size: 100px;
  position: static;
  flex-grow: 0;
  flex-shrink: 0;
}


/* manual scrollbar */

#slidesContainer::-webkit-scrollbar {
  -webkit-appearance: none;
  width: 0px;
}

#slidesContainer::-webkit-scrollbar-thumb {
  border-radius: 4px;
  background-color: rgba(0, 0, 0, .5);
  box-shadow: 0 0 1px rgba(255, 255, 255, .5);
}


/* Puts scrollbar at top */

div#slidesContainer {
  transform: rotateX(180deg);
}

div#slidesContainer * {
  transform: rotateX(180deg);
}


/* for good measures */

body {
  margin: 0;
}
<div id="slidesContainer">
  <div id="slides" style="background-color:blue;">Slide 1<br><br> text text text text text text text text text text text text text </div>
  <div id="slides" style="background-color:green;">Slide 2<br><br></div>
  <div id="slides" style="background-color:yellow;">Slide 3<br><br></div>
</div>

【讨论】:

  • 感谢您的回答卡梅隆。我不需要水平滚动条。对不起,如果我没有把问题说清楚。我已经更新了代码 sn-p 所以希望它更清楚。问题在于水平滚动捕捉。当我在幻灯片 1(蓝色)上向下滚动,然后向右滚动到幻灯片 2(绿色)时,它会保持垂直滚动位置。当我向右滚动时,我希望它指向scroll-snap-align: start;,并且我还希望它捕捉到幻灯片的顶部,这样用户就不会错过幻灯片顶部的文本。希望这是有道理的。
  • @AndyS 在我再次回答之前,我想确保我们相对在同一页面上。您能否分享所需目标的屏幕截图或标记图像?我还是有点迷茫。
  • 感谢您的耐心等待!我做了一个水平滚动(请参见代码 sn-p),它的 CSS 代码 scroll-snap-align:start; 在水平滚动时将视口捕捉到幻灯片的左侧。如幻灯片 1 所示,场景是一张幻灯片上有很多文本,因此用户能够垂直滚动。假设用户滚动到幻灯片 1 的底部,然后水平滚动,视口停留在底部。我基本上想要的是让视口始终捕捉到幻灯片的顶部 - 而不仅仅是幻灯片的左侧。 Lmk 如果这足够了。
  • 知道如何解决这个问题吗?
  • @AndyS 正在制作一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多