スライドショー
この記事は公開または最後に更新されてから2122日が経過しています。情報が古くなっている可能性があるのでご注意下さい。
この画像サイトを作りたかった理由の一つに、アップした画像のスライドショーを観たいという事があったので、これはなんとしても外せない機能なのです。
スライドショーに関してもプラグインが数多くありそうなのですが、モニター表示領域に可能な限り大きく、そしてアップしてあるすべての画像を対象にするとなると、どれで可能なのかはなかなか探しても見つかりませんでした。
javascript を使えば画像の切り替えに関しては簡単なことですが、私のレベルで考えて難しいのはアップしてある画像のURLをいかにして取得するかというところです。javascript からmysql にアクセスするにはなんにせよphpを経由しないとできないはずだし。
無い知恵を絞りだした目論見は、事前にphp にて画像ファイルのリストをxml として作成しておいて、そのxmlのファイルをjavascript でAjax1]にて読み込んで配列に格納し、発生させた乱数をその配列の添え字として画像のURLを取得して画像を切り替えようというものです。
作成する画像リストのxml1]はwordpress2]のデータベースを使うことなく、php のscandir関数 でファイル名を配列に取得します。この方法だとwordpress のデータベースを利用しないので投稿の状態を参照することは出来ず、まだ予約状態の投稿の分もリストされます。データベースを介してリストを作成するよりもこの方法のほうがサーバーにかかる負荷が少ないのではと思ったのですが。なにせ今や13,000枚以上の画像ファイルが存在します。それに私の場合は公開前の投稿分の画像も含めてスライドショーしたほうがよいのでこのほうが良かったのです。
このxml1]を作成する関数は投稿の公開の時に、バックグラウンドで動かせばいいでしょう。
で、作ったコードは以下の通り。
投稿の公開の時のアクションフックはpublish_post です。
6行目で生成する xml ファイルの指定、8行目で画像のアップロードディレクトリの指定をしています。
この場合はwordpress のインストールディレクトリからの相対バスにて指定していますが、サーバーの環境によってはフルパスでないとダメな場合もあるかもしれません。
フルパスは <?php phpinfo(); ?> を書いたphpファイルをアップして実行すれば、その下の方に表示される「Environment」の「DOCUMENT_ROOT 」の項目に表示されます。
16行目においてuploads/ ディレクトリで、画像をアップロードしてあるディレクトリ名には、2012 のようにアップした年のディレクトリ名になっていますからそれを判別しています。プラグイン等の具合によっては画像とは関係のないディレクトリも存在している可能性があります。
実は一度プラグインというものを作ってみたかったので、私の場合はこれをプラグインにして使用していますがfunction.php 内に記述しても同じだと思います。
この関数によって生成される超シンプルなxml は以下のようになります。
次にこの xml ファイルを javascript に読みこむ処理を作らないといけないのですが、これらの関数に関しては手持ちの書籍ではなく、ネットから探し出してきたものだと思いますが出所がどこかは忘れてしまいました。
xml ファイルを読み込んでスライドショーの処理を行う関数に続く、一連の javascript を次のように作りました。
スライドショーを実行させるにおいて、いくつかの機能を持たせました。
今、何枚目の画像か、画像のurlを格納した配列 imagesStr の添え字、画像のファイル名、何秒毎か、あと何秒で切り替わるかというカウントダウンなどの表示とスライドショーのstop、pause、restart、stop&backのjavascriptへのリンクです。
これらのための複数の関数で値を持ちまわるためにいくつかグローバル変数を使用しています。
- var imagesStr=new Array();3]xmlから読み出した画像のurlを格納するための配列
- var img01=new Image();3]次の画像を先読みさせるための変数
- var pastimg=new Array();3]表示した画像を戻って表示させるための既出の画像番号を順番に格納するための配列
- var backnum=2;3]戻って表示するときにいくつ戻っているかのカウント
- var tarlist=new Array();3]既に表示されたか否かのフラグでimagesStrの添え字に対応
- var tarnum;3]乱数で得られた表示する画像の番号でimagesStrの添え字にて使用
- var sumnum=1;3]表示した画像の枚数
2015/11/14 追記:
ふと気が付いてみると下記のXMLHttpRequest の方法では、現在のFireFox では、ちゃんと動いてくれていない。どんなにファイルを更新しても読み込むのはブラウザがキャッシュしている古いデータのままのようです。ちなみにFireFox のバージョンは42.0 です。
色々と試してみて、GET ではなく POST で送信すればその問題は解決できる。そう、GET で送信されたものはキャッシュされるのですが、キャッシュされないようにする記述もしてあるのですが。
と、いう事でPOST に書き直したものがこの下にあります。
createHttpRequest関数は次の requestFile 関数から呼び出されます。ブラウザの互換性を考慮したものと思われます。
createHttpRequest と requestFile関数が xml を読み込むための Ajax の処理で、ネット上から拾ってきたものです。requestFile 関数は xml ファイルから画像の url のリストを読み込み、画像の url を格納したグローバル変数の配列を生成し、一枚目の画像を表示して二枚目の画像を先読みしたあとスライドショー本元の関数 slideimg 関数に引き継ぎます。
2015/11/14 追記:上のXMLHttpRequest をPOST で書き直したもの
なんにしてもこちらの方がシンプルですっきりしていていい。今のIE であれば上記のcreateHttpRequest() のような関数ももう必要ないし。
読み込むファイルは xml でも良いし、それに限る必要も無くただのドット区切りのテキストファイルでも良い。その方がデータ量がぐっと少なく出来てより良いと思われます。
↑ここまで
で、stop、pause、restart、back、countdownなどの機能のための javascript 。
stopslide 関数において画像表示用の div を閉じる処理はここの初めの記事画像クリック時のjavascriptの erasepop 関数を使っています。ちなみに requestFiled 関数で一枚目の画像を表示するのに使用した showpop 関数は上と同じ記事と改良したものが画像をクリックした時のログの記事にあります。
このスライドショーの呼び出しはリンクなら <a href="javascript:requestFile('./wp-content/***/ilist.xml')"> という書式になります。 xml のパスは省略してあります。
最後に画像表示用の隠しdivのhtmlも載せておきます。
と、いう具合にしています。このdivのcssにおいて visibility は hidden 、 position は absolute 、 z-index は最前の値にしないと意味がありません。
このスライドショーのプログラムにおいては、 javascript の乱数を使っているわけですが、はじめに作った基本的な動作だけのコードでは、どうしても同じ画像ばかりが表示される傾向にあって、二度表示されないようにするために少し工夫が必要でした。
そのための手段が画像のurlを格納した配列 imagesStr と添え字の番号が同じ番号までの添え字を持つ配列を作り、その配列のそれぞれの値をフラグにして既出か否かを判別させるということをしました。 requestFile 関数の22行目で作られる tarlist という配列がそれにあたります。これによりひとまわりするまでは同じ画像が2度表示されることはなくなりました。
尚、同じ requestFile 関数の63行目に突然出てくる flmflg という変数はグローバル変数で宣言してあり、隠し div がなにから表示されたものかを判別するフラグとして使用しています。
というのは続、画像クリック時のjavascriptの記事内のスクロールが発生した時の関数、 onScroll 関数において画像表示用のdivが表示されている場合は再び隠す処理が実行されますが、その時呼び出すのが erasepop 関数か stopslide 関数かを判別させるためのものです。
スライドショーを実装した以後の onScroll 関数は以下のように最後の部分を変更してあります。が、さらに言及しますと現在のところスライドショーを設置してあるimages viewerのページにはスクロールサイドバーは使用していないので、このページにおける onScroll 関数の処理は画像表示用のdivを閉じる26~30行目までだけの記述となっています。
サイト内でこのスライドショーはimages viewerのページのサイドバーの一番下に設置してあります。
この記事を書くにあたって自分の作ったコードを改めてしげしげと見直した訳ですが、ここでなぜこういうことをやっているのだろうかという不合理な部分が数多くあって手直しするいい機会となりました。
随分と直しましたが私のサイトでは動いているので大丈夫のはずです。
2013年3月22日追加
画像を次々と見たい場合は余計なエフェクトなど必要無いと思うのですが、スライドショーにおいてはただ切り替わるだけではなんとなく味気ないように思えてきました。
そこで、fadeout + fadein のエフェクトを加える事に。
スライドショーにフェイドイン+フェイドアウトにて。
Post : 2012/05/23 00:33
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=16578