javascript:パノラマ写真をドラッグでスクロール を Jqueryプラグインに変更。
プラグインよりもjqueryを先に読み込むこと[参]。
2~3機能も追加した。
- スクロールボタンを追加(オプションで非表示も可能)
- 切り替え画像に対応(オプション)。例えば、説明を追記した画像を切り替え画像に用いる。
- 360°パノラマ対応(オプション)
◆html
11~13行目:width, height, src で画像を表示するサイズと画像を定義する(必須)19~25行目:オプションでパラメータを定義する。
- <html>
- <head>
- <title>dragPanorama</title>
- <meta http-equiv="imagetoolbar" content="no" />
- <script src="jquery.js"></script>
- <script src="jQuery.dragPanorama.js"></script>
- <script>
- $(function() {
- $("#panorama_wrapper").dragPanorama({
- width: 800,
- height: 400,
- src: "001.jpg"
- });
- $("#panorama_wrapper2").dragPanorama({
- width: 1000,
- height: 300,
- src: "00.jpg",
- round: true,
- buttonSize: "20px",
- buttonTextLeft: "左",
- buttonTextRight: "右",
- buttonTextPause: "停止",
- switchText: "表示切替",
- src2: "00_2.jpg",
- });
- });
- </script>
- </head>
- <body>
- <div align="center">
- <h1>九十九谷</h1>
- <div id="panorama_wrapper"></div>
- <br/>
- <h1>谷川岳</h1>
- <div id="panorama_wrapper2"></div>
- </div>
- </body>
- </html>
◆javascript(panorama.js)
10~29行のパラメータをオプションで設定できる。
- (function($) { // 無名関数でラップしてプラグインを独立させておく。jQueryキーワードの代わりにドル記号($)を使用する。
- $.fn.dragPanorama = function(opts) { // プラグインを定義する。
- return this.each(function() { // each();で回して全ての要素に対して同様に処理していく
- new $.Panorama(this,opts);
- });
- };
- var defaults = {
- dx: 0, // マウスダウンした場所の画像の座標
- xcache: 0, // 画像の左端のスクリーンの左端に対する座標
- dragObj: false, // ドラッグの状態を表す。 null→ドラッグしていない状況
- width: 320,
- height: 240,
- round: false, // 360°パノラマのときはtrue
- scroll: true, // 自動スクロールをするときは true
- speed: 100, // 自動スクロールのスピード
- mouseoverVisibility: "visible", // mouseover の時のスクロールボタンの表示/非表示
- mouseoutVisibility: "hidden", // mouseout の時のスクロールボタンの表示/非表示
- buttonSize: "100px", // スクロールボタンの大きさ
- buttonColor: "grey", // スクロールボタンの色
- buttonOpacity: "0.5", // スクロールボタンの透明度
- buttonTextLeft: "<", // スクロールボタン(左)のテキスト
- buttonTextRight: ">", // スクロールボタン(右)のテキスト
- buttonTextPause: "=", // スクロールボタン(pause)のテキスト
- switchSize: "18px", // 切り替えボタンのサイズ
- switchText: "switch", // 切り替えボタンのテキスト
- src2: "", // 切り替え用の画像
- durationTime: 1000 // 画像切り替え時間
- };
- $.Panorama = function(elements, opts){
- this.opts = $.extend({}, defaults, opts); // デフォルトオプションと渡されたオプションのマージ
- this.$id = $(elements);
- this.$id.width(this.opts.width).height(this.opts.height);
- this.srcCurrent = this.opts.src;
- var self = this; // 以下の関数で用いるために要素(this)を変数(self)に退避
- var baseBlockCss = {
- position: "absolute",
- cursor: "pointer",
- height: "100%",
- width: "100%"
- };
- var baseInlineCss = {
- position: "absolute",
- cursor: "pointer",
- };
- this.$id.css({
- overflow: "hidden",
- position: "relative",
- textAlign: "left",
- }).append(
- $('<div></div>').css(baseBlockCss) // 画像用の<div>
- ).append(
- $('<div></div>').css(baseBlockCss) // 切り替え画像用の<div>
- );
- if ( this.opts.scroll == true || this.opts.src2) {
- this.$id.mouseover(function(){
- $(this).find('span').css({
- visibility: self.opts.mouseoverVisibility
- })
- }).mouseout(function(){
- $(this).find('span').css({
- visibility: self.opts.mouseoutVisibility
- })
- });
- }
- if ( this.opts.scroll == true ) {
- var $table = $('<table></table>').css(baseBlockCss).css({
- border: "0",
- borderSpacing: "0",
- tableLayout: "fixed", // <td>を均等に割り付ける(キャメルケースで記載)
- fontSize: self.opts.buttonSize,
- color: self.opts.buttonColor,
- opacity: self.opts.buttonOpacity,
- verticalAlign: "middle",
- visibility: self.opts.mouseoutVisibility
- }).append(
- $('<tr></tr>').append(
- $('<td></td>').css({
- textAlign: "left",
- }).append(
- $('<span></span>', { text: self.opts.buttonTextLeft}).click(function(){
- self.automovePrc(-1);
- })
- )
- ).append(
- $('<td></td>').css({
- textAlign: "center"
- }).append(
- $('<span></span>', { text: self.opts.buttonTextPause}).click(function(){
- clearInterval(self.timer);
- self.timer = "";
- })
- )
- ).append(
- $('<td></td>').css({
- textAlign: "right"
- }).append(
- $('<span></span>', { text: self.opts.buttonTextRight}).click(function(){
- self.automovePrc(1);
- })
- )
- )
- );
- this.$id.append($table);
- }
- if ( this.opts.src2 ) { // 画像の切り替え
- var $switch = $('<span></span>', { text: self.opts.switchText }).css(baseInlineCss).css({
- fontSize: self.opts.switchSize,
- color: self.opts.buttonColor,
- opacity: self.opts.buttonOpacity,
- verticalAlign: "top",
- textAlign: "left",
- visibility: self.opts.mouseoutVisibility
- }).click(function(){
- if ( self.$id.find('div:last').css("opacity") == 0 ) {
- self.$id.find('div:last').animate({opacity: 1.0},self.opts.durationTime);
- } else {
- self.$id.find('div:last').animate({opacity: 0.0},self.opts.durationTime);
- }
- });
- this.$id.append($switch);
- }
- this.img = new Image();
- this.img.onload = function(){ // imageが読み込まれたら、imageの幅を取得して、maxLeftを定義する。
- var imgRatio = self.$id.height() / self.img.height; // 画像の高さを合わせて表示するための変形比率を定義
- self.imgWidth = self.img.width * imgRatio; // 変形画像の幅
- self.imgHeight = self.$id.height(); // 変形画像の高さ
- if ( self.opts.round == false ) {
- self.maxLeft = self.$id.width() - self.imgWidth;
- // もっとも左に移動したときの画像の左端のスクリーンの左端に対する座標<0
- } else { // 360°パノラマの場合
- self.maxLeft = self.$id.width() - self.imgWidth * 2;
- // もっとも左に移動したときの画像の左端のスクリーンの左端に対する座標<0
- }
- self.$id.find('div:first').css({ // 画像用の<div>を設定
- opacity: 1.0,
- backgroundImage: "url(" + self.opts.src + ")", // キャメルケースで記載("background-image"→backgroundImage)
- backgroundSize: self.imgWidth + "px," + self.imgHeight + "px", // 変形比率で表示
- width: self.imgWidth*2 + "px"
- });
- self.$id.find('div:last').css({ // 切り替え画像用の<div>を設定
- opacity: 0.0,
- backgroundImage: "url(" + self.opts.src2 + ")", // キャメルケースで記載("background-image"→backgroundImage)
- backgroundSize: self.imgWidth + "px," + self.imgHeight + "px", // 変形比率で表示
- width: self.imgWidth*2 + "px"
- });
- }
- this.img.src = this.opts.src;
- this.maxLeft = self.maxLeft;
- this.imgWidth = self.imgWidth;
- this.imgHeight = self.Height;
- this.$id.mousedown( function(e) {
- self.opts.dragObj = true;
- var x = e.pageX ; // マウスダウンした場所のスクリーンの座標
- self.opts.dx = x - self.opts.xcache; // マウスダウンした場所の画像の座標
- return false; // ドラッグで文字が選択されないようにする。
- });
- this.$id.mouseup( function(e) {
- self.opts.dragObj = false;
- });
- this.$id.mousemove( function(e) {
- if(!self.opts.dragObj)return;
- var x = e.pageX ;
- self.xcache_tmp = x - self.opts.dx; // ドラッグによる移動量
- if ( self.opts.round == true ) { self.roundPrc(); }; // 360°パノラマの場合
- if(self.maxLeft < self.xcache_tmp && 0 > self.xcache_tmp){ self.movePrc(); }; // 画像が可動の範囲であれば実行
- });
- };
- $.extend($.Panorama.prototype,{
- roundPrc: function() { // 360°パノラマの場合の処理
- if ( this.xcache_tmp >= 0 ) {this.xcache_tmp -= this.imgWidth;}
- if ( this.xcache_tmp <= this.maxLeft ) {this.xcache_tmp += this.imgWidth;}
- },
- movePrc: function() { // 移動処理
- this.$id.find('div').css("left", this.xcache_tmp + "px");
- this.opts.xcache = this.xcache_tmp; // 画像の左端のスクリーンの左端に対する座標
- },
- automovePrc: function(moveStep) { // 自動移動
- if (this.timer) return;
- var self = this;
- this.timer = setInterval(function(){
- self.xcache_tmp = self.opts.xcache - moveStep;
- if ( self.opts.round == true ) { self.roundPrc(); }; // 360°パノラマの場合
- if(self.maxLeft < self.xcache_tmp && self.xcache_tmp < 0){ // 画像が可動の範囲であれば実行
- self.movePrc();
- } else {
- clearInterval(self.timer);
- self.timer = "";
- }
- }, 1000/self.opts.speed )
- }
- });
- })(jQuery);