如何快速创建水平滚动容器

前言

作为前端开发者,越来越频繁地收到包含水平滚动组件的设计。这在移动端变得尤为常见,可以帮助减少密集页面的垂直高度。我们都见过下面类似的效果。

在构建了几个这样的组件并在质量保证过程中遇到了一些意外错误后,想找出如何仅使用最少的代码创建一个按预期在所有设备上工作的水平滚动器。

首先,让我们创建一个容器和其中的子 div 元素,使其能够水平滚动。HTML 代码非常简单:

html 复制代码
<div class="scrolling-wrapper">
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
  <div class="card"><h2>Card</h2></div>
</div>

有两种不同的方法可以使这些 div 元素水平滚动,选择哪一种可能取决于个人偏好和/或浏览器支持。

第一种方法:white-space

下面是需要的所有 CSS 代码。没有 vendor 前缀,没有 jQuery,只是简单地使用了 overflow 和一个你可能不熟悉的属性。

css 复制代码
.scrolling-wrapper {
  overflow-x: scroll;
  overflow-y: hidden;
  white-space: nowrap;
}

.card {
  display: inline-block;
}

对于容器,想要关闭垂直滚动 overflow-y,启用水平滚动 overflow-x。然后对于每个卡片,希望将其设置为 inline-block,以便它们都在一行显示。

有可能不熟悉的 CSS 属性是 white-space: nowrap。这个属性用于控制文本如何围绕容器换行。在这种情况下,想要通过使用 nowrap 来禁用换行。

就是这样。只用了四行 CSS 属性,就创建了一个水平滚动容器。

至于浏览器支持?常用浏览器完全没问题。除非想要适配 Internet Explorer 或 Edge。微软表示可能会在将来的 Edge 版本中包含该功能。但目前还不可用。

第二种方法:Flexbox

Flexbox 也可以实现这个效果。

css 复制代码
.scrolling-wrapper-flexbox {
  display: flex;
  flex-wrap: nowrap;
  overflow-x: auto;
}

.card {
  flex: 0 0 auto;
}

使用 flex-wrap 实现了与上面的 white-space 相同的效果。两个属性的作用没有实质区别。

Flexbox 解决方案的浏览器支持更好。需要为旧版浏览器添加一些 vertical 前缀,但至少这个解决方案在 IE 和 Edge 上可以工作。

溢出滚动

在 iOS 上,网页在上下滚动时会带有动量。如果快速向上或向下滑动手指,页面会在松开手指后继续滚动。如果达到页面的顶部或底部,页面会超过包装器的边界,并弹回原位。

对于水平元素,默认情况下,没有平滑滚动效果。

注意: 虽然前缀中包含 webkit,但这在 iOS 上最明显。

css 复制代码
.scrolling-wrapper {
  -webkit-overflow-scrolling: touch;
}

现在,我们的水平容器具有平滑滚动效果。以下是示例:

滚动条

默认情况下,具有滚动内容的容器会有滚动条。但是,出于用户体验或设计的目的,如果不希望出现滚动条,那也很简单。仅适用于 WebKit 浏览器。

css 复制代码
.scrolling-wrapper::-webkit-scrollbar {
  display: none;
}

总结

随着这种设计的越来越常见,可以将这些代码片段存起来,因为可能会不断的复用。由于这功能非常简单,可以将其包裹在媒体查询中,仅对某些设备显示水平滚动器,无需使用 jQuery 或其他混乱的东西。

相关推荐
大纽耶耶10 小时前
我把 YOLO 训练做成了网页版:需求设计与技术选型
vue.js
大纽耶耶10 小时前
开发 YOLO 训练管理平台的 23 个实践教训
vue.js
Maynor在掘金10 小时前
1.9 万 Star 的 Hypit:让 AI Agent 帮你“一键复刻”爆款视频,保姆级上手教程
vue.js·github
ym hyd 11110 小时前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
斯内普吖11 小时前
(开源)宠物饲养系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源·宠物
可乐鸡翅yeah_11 小时前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
Q264336502312 小时前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
ym hyd 11112 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设
vx_Biye_Design13 小时前
springboot小区管理系统68491-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
薛一半14 小时前
React-Redux三重优化实战揭秘
javascript·vue.js·react.js