/******************************************************************************** SYNCER 〜 知識、感動をみんなと同期(Sync)するブログ * 配布場所 https://syncer.jp/how-to-use-photoswipe * 最終更新日時 2015/08/17 00:05 * 作者 あらゆ ** 連絡先 Twitter: https://twitter.com/arayutw Facebook: https://www.facebook.com/arayutw Google+: https://plus.google.com/114918692417332410369/ E-mail: info@syncer.jp ※ バグ、不具合の報告、提案、ご要望など、お待ちしております。 ※ 申し訳ありませんが、ご利用者様、個々の環境における問題はサポートしていません。 ********************************************************************************/ /************************************************** PhotoSwipe (要jQuery) * 指定したクラス名で画像ギャラリーを構成する **************************************************/ var initPhotoSwipeFromDOM = function() { //クラス名の設定 var setClassSyncer = 'images'; //オプションの設定 var setOptionsSyncer = { history: 1, }; //[.images]が付いたエレメントを全て取得する var galleryElements = document.getElementsByClassName(setClassSyncer); var items = []; //コンテナを動的に生成する [めんどいので要jQuery…] $("body").append(''); //画像ギャラリーの作成 var parseThumbnailElements = function() { var figureEl,linkEl,size,item; for(var i=0,l=galleryElements.length; i < l; i++) { figureEl = galleryElements[i]; linkEl = figureEl.children[0]; size = linkEl.getAttribute("data-size").split("x"); items.push({ src: linkEl.getAttribute("href"), w: parseInt(size[0], 10), h: parseInt(size[1], 10), msrc: linkEl.children[0].getAttribute("src"), el: figureEl, title: linkEl.children[0].getAttribute("alt") }); } return items; }; //クリックイベントの設定 var onThumbnailsClick = function(e) { e = e || window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false; var eTarget = e.target || e.srcElement; //クリックしたのがIMG要素ならOK if(eTarget.tagName.toUpperCase() !== "IMG"){ return; } //イベントの伝播を停止 e.stopPropagation(); //クリックされたのが何番目の要素かを取得 //めんどいのでjQuery… var no = $(galleryElements).index(this); if(no >= 0) { openPhotoSwipe( no, galleryElements[no] , "" ); } return false; }; //PhotoSwipeの起動 var openPhotoSwipe = function(index, galleryElement, disableAnimation) { var pswpElement = document.querySelectorAll(".pswp")[0],gallery,options; //オプション options = setOptionsSyncer; options.index = index; options.getThumbBoundsFn = function(index) { var thumbnail = items[index].el.getElementsByTagName("img")[0], pageYScroll = window.pageYOffset || document.documentElement.scrollTop, rect = thumbnail.getBoundingClientRect(); return {x:rect.left, y:rect.top + pageYScroll, w:rect.width}; } //アニメーションを停止する場合 if(disableAnimation){ options.showAnimationDuration = 0; } gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); gallery.init(); }; //タッチイベントの設定 items = parseThumbnailElements(); for(var i = 0, l = galleryElements.length; i < l; i++) { galleryElements[i].setAttribute('data-pswp-uid', i+1); galleryElements[i].onclick = onThumbnailsClick; } //画像の固有リンクへのアクセス (URLアドレスの解析) 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); } if(!params.hasOwnProperty('pid')) { return params; } params.pid = parseInt(params.pid, 10); return params; }; //画像の固有リンクへのアクセス (PhotoSwipeの起動) var hashData = photoswipeParseHash(); if(hashData.pid > 0 && hashData.gid > 0) { openPhotoSwipe( hashData.pid - 1 , galleryElements[ hashData.gid - 1 ], true ); } } ; // PhotoSwipeを起動する initPhotoSwipeFromDOM() ;