photoswipe

ui-component carousel animation

PhotoSwipeは、モバイルとデスクトップの両方でタッチジェスチャをサポートする画像ギャラリーを実装できるシンプルで強力なJavaScriptギャラリーライブラリです。このライブラリは、パフォーマンスを最適化するためにCSS3を利用し、必要な機能のみを選択的に使用できるモジュラー構造を採用しています。

Latest Ver 5.4.4
Homepage
Github
0
24,596
📢 PhotoSwipeは、モバイルとデスクトップ用のタッチ対応画像ギャラリーライブラリです。
License: MIT
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe-lightbox.esm.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe-lightbox.esm.min.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe.esm.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe.esm.min.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/umd/photoswipe-lightbox.umd.min.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/umd/photoswipe.umd.min.js
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe.css
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe.min.css
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe-lightbox.esm.js.map
https://cdnjs.cloudflare.com/ajax/libs/photoswipe/5.4.4/photoswipe.esm.js.map

Sample Code

⚠️ import 文を含む一部のコードは、jsFiddleで正しく実行されない場合があります。エラーが発生した場合は、コードをコピーしてご自身の環境でお試しください。
📄 HTML
<div class='my-gallery' itemscope itemtype='http://schema.org/ImageGallery'>
  <figure itemprop='associatedMedia' itemscope itemtype='http://schema.org/ImageObject'>
    <a href='https://placekitten.com/800/600' itemprop='contentUrl' data-size='800x600'>
      <img src='https://placekitten.com/200/150' itemprop='thumbnail' alt='Image description' />
    </a>
    <figcaption itemprop='caption description'>Sample image 1</figcaption>
  </figure>
</div>

<div class='pswp' tabindex='-1' role='dialog' aria-hidden='true'>
  <div class='pswp__bg'></div>
  <div class='pswp__scroll-wrap'>
    <div class='pswp__container'>
      <div class='pswp__item'></div>
      <div class='pswp__item'></div>
      <div class='pswp__item'></div>
    </div>
    <div class='pswp__ui pswp__ui--hidden'>
      <div class='pswp__top-bar'>
        <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>
        <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>

🎨 External CSS
<link href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.3/photoswipe.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.3/default-skin/default-skin.css" rel="stylesheet">

🧩 External JS
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.3/photoswipe.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.3/photoswipe-ui-default.min.js"></script>

⚙️ JavaScript
document.addEventListener('DOMContentLoaded', function() {
  var initPhotoSwipeFromDOM = function(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];
        if(figureEl.nodeType !== 1) {
          continue;
        }
        linkEl = figureEl.children[0];
        size = linkEl.getAttribute('data-size').split('x');
        item = {
          src: linkEl.getAttribute('href'),
          w: parseInt(size[0], 10),
          h: parseInt(size[1], 10)
        };
        if(figureEl.children.length > 1) {
          item.title = figureEl.children[1].innerHTML;
        }
        if(linkEl.children.length > 0) {
          item.msrc = linkEl.children[0].getAttribute('src');
        }
        item.el = figureEl;
        items.push(item);
      }
      return items;
    };
    var closest = function closest(el, fn) {
      return el && (fn(el) ? el : closest(el.parentNode, fn));
    };
    var onThumbnailsClick = function(e) {
      e = e || window.event;
      e.preventDefault ? e.preventDefault() : e.returnValue = false;
      var eTarget = e.target || e.srcElement;
      var clickedListItem = closest(eTarget, function(el) {
        return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
      });
      if(!clickedListItem) {
        return;
      }
      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) {
        openPhotoSwipe(index, clickedGallery);
      }
      return false;
    };
    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);
      options = {
        galleryUID: galleryElement.getAttribute('data-pswp-uid'),
        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(fromURL) {
        if(options.galleryPIDs) {
          for(var j = 0; j < items.length; j++) {
            if(items[j].pid == index) {
              options.index = j;
              break;
            }
          }
        } else {
          options.index = parseInt(index, 10) - 1;
        }
      } else {
        options.index = parseInt(index, 10);
      }
      if( isNaN(options.index) ) {
        return;
      }
      if(disableAnimation) {
        options.showAnimationDuration = 0;
      }
      gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
      gallery.init();
    };
    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;
    }
    var hashData = photoswipeParseHash();
    if(hashData.pid && hashData.gid) {
      openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1], true, true);
    }
  };
  initPhotoSwipeFromDOM('.my-gallery');
});
⚡ Top Tools for Developers
Text Compare

テキスト比較

2つのテキストの違いを一目で確認できます。

Favicon Generator

Faviconジェネレーター

簡単かつ迅速にファビコンを生成します。

Lorem Ipsum Generator

Lorem Ipsumジェネレーター

デザイン用のダミーテキストを生成します。

Character Counter

文字数カウント

文字数と単語数をリアルタイムで確認できます。

SRT ↔ SMI

SRT ↔ SMI変換ツール

字幕形式を簡単に変換できます。

Text Extract(OCR)

画像テキスト抽出

画像内のテキストを自動で抽出します。