【JavaScript 插件】图片展示插件 PhotoSwipe 初识
前言:
考虑自己网站的图片展示,而且要支持移动端和PC端。自己写的代码也不尽如意,要写好的话也需要时间,于是就想到了使用相关插件。
准备:
PhotoSwipe 官网地址:http://photoswipe.com/
英语还可以的同学可以看官方文档学习:http://photoswipe.com/documentation/getting-started.html
下载对应的几个CSS、JS文件就可以了:https://github.com/dimsemenov/PhotoSwipe/tree/master/dist
正文:
进入正题,我们先把下载的文件添加到项目里面,然后就可以下面的步骤了。
1.引用JS、CSS文件
- <link href="photoswipe.css" rel="stylesheet" />
- <link href="default-skin/default-skin.css" rel="stylesheet" />
- <script src="photoswipe.min.js"></script>
- <script src="photoswipe-ui-default.min.js"></script>
2.添加 PhotoSwipe 的图片展示窗口的 HTML 代码
- <!-- Root element of PhotoSwipe. Must have class pswp. -->
- <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
- <!-- Background of PhotoSwipe.
- It's a separate element, as animating opacity is faster than rgba(). -->
- <div class="pswp__bg"></div>
- <!-- Slides wrapper with overflow:hidden. -->
- <div class="pswp__scroll-wrap">
- <!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
- <div class="pswp__container">
- <!-- don't modify these 3 pswp__item elements, data is added later on -->
- <div class="pswp__item"></div>
- <div class="pswp__item"></div>
- <div class="pswp__item"></div>
- </div>
- <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
- <div class="pswp__ui pswp__ui--hidden">
- <div class="pswp__top-bar">
- <!-- Controls are self-explanatory. Order can be changed. -->
- <div class="pswp__counter"></div>
- <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
- <button class="pswp__button pswp__button--share" title="Share"></button>
- <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
- <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
- <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
- <!-- element will get class pswp__preloader--active when preloader is running -->
- <div class="pswp__preloader">
- <div class="pswp__preloader__icn">
- <div class="pswp__preloader__cut">
- <div class="pswp__preloader__donut"></div>
- </div>
- </div>
- </div>
- </div>
- <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
- <div class="pswp__share-tooltip"></div>
- </div>
- <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
- </button>
- <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
- </button>
- <div class="pswp__caption">
- <div class="pswp__caption__center"></div>
- </div>
- </div>
- </div>
- </div>
3.初始化
我们先简单的了解下,这个通过 JS 进行初始化,图片信息使用指定的两个图片文件信息:
- var openPhotoSwipe = function () {
- var pswpElement = document.querySelectorAll('.pswp')[0];
- // build items array
- var items = [
- {
- src: 'https://farm2.staticflickr.com/1043/5186867718_06b2e9e551_b.jpg',
- w: 964,
- h: 1024
- },
- {
- src: 'https://farm7.staticflickr.com/6175/6176698785_7dee72237e_b.jpg',
- w: 1024,
- h: 683
- }
- ];
- // define options (if needed)
- var options = {
- // history & focus options are disabled on CodePen
- history: false,
- focus: false,
- showAnimationDuration: 0,
- hideAnimationDuration: 0
- };
- var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
- gallery.init();
- };
- openPhotoSwipe();
这样简单的效果就出来了。
演示地址:http://www.ycdoit.com/plugins/photoswipe/index1.html
页面源代码:https://github.com/YeXiaoChao/yexiaochao.github.io/blob/master/plugins/PhotoSwipe/index1.html
进阶:
但是如果我们不希望在 JS 设置图片信息,而是直接在 HTML 文件里面生成图片代码,然后点击的时候展示图片。
首先我们要知道, PhotoSwipe 添加自己的属性到这个图片对象的代码如下所示:
- var slides = [
- // slide 1
- {
- src: 'path/to/image1.jpg', // path to image
- w: 1024, // image width
- h: 768, // image height
- msrc: 'path/to/small-image.jpg', // small image placeholder,
- // main (large) image loads on top of it,
- // if you skip this parameter - grey rectangle will be displayed,
- // try to define this property only when small image was loaded before
- title: 'Image Caption' // used by Default PhotoSwipe UI
- // if you skip it, there won't be any caption
- // You may add more properties here and use them.
- // For example, demo gallery uses "author" property, which is used in the caption.
- // author: 'John Doe'
- },
- // slide 2
- {
- src: 'path/to/image2.jpg',
- w: 600,
- h: 600
- // etc.
- }
- // etc.
- ];
图片数组列表的HTML代码是这样的:
- <div class="my-gallery" itemscope itemtype="http://schema.org/ImageGallery">
- <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
- <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400">
- <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" />
- </a>
- <figcaption itemprop="caption description">Image caption</figcaption>
- </figure>
- <figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject">
- <a href="large-image.jpg" itemprop="contentUrl" data-size="600x400">
- <img src="small-image.jpg" itemprop="thumbnail" alt="Image description" />
- </a>
- <figcaption itemprop="caption description">Image caption</figcaption>
- </figure>
- </div>
然后我们通过 JS 把图片属性信息绑定起来:
- var initPhotoSwipeFromDOM = function(gallerySelector) {
- // parse slide data (url, title, size ...) from DOM elements
- // (children of gallerySelector)
- var parseThumbnailElements = function(el) {
- var thumbElements = el.childNodes,
- numNodes = thumbElements.length,
- items = [],
- figureEl,
- linkEl,
- size,
- item;
- for(var i = 0; i < numNodes; i++) {
- figureEl = thumbElements[i]; // <figure> element
- // include only element nodes
- if(figureEl.nodeType !== 1) {
- continue;
- }
- linkEl = figureEl.children[0]; // <a> element
- size = linkEl.getAttribute('data-size').split('x');
- // create slide object
- item = {
- src: linkEl.getAttribute('href'),
- w: parseInt(size[0], 10),
- h: parseInt(size[1], 10)
- };
- if(figureEl.children.length > 1) {
- // <figcaption> content
- item.title = figureEl.children[1].innerHTML;
- }
- if(linkEl.children.length > 0) {
- // <img> thumbnail element, retrieving thumbnail url
- item.msrc = linkEl.children[0].getAttribute('src');
- }
- item.el = figureEl; // save link to element for getThumbBoundsFn
- items.push(item);
- }
- return items;
- };
- // find nearest parent element
- var closest = function closest(el, fn) {
- return el && ( fn(el) ? el : closest(el.parentNode, fn) );
- };
- // triggers when user clicks on thumbnail
- var onThumbnailsClick = function(e) {
- e = e || window.event;
- e.preventDefault ? e.preventDefault() : e.returnValue = false;
- var eTarget = e.target || e.srcElement;
- // find root element of slide
- var clickedListItem = closest(eTarget, function(el) {
- return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
- });
- if(!clickedListItem) {
- return;
- }
- // find index of clicked item by looping through all child nodes
- // alternatively, you may define index via data- attribute
- var clickedGallery = clickedListItem.parentNode,
- childNodes = clickedListItem.parentNode.childNodes,
- numChildNodes = childNodes.length,
- nodeIndex = 0,
- index;
- for (var i = 0; i < numChildNodes; i++) {
- if(childNodes[i].nodeType !== 1) {
- continue;
- }
- if(childNodes[i] === clickedListItem) {
- index = nodeIndex;
- break;
- }
- nodeIndex++;
- }
- if(index >= 0) {
- // open PhotoSwipe if valid index found
- openPhotoSwipe( index, clickedGallery );
- }
- return false;
- };
- // parse picture index and gallery index from URL (#&pid=1&gid=2)
- var photoswipeParseHash = function() {
- var hash = window.location.hash.substring(1),
- params = {};
- if(hash.length < 5) {
- return params;
- }
- var vars = hash.split('&');
- for (var i = 0; i < vars.length; i++) {
- if(!vars[i]) {
- continue;
- }
- var pair = vars[i].split('=');
- if(pair.length < 2) {
- continue;
- }
- params[pair[0]] = pair[1];
- }
- if(params.gid) {
- params.gid = parseInt(params.gid, 10);
- }
- return params;
- };
- var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
- var pswpElement = document.querySelectorAll('.pswp')[0],
- gallery,
- options,
- items;
- items = parseThumbnailElements(galleryElement);
- // define options (if needed)
- options = {
- // define gallery index (for URL)
- galleryUID: galleryElement.getAttribute('data-pswp-uid'),
- getThumbBoundsFn: function(index) {
- // See Options -> getThumbBoundsFn section of documentation for more info
- var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
- pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
- rect = thumbnail.getBoundingClientRect();
- return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
- }
- };
- // PhotoSwipe opened from URL
- if(fromURL) {
- if(options.galleryPIDs) {
- // parse real index when custom PIDs are used
- // http://photoswipe.com/documentation/faq.html#custom-pid-in-url
- for(var j = 0; j < items.length; j++) {
- if(items[j].pid == index) {
- options.index = j;
- break;
- }
- }
- } else {
- // in URL indexes start from 1
- options.index = parseInt(index, 10) - 1;
- }
- } else {
- options.index = parseInt(index, 10);
- }
- // exit if index not found
- if( isNaN(options.index) ) {
- return;
- }
- if(disableAnimation) {
- options.showAnimationDuration = 0;
- }
- // Pass data to PhotoSwipe and initialize it
- gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
- gallery.init();
- };
- // loop through all gallery elements and bind events
- var galleryElements = document.querySelectorAll( gallerySelector );
- for(var i = 0, l = galleryElements.length; i < l; i++) {
- galleryElements[i].setAttribute('data-pswp-uid', i+1);
- galleryElements[i].onclick = onThumbnailsClick;
- }
- // Parse URL and open gallery if it contains #&pid=3&gid=1
- var hashData = photoswipeParseHash();
- if(hashData.pid && hashData.gid) {
- openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true );
- }
- };
- // execute above function
- initPhotoSwipeFromDOM('.my-gallery');
我们把自己的图片信息根据模板修改下,然后把前面的图片展示代码放在一起就行了。
演示地址:http://www.ycdoit.com/plugins/photoswipe/index2.html
页面源代码:https://github.com/YeXiaoChao/yexiaochao.github.io/blob/master/plugins/PhotoSwipe/index2.html
接着根据自己的页面需求,相对应的修改代码就可以了。
因为并不需要太复杂的功能,解决了自己的问题,就没有继续研究了。需要深入了解的同学,可以看看官方文档。
【JavaScript 插件】图片展示插件 PhotoSwipe 初识的更多相关文章
- jq图片展示插件highslide.js简单dom
今天用用了一款图片展示插件highslide.js,感觉用起来很是舒畅,几乎不用怎么写代码,只需要知道如何写参数就行了. 那么这么牛叉的插件我们该如何用哪,下面我就跟大家讲解一下. 一.引入 首先 ...
- PhotoSwipe图片展示插件
这个插件相当棒!功能也很强大,可以自行体会. 官方网址:http://www.photoswipe.com/ github地址:https://github.com/codecomputerlove/ ...
- 强大的图片展示插件,JQuery图片预览展示插件
只需要引入JQuery.js , viewer.css 和 viewer.js <!DOCTYPE html> <html lang="en"> <h ...
- Lightbox 图片展示插件
html <a href="<?php echo RESOURCES_BASE_FOLDER;?>image/default_pic.jpg" target=&q ...
- PhotoSwipe.js 相册展示插件学习
PhotoSwipe.js官网:http://photoswipe.com/,在这个网站上可以下载到PhotoSwipe的文件以及相关的例子. 这个组件主要是用来展示图片.相册用的,还是很实用的. 一 ...
- 十个jQuery图片画廊插件推荐
jQuery的画廊插件可以将分组图像和多媒体资料转成类似Flash的图像或照片.当幻灯片已经成为网站的重要组成部分,jQuery的重要性不能被忽视.下面为你介绍了10个最有美感,创新性和创造性的jQu ...
- 使用iScroll和photoswipe写手机浏览图片的插件的几点经验
首先,当我知道我得到一个任务需要写一个在手机上能浏览图片的插件时,我第一想到了iScroll.它的左右滑动,上下滑动的效果在安卓手机上也能让用户有良好的体验,自己写也能方便控制. 我的需求是,插件要能 ...
- jQuery图片组展示插件----Galleria使用简介
1.技术目标 掌握Galleria插件的基本操作 2.Galleria简介 Galleria是一个jQuery插件,可用于展示多张图片,操作也比较简单, 展示效果也非常不错,如图: 提示:Galler ...
- 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示
在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...
随机推荐
- BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树
原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...
- youDao
2018-09-22Journeys end in lovers' meeting.漂泊止于爱人的相遇. All extremes of feeling are allied with madness ...
- Kafka的接口回调 +自定义分区、拦截器
一.接口回调+自定义分区 1.接口回调:在使用消费者的send方法时添加Callback回调 producer.send(new ProducerRecord<String, String> ...
- 解决资源id冲突
--摘自<android插件化开发指南> 1.一套完整的Android App打包流程(Gradle方案) 第一步:aapt.为res目录下的资源生成R.java文件,同时为Android ...
- datetime.timedelta类
datetime.timedelta对象代表两个时间之间的时间差,两个date或datetime对象相减就可以返回一个timedelta对象. Python中datetime模块中的timedelta ...
- Oracle Loop
1. LOOP - END LOOP - EXIT declare v_rlt ):; begin v_rlt:; loop dbms_output.put_line('loop'||v_rlt); ...
- 使用Admin监控
在springboot中,也提供了很全面的监控系统.这篇文章介绍一下springboot-admin监控springboot项目. 原来大致是这样的,springboot--admin--server ...
- PHP.ini 文件大小限制
post_max_size=80000000000M upload_max_filesize=2000000000M
- 10个非常有趣的Linux命令【转载】
Linux当中有很多比较有趣的命令,可以动手看看,很简单的. 1.rev命令 一行接一行地颠倒所输入的字符串. 运行: $rev 如输入:shiyanlou shiyanlou rev.jpg 2.a ...
- 最详细的Vuex教程
什么是Vuex? vuex是一个专门为vue.js设计的集中式状态管理架构.状态?我把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性. ...