效果

前言

以前用过 lightbox2 和 fancyapps.

lightbox2 已经没有维护了.

fancyapps 改版好多次了. v2, v3 现在 v4 已经开始收费了.

PhotoSwipe 目前最火, 下载量最大. 今年三月才推出新版. 虽然还没有用 TypeScript 重写, 但至少是 ES Module 也有 .d.ts 了. 算有跟着时代走.

还有一个叫 lightGallery.js 也是要付费的.

参考

官网 Docs – photoswipe.com

Get Started

我这里用 esbuild + Yarn classic 做 demo.

安装

yarn add photoswipe

它自带 .d.ts 所以不需要另外安装 @types 了.

HTML 引入 CSS

因为没有用 bundle tools 所以直接从 node_module 拉出来就好.

<link
rel="stylesheet"
href="./node_modules/photoswipe/dist/photoswipe.css"
/>

用 bundle tools 是这样

import 'photoswipe/style.css';

HTML Data Elements

    <div
class="pswp-gallery pswp-gallery--single-column"
id="gallery--getting-started"
>
<a
href="https://cdn.photoswipe.com/photoswipe-demo-images/photos/2/img-2500.jpg"
data-pswp-width="1669"
data-pswp-height="2500"
target="_blank"
>
<img
src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/2/img-200.jpg"
alt=""
/>
</a>
<!-- cropped thumbnail: -->
<a
href="https://cdn.photoswipe.com/photoswipe-demo-images/photos/7/img-2500.jpg"
data-pswp-width="1875"
data-pswp-height="2500"
data-cropped="true"
target="_blank"
>
<img
src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/7/img-200.jpg"
alt=""
/>
Cropped
</a>
<!-- data-pswp-src with custom URL in href -->
<a
href="https://unsplash.com"
data-pswp-src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/3/img-2500.jpg"
data-pswp-width="2500"
data-pswp-height="1666"
target="_blank"
>
<img
src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/3/img-200.jpg"
alt=""
/>
</a>
<!-- Without thumbnail: -->
<a
href="http://example.com"
data-pswp-src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/5/img-2500.jpg"
data-pswp-width="2500"
data-pswp-height="1668"
target="_blank"
>
No thumbnail
</a>
<!-- wrapped with any element: -->
<div>
<a
href="https://cdn.photoswipe.com/photoswipe-demo-images/photos/6/img-2500.jpg"
data-pswp-width="2500"
data-pswp-height="1667"
target="_blank"
>
<img
src="https://cdn.photoswipe.com/photoswipe-demo-images/photos/6/img-200.jpg"
alt=""
/>
</a>
</div>
</div>

结构

首先是一个 container 里面包含了所有要展现在 modal 里的图片. 接着就是每一个图片 data 了.

最基本的 data 需要有 width, height, src 三个属性值.

这个是一种用 HTML provide data 的手法, 它还有一种是直接用 JS without HTML 的手法. 下面会讲到.

JavaScript

import PhotoSwipeLightbox from 'photoswipe/lightbox';

const lightbox = new PhotoSwipeLightbox({
gallery: '#gallery--getting-started',
children: 'a',
pswpModule: () => import('photoswipe'),
});
lightbox.init();

photoswipe/lightbox 和 photoswipe 是分开的 src, 目的是减少第一次加载的重量, photoswipe/lightbox 是立刻加载, photoswipe 则是在点击后才去加载.

PhotoSwipeLightbox 初始化后会去 select HTML 然后获取到 data sources, 这个 data sources 也可以直接通过 JS provide 哦. 下面会讲到.

TypeScript Issue

目前有一个 TypeScript Issue, 虽然例子是 Angular 但其实只要你用 TypeScript 都会遇到的. 没办法对这类 library 来说最少还需要 2 年才会完全拥抱 TypeScript 的.

解决方法是定义一个 photoswipe.d.ts 就可以了.

declare module 'photoswipe';
declare module 'photoswipe/lightbox';

同步 Swiper

JavaScript Library – Swiper 中, 我举例了一个 fully custom pagination 的例子.

如果想搭上 PhotoSwipe 那么需要加入一个同步的效果.

不然它是这样的

1. swiper index = 0

2. click to popup modal

3. slide to index 2

4. close popup modal

5. swiper index = 0 (没有做同步的话, 这里依然会是 0, 这不一定是期望的体验)

const lightbox = new PhotoSwipeLightbox({
gallery: '.swiper',
children: 'a',
pswpModule: () => import('photoswipe'),
});
lightbox.init();
lightbox.on('change', (e) => {
swiper.slideTo(lightbox.pswp!.currIndex);
});

参考:

Docs – Events

Docs – Methods

实现起来挺容易的

1. 监听 change

2. 调用 Swiper.slideTo

3. lightbox.pswp.currIndex 获取当前 index (这个 lightbox.pswp 就是 PhotoSwipe 实例)

How PhotoSwipe Work?

作为一个 Library, 我觉得 PhotoSwipe 设计的很好. 它没有封装许多上层的功能, 反而是给出了许多例子去实现这些功能.

比如 download,  fullscreen, caption, WebP

这样可以确保 Library 足够轻. 维护升级就相对轻松. 相对的, 对普罗大众来说可能就需要二次开发了. 但这个 trade-off 还是很值得学习的.

下面我们来看看它的几个重要接口.

1. Data Sources

参考: Docs – Data Sources

上面有提到, data sources 就是 without HTML. 直接通过 JS provide data.

因为 PhotoSwipe 的主要功能就是做 Modal 开启后的 gallery 游览. 其实只要有 data 就可以了. 开启 Modal 之前的图片并不在它的范围内.

首先是设定 options, 里面包含 dataSources

然后 import module, 最后通过 loadAndOpen 打开 Modal Gallery

2. addFilter

参考: Custom Content in Slides

PhotoSwipe 拿到 data sources 以后就要去 build modal gallery 了. 这时它提供了一些拦截接口.

你可以理解为 pipe 或者 middleware.

这 2 招就非常 customize.

1. numItems 直接修改了 data sources 的 length. 那么 loop 就多了

2. itemData, 可以改写输出的内容. 它直接给了一个 raw HTML.

整个就是无中生有, 动态的创建了 data sources. 非常灵活.

在一个例子 WebP

把 HTML dataset 的属性传入 itemData 中

在 contentLoadImage 的时候偷龙转风换成 <picture>

最后输出做好的 picture image

它的概念就是拦截然后替换输出.

其它 Customize

1. 增加操作按钮 e.g. download, autoplay :

参考: Adding UI elements, Methods

2. 换 Theme

Styling PhotoSwipe

3. video

direct support issue

实现 example

虽然没有直接支持, 但是可以通过类似 WebP 的方法做到

4. thumbnails and video

The Best Pop-up Galleries for Photography

这篇文章有提到, PhotoSwipe 和 lightGallery.js (要钱的) 的主要区别. 虽然是 2017 年的文章.

PhotoSwipe 缺失的主要功能是支持 video 和 thumbnials (开启 modal gallery 之后有一个 thumbnials list 让用户切换)

但就如上面提到的可以通过 Customize 的方式去实现. thumbnials list 的实现类似 Adding Navigation Indicator (bullets)

总结

整体使用体验还是很不错的, 如果没有特别要求基本上算是开箱即用了. 个人觉得如果有支持 video 那就更好了.

JavaScript Library – PhotoSwipe的更多相关文章

  1. A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net

    easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a develope ...

  2. Dynamices CRM JS 类库 神器 XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library

    XrmServiceToolkit - A Microsoft Dynamics CRM 2011 & CRM 2013 JavaScript Library http://xrmservic ...

  3. Raphaël—JavaScript Library

    Raphaël-JavaScript Library What is it? Raphaël is a small JavaScript library that should simplify yo ...

  4. a Javascript library for training Deep Learning models

    w强化算法和数学,来迎接机器学习.神经网络. http://cs.stanford.edu/people/karpathy/convnetjs/ ConvNetJS is a Javascript l ...

  5. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布

    JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布   研究了一年多的js,也差不多写一个自己的js库了.我写这个不算框架,只是一个小型的js工具 ...

  6. jQuery JavaScript Library v3.2.1

    /*! * jQuery JavaScript Library v3.2.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzle ...

  7. A JavaScript library for reading EXIF meta data from image files.

    exif-js/exif-js: JavaScript library for reading EXIF image metadata https://github.com/exif-js/exif- ...

  8. javascript library

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. 转:Build Your First JavaScript Library

    http://net.tutsplus.com/tutorials/javascript-ajax/build-your-first-javascript-library/ Step 1: Creat ...

  10. [React] 01 - Intro: javaScript library for building user interfaces

    教学视频: http://www.php.cn/code/8217.html React 教程: http://www.runoob.com/react/react-tutorial.html 本篇是 ...

随机推荐

  1. 记录荒废了三年的四年.net开发的第一次面试

    对象 身在成都小微企业,前两天面试深圳老牌金蝶公司.对我这个荒废了三年光影的人来说,怎一个跨度之大了得?作为人我生第一次面试的,整个面试过程,只能用诡异来形容这次感受.而结尾也是迷迷糊糊中草草收场. ...

  2. 深度解读昇腾CANN模型下沉技术,提升模型调度性能

    本文分享自华为云社区<深度解读昇腾CANN模型下沉技术,提升模型调度性能>,作者:昇腾CANN. AI模型的运行通常情况下需要CPU和NPU(昇腾AI处理器)等AI专用处理器协同工作,CP ...

  3. webpack性能优化方式之dll--- webpack.dll.config.js

    通常来说,我们的代码都可以至少简单区分成业务代码和第三方库.如果不做处理,每次构建时都需要把所有的代码重新构建一次,耗费大量的时间.然后大部分情况下,很多第三方库的代码并不会发生变更(除非是版本升级) ...

  4. 引入样式在Element UI (Vue 2)和Element Plus (Vue 3)中的不同

    引入样式 Element UI (Vue 2):   import 'element-ui/lib/theme-chalk/index.css'; Element Plus (Vue 3):   im ...

  5. 【JavaScript高级04】作用域和作用域链

    1,作用域 作用域表示的是变量的有效区域,JavaScript中作用域分为全局作用域和函数作用域(在es6之前没有块作用域).其确定时间为编写成功之后就已经确定好了. 作用域的作用是用来隔离变量,不同 ...

  6. Java代码实现七夕魔方照片墙

    创建一个七夕魔方照片墙是一个相对复杂的任务,涉及到前端展示和后端数据处理.在这里,我会提供一个简化的Java后端示例,用于生成一个模拟的"照片墙"数据模型,并给出一个基本的前端HT ...

  7. ceph 003 对osd操作 对存储池操作 存储池配额 存储池快照 pgp

    主机被加入集群时,会自动被分配角色以达到集群的默认状态.(mon,mgr之类) 想要超过默认状态可以进行设置 ceph容器与客户端 ceph集群的客户端 需要 ceph-common 软件包 ceph ...

  8. Mysql函数1-IFNULL

    IFNULL函数用于判断参数值是null时则返回指定内容. 原本 select goods_base_name,goods_id from goods where goods_id in (6,7,8 ...

  9. 【Vue2】金额范围查询项

    Element 只提供了DatePicker,没有做金额的Picker 这个东西就只能自己做了,实现效果: 后台接口条件: 因为有可能只有起始值,只有结束值,或者起始值结束值都有三种情况 1.如果有起 ...

  10. 【IDEA】找不到类资源

    报错问题描述: 找不到这个实例调用的方法或者方法缺失重载 找不到这个声明的类资源 解决情况一 import声明缺失,IDEA智能导包提示可以解决 注意,如果存在了重名的类资源,导入了错误的资源,实例引 ...