scroll-marker轮播组件不再难

在开发轮播组件时,我们不仅要写每一屏的内容,还要写指示器的样式。每一屏都需要一个指示器,指示器的样式也需要写。还需要写指示器的点击事件,指示器数量还需要和内容的数量保持一致。

scroll-marker-group

scroll-marker-group 属性用于标记是否在滚动容器内生成伪元素 ::scroll-marker-group,以及生成的位置。

html 复制代码
<ul class="scroll-container">
  <li class="scroll-target"></li>
  <li class="scroll-target"></li>
  <li class="scroll-target"></li>
  <li class="scroll-target"></li>
  <li class="scroll-target"></li>
</ul>

应用下面的样式后,滚动容器内会生成伪元素 ::scroll-marker-group

css 复制代码
.scroll-container {
  --width: 200px;
  width: var(--width);
  aspect-ratio: 2;
  scroll-marker-group: after;
  display: flex;
  overflow: hidden;

  .scroll-target {
    width: var(--width);
    height: 100%;
    flex-shrink: 0;
    background-color: attr(data-color type(<color>));
  }
}

但是现在还没有指示器,如下图,我们需要写指示器的样式。

css 复制代码
.scroll-container {
  --width: 200px;
  width: var(--width);
  aspect-ratio: 2;
  scroll-marker-group: after;
  display: flex;
  overflow: hidden;
  scroll-behavior: smooth;
  anchor-name: --refer;

  &::scroll-marker-group {
    display: flex;
    gap: 5px;
    position: absolute;
    position-anchor: --refer;
    bottom: calc(anchor(bottom) + 10px);
    justify-self: anchor-center;
  }

  .scroll-target {
    width: var(--width);
    height: 100%;
    flex-shrink: 0;
    background-color: attr(data-color type(<color>));

    &::scroll-marker {
      content: "";
      width: 10px;
      height: 10px;
      border: 1px solid black;
      border-radius: 50%;
    }
  }
}

如下图,这样就在滚动容器内下部边缘生成了指示器,且点击指示器可以滚动到对应的内容。是不是特别方便

但是这样的指示器无法看出来当前显示的是哪一个内容,我们需要通过:target-current伪类来标记当前显示的内容,添加特殊样式

css 复制代码
.scroll-target::scroll-marker:target-current {
  background-color: black;
}

如下图,这样就可以看到当前显示的是哪一个内容了。

除了上面提到的::scroll-marker-group::scroll-marker 还有::scroll-button 属性,它可以生成按钮,是轮播组件的上一个下一个按钮。这样就可以不需要写指示器。就不展示了

兼容性

chrome,edge已经支持了,其它浏览器还要再等等


文中除了scroll相关的,还用到anchorattr。感兴趣的可以留言讨论

相关推荐
Csvn25 分钟前
Monorepo 迁移血泪史:从 Multi-Repo 到 Turborepo,这 3 个坑我帮你踩完了
前端
星栈42 分钟前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
用户987409238871 小时前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端
风骏时光牛马1 小时前
Less前端工程化实战:变量混合器与项目样式分层落地
前端
假如让我当三天老蒯1 小时前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试
SameX1 小时前
iOS 独立开发实践:用 MapKit + 像素渲染实现 Citywalk 轨迹地图 App「雁过留痕」
前端
skyey1 小时前
页面加载时,深色模式闪白的问题解决
前端
IT_陈寒1 小时前
Java 并行流把我坑惨了,这6小时加班值了
前端·人工智能·后端
anOnion11 小时前
构建无障碍组件之Menu Button pattern
前端·html·交互设计
用户479492835691511 小时前
claude Fable用不了?把Gpt 5.5pro接到你的claude code里
前端·后端