使用 Flickity 创建响应式、触控友好的轮播图

Avatar of David DeSandro
David DeSandro 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

现在,任何关于轮播图的文章都应该附带免责声明:您可能不需要轮播图。 轮播图很容易被滥用。 Kyle Peatt 有更多关于 轮播图争议的细节。

部分原因可以归咎于轮播图插件本身的用户体验。滚动浏览轮播图不如简单地向下滚动页面那样令人满意且更自然。基本上,你无法快速滑动它们。第三方库至少应该与原生行为一样有用。

除了不友好用户外,大多数轮播图插件还有许多对开发人员不友好的痛点。因为它们是用 JavaScript 配置的,所以更改其他断点的配置通常很困难。这些轮播图库可能会阻碍开发人员进行响应式设计。

我创建了 Flickity 来解决这两个问题。对于您的用户来说,Flickity 的轮播图滑动起来很有趣。Flickity 使用基于物理的动画,因此拖动和滑动感觉很自然。对于您来说,Flickity 的轮播图易于实现。Flickity 旨在灵活,允许您利用您自己的 CSS 来响应地为您的轮播图设置样式。

Flickity animated example

使用 Flickity

要使用 Flickity,首先将它的 .css.js 文件添加到您的页面或资源管道中。

<head>
  <!-- other head stuff... -->
  <link rel="stylesheet" href="/path/to/flickity.css" media="screen">
</head>
<body>
  <!-- all your great html... -->
  <script src="/path/to/flickity.pkgd.min.js"></script>
</body>

Flickity 在一个包含轮播图或画廊元素的容器中工作,该容器包含一组单元格元素。

<div class="main-gallery">
  <div class="gallery-cell">...</div>
  <div class="gallery-cell">...</div>
  <div class="gallery-cell">...</div>
  ...
</div>

您可以通过多种方式初始化 Flickity。您可以将 Flickity 作为 jQuery 插件使用:$('selector').flickity()

$('.main-gallery').flickity({
  // options
  cellAlign: 'left',
  contain: true
});

您可以使用原生 JS 与 Flickity 一起使用

var flkty = new Flickity( '.main-gallery', {
  // options
  cellAlign: 'left',
  contain: true
});

您可以在 HTML 中方便地初始化 Flickity,无需编写任何 JavaScript。将 js-flickity 添加到画廊元素的类中。选项可以使用 JSON 格式的 data-flickity-options 属性设置。如果您没有使用 JS 添加其他行为,我建议使用 HTML 初始化。

<div class="main-gallery js-flickity"
  data-flickity-options='{ "cellAlign": "left", "contain": true }'>

设置 Flickity 的样式

您可以使用您自己的 CSS 以任何您喜欢的方式调整单元格的大小和样式。Flickity 提供了一个容器元素,以便可以使用百分比宽度来调整单元格元素的大小——在 JS 中无需进行大小配置,只需使用您习惯的普通 % 值即可。画廊的高度设置为单元格的最大高度。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – 全宽单元格@desandro)。

(因为嵌入的 Pen 位于 iframe 中,您将无法拖动到演示窗口之外。但是,它很酷——拖动在普通页面上有效。)

因为单元格的大小和样式是使用 CSS 设置的,所以您可以使用媒体查询来显示不同断点下的不同单元格数量。尝试 调整此媒体查询 Pen 的大小 以查看其运行效果。

/* full width cells by default */
.gallery-cell {
  width: 100%;
}

@media screen and ( min-width: 768px ) {
  /* half-width cells for larger devices */
  .gallery-cell { width: 50%; }
}

甚至之前的和下一个按钮以及页面点都是可样式化的。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – 自定义上一个/下一个按钮和页面点样式@desandro)。

Flickity 会向选定的单元格添加一个 is-selected 类。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – is-selected 类@desandro)。

您可以使用 is-selected 类来实现一些令人印象深刻的过渡效果。此图片库会使相邻单元格变暗和模糊。图像使用弹性盒 CSS 居中于单元格内。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – 带有选中样式的图片库@desandro)。

这就是全部内容。Flickity 创建了触控友好、可滑动的轮播图,这些轮播图可以使用 CSS轻松设置样式。其他所有内容都是根据您的愿景微调您的实现..

Flickity 选项

Flickity 通过其 选项 启用了更多不错的功能。以下是我最喜欢的几个。

wrapAround: true 将单元格环绕到另一端,因此您可以继续滑动而不会碰到末端。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – wrapAround@desandro)。

freeScroll: true 使单元格能够自由滚动和滑动,而无需将单元格对齐到末端位置。好好滑动一下吧!

查看 David DeSandro 在 CodePen 上的 Pen Flickity – freeScroll@desandro)。

结合启用 freeScrollwrapAround,感觉您可以永远滑动下去。

查看 David DeSandro 在 CodePen 上的 Pen Flickity – freeScroll、wrapAround@desandro)。

您可以设计这样的布局:在某些断点下启用 Flickity,而在其他断点下禁用 Flickity。使用 watchCSS: true,Flickity 会监视画廊元素的 :after 的内容。如果 :after 内容为“flickity”,则启用 Flickity。

/* enable Flickity by default */
.gallery:after {
  content: 'flickity';
  display: none; /* hide :after */
}

@media screen and ( min-width: 768px ) {
  /* disable Flickity for large devices */
  .gallery:after {
    content: '';
  }
}

尝试调整 watchCSS Pen 的大小 以查看其运行效果。

这是一个非常酷的功能,因为它可以避免您在窗口调整大小时编写笨拙的 JavaScript 代码。由于启用是通过 CSS 触发的,因此可以将您的媒体查询逻辑全部保存在一个地方。

除了选项之外,Flickity 还具有功能齐全的 API,其中包含有用的方法、属性和事件。Flickity 的 API 允许您在其基本功能之上构建,因此可以与您网站中的其他小部件和行为结合使用。


确实,您可能不需要轮播图。但是,如果您需要,则应该使用一个既能帮助您的用户又能帮助您自己的轮播图。Flickity 易于实现且灵活易用。使用 Flickity 可以创建与您的设计无缝融合的轮播图、画廊和滑块。我希望 Flickity 能让开发人员利用轮播图来创建引人入胜的用户体验。如果没有别的,滑动它们也挺有趣的。