yuheijotaki.com

WordPress に Vue.js を スモールスタートで入れてみる その6

とあるサイトでVue.jsで作っていて、公開してからもろもろやったことまとめ その6
今回はPhotoSwipeのvueモジュールについて

f:id:jotaki:20190212100544p:plain

v-photoswipe

バニラJSのフォトギャラリープラグイン PhotoSwipe
スワイプなど、スマホの各アクションにも対応しているのでlightbox系ではこれを最近よく使っています。

Vueモジュールでも用意されているのでそれを使います。

GitHub: Leesson/v-photoswipe: Vue plugin for image preview base on PhotoSwipe
npm: v-photoswipe - npm

最終的には前回のIsotopeと併用したので組み合わせが必要ですがPhotoSwipeのところだけ抜き出し

サムネイル部分は決まった形なので a要素に @click="showPhotoSwipe(index)" をつけて datamethods も指定しておく。

v-photoswipeitems に フルサイズの画像もバインドしておく。
このフルサイズは形がきまっているので、下記のようになるよう調整しておく必要がある。
fullsizes.forEach(function(v, i, a){... のところ)

items

[
  {
    "src":"https:\/\/siteUrl.com\/image01.jpg",
    "w":1280,
    "h":620
  },
  {
    "src":"https:\/\/siteUrl.com\/image02.jpg",
    "w":1280,
    "h":620
  }
]

sampleGallery.vue

<template>
  <ul v-if="sampleGallery">
    <li
      :key="index"
      v-for="(image, index) in sampleGallery"
    >
      <a
        href="javascript:void(0);"
        @click="showPhotoSwipe(index)"
      >
        <img
          :src="image.sizes.thumbnail"
          :width="image.sizes['thumbnail-width']"
          :height="image.sizes['thumbnail-height']"
        >
      </a>
    </li>
  </ul>
  <div>
    <v-photoswipe
      :isOpen="photoSwipeIsOpen"
      :items="PhotoSwipeFullsizes"
      :options="PhotoSwipeOptions"
      @close="hidePhotoSwipe">
    </v-photoswipe>
  </div>
</template>

<script>
import { API_POST_URL } from './../variable'
import axios from 'axios';
import { PhotoSwipe } from 'v-photoswipe'

export default {
  components: {
    'v-photoswipe': PhotoSwipe
  },
  data() {
    return {
      sampleGallery: '',
      // PhotoSwipe
      photoSwipeIsOpen: false,
      PhotoSwipeOptions: {
        // ref: https://photoswipe.com/documentation/options.html
        index: 0,
        history: false,
        bgOpacity: '.9',
        preload: [1,3],
      },
      PhotoSwipeFullsizes: []
    }
  },
  mounted() {
    axios
      .get(`${API_POST_URL}/POSTTYPE/${POST_ID}/`)
      .then(response => {
        this.sampleGallery = this.post.acf.sample_gallery
        /*
        * PhotoSwipe の画像を取得してdataに格納
        */
        // フルサイズ
        const fullsizes = response.data.sample_gallery_images
        const fullsizeItems = []
        fullsizes.forEach(function(v, i, a){
          const fullsize = {
            src: v[0], // 画像URL
            w:   v[1], // 横幅
            h:   v[2]  // 縦幅
          };
          fullsizeItems.push(fullsize)
        });
        this.PhotoSwipeFullsizes = fullsizeItems
      })
  },
  methods: {
    // PhotoSwipe ギャラリー形式ではなくサムネイル + フルサイズの組み合わせで表示するメソッド
    showPhotoSwipe (index) {
      this.photoSwipeIsOpen = true
      this.$set(this.PhotoSwipeOptions, 'index', index)
    },
    // PhotoSwipe クローズメソッド
    hidePhotoSwipe () {
      this.photoSwipeIsOpen = false
    }
  }
};
</script>