【问题标题】:HTML: Scroll line by lineHTML:逐行滚动
【发布时间】:2022-06-29 11:46:06
【问题描述】:

我有一个包含可变数量列表项的无序列表。 <ul> 的高度是固定的(实际上是单行文本的高度)并设置为overflow-y: scroll

当我滚动鼠标滚轮时,会经过一定的垂直距离。我想让它逐行滚动,以确保<li> 始终正确居中在<ul> 的可见部分。

错误行为:

:root {
  --default-line-height: 24px;
}

.myUl {
  background-color: lightblue;
  height: var(--default-line-height);
  list-style-type: none;
  overflow-y: scroll;
  outline: 1px solid black;
}

.myLi {
  font-size: var(--default-line-height);
}
<ul class="myUl">
  <li class="myLi">Lorem ipsum dolor sit amet</li>
  <li class="myLi">Aenean commodo ligula eget dolor.</li>
  <li class="myLi">Cum sociis natoque penatibus</li>
  <li class="myLi">Donec quam felis, ultricies nec</li>
  <li class="myLi">Nulla consequat massa quis enim.</li>
  <li class="myLi">Donec pede justo, fringilla vel</li>
  <li class="myLi">In enim justo, rhoncus ut</li>
</ul>

<p>Please scroll the blue area.</p>

我玩过scroll-snap,但没有真正成功。动画“感觉”很尴尬,它仍然滚动多行。我可能可以用scroll 构建一些东西,但这似乎不必要地麻烦。

在某些条件下能够逐行滚动似乎是合理的。类似列表的控件(例如下拉菜单)在许多框架中都显示了这种行为。我不会认为这需要的不仅仅是一些聪明的 css...


更新: 下面的Feroz’s answer 仅解决了问题的捕捉方面。仍然可以一次滚动多行。

【问题讨论】:

  • "[It] 感觉很尴尬" 这可能是因为一开始就修改默认滚动行为是糟糕的用户体验,因为你迫使用户放弃控制如何他们希望首先查看您的内容。在没有特别好的理由的情况下偏离这样的既定规范通常不是一个好主意。
  • @esqew 绝对正确!但我尝试输出某种日志。让列表项偏离中心也不是特别好的用户体验。

标签: javascript html css


【解决方案1】:

请检查我的 sn-p。现在你可以逐行滚动了。

:root {
  --default-line-height: 28px;
}

.myUl {
  background-color: lightblue;
  height: var(--default-line-height);
  list-style-type: none;
  overflow-y: scroll;
  outline: 1px solid black;
  scroll-snap-type: y mandatory;
}

.myLi {
  font-size: 24px;
  line-height: var(--default-line-height);
  scroll-snap-align: start;
  scroll-snap-stop: normal;
}
<ul class="myUl">
  <li class="myLi">Lorem ipsum dolor sit amet</li>
  <li class="myLi">Aenean commodo ligula eget dolor.</li>
  <li class="myLi">Cum sociis natoque penatibus</li>
  <li class="myLi">Donec quam felis, ultricies nec</li>
  <li class="myLi">Nulla consequat massa quis enim.</li>
  <li class="myLi">Donec pede justo, fringilla vel</li>
  <li class="myLi">In enim justo, rhoncus ut</li>
</ul>

<p>Please scroll the blue area.</p>

【讨论】:

  • 旁注:如果您使用鼠标滚轮滚动,这可能不起作用,因为这取决于您的滚动设置(速度、行数等)
  • 这里对我有用。不知道为什么不适合你。
  • @Reyno 这里工作正常。
  • @Feroz 这很快。我现在觉得很愚蠢:) 有可能微调那个小动画吗? mdn 文章有点含糊:“指定用于强制执行这些捕捉点的任何精确动画或物理特性不在此属性范围内,而是由用户代理决定。”
  • @cl10k 你引用的内容一点也不含糊;它表明它不是您可以使用 CSS 控制的东西,并且每个浏览器都有自己的动画捕捉点的方式。
【解决方案2】:

https://css-tricks.com/practical-css-scroll-snapping/找到解决方案

<div class="container">
  <section class="child"></section>
  <section class="child"></section>
  <section class="child"></section>
  <p>...</p>
</div>

.container {
  scroll-snap-type: y mandatory;
}

.child {
  scroll-snap-align: start;
}

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多