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

前言

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

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

首先,让我们创建一个容器和其中的子 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 或其他混乱的东西。

相关推荐
专注前端30年8 分钟前
在日常开发项目中Vue与React应该如何选择?
前端·vue.js·react.js
进击的野人29 分钟前
Vue 组件与原型链:VueComponent 与 Vue 的关系解析
前端·vue.js·面试
馬致远37 分钟前
Vue todoList案例 优化之本地存储
前端·javascript·vue.js
3秒一个大2 小时前
现代前端开发框架的工程化实践:基于 Vite 与 Vue3
vue.js
小信丶3 小时前
解决 pnpm dev 报错:系统禁止运行脚本的问题
前端·vue.js·windows·npm
苏打水com3 小时前
第十六篇:Day46-48 前端安全进阶——从“漏洞防范”到“安全体系”(对标职场“攻防实战”需求)
前端·javascript·css·vue.js·html
AY呀3 小时前
Vite:现代前端构建工具的革命与实战指南
前端·vue.js·vite
重铸码农荣光3 小时前
用AI把猫主子变成冰球猛将?我搞了个“宠物拟人化”神器,结果……它真敢打!
vue.js·低代码·coze
m0_740043735 小时前
3、Vuex-Axios-Element UI
前端·javascript·vue.js
鹏北海5 小时前
微信扫码登录 iframe 方案中的状态拦截陷阱
前端·javascript·vue.js