;(function($) { /** * PRバナー表示用スクリプト * * 外部設定可能パラメータ: * * autoSlideTime : 自動スライド待ち時間(デフォルト4秒) * showBannersThumb : サムネイル表示フラグ 1:表示 0:非表示 * bannerWidth : メインバナーサイズ(幅) * bannerHeight : メインバナーサイズ(縦) * slideBnrWidth : メインバナースライド幅 * thumbWidth : サムネイルサイズ(幅) * thumbHeight : サムネイルサイズ(()縦) * thumbMargin : サムネイル横マージン * slideThmWidth : サムネイルスライド幅 * duration : スライド所要時間 * isLoop : 両端ループ設定 * isAuto : 自動スライド設定 * level : PRバナー設置階層 * cloneNum : クローンノード生成数 * easing : イージング * */ $.fn.PRBanner = function(options) { // ミニアイコンサイズ var SIZE_MINI_ICON = 38; /* メインバナー */ var $bnrBase = $(this) , $bnrWrap = $bnrBase.find('.prWrapper') , $bnrUL = $bnrWrap.find('ul') , $bnrLI = $bnrWrap.find('li') , $bnrArrw = $bnrBase.find('.arrow') , $bnrNext = $bnrBase.find('.arrow.next') , $bnrPrev = $bnrBase.find('.arrow.prev') , $bnrNextImg = $bnrNext.find('img') , $bnrPrevImg = $bnrPrev.find('img') , $bnrPage = null /* サムネイル */ , $thumbBase = $bnrBase.find('.thumbOutline') , $thumbWrap = $bnrBase.find('.thumbWrapper') , $thumbNext = $bnrBase.find('.thumbArrow.next') , $thumbPrev = $bnrBase.find('.thumbArrow.prev') , $thumbUL = $thumbWrap.find('ul') , $thumbLI = $thumbWrap.find('li') , _isSP = false // SPフラグ , _isAndroid4 = false // Android4.x , _bnrNum = 0 // バナー画像数 , _interval = null // 自動設定時インターバル , _showShadow = false // 影表示 , _baseX = 0 , _distanceX = 0 , _positionX = 0 , _positionY = 0 , _animateWidth = 320 ; var params = $.extend({}, $.fn.PRBanner.defaults, options); /** * プラグイン中で使用するイベントバインド */ var bind = function() { $(window).on('load', function() { initDomLoaded(); // バナー画像が1枚の場合スワイプは不要 if (_bnrNum === 1) return; $bnrUL.find('li').on({ 'touchstart': function(e) { var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; // 計測開始 _baseX = $bnrUL.offset().left; _distanceX = 0; _positionX = touch.pageX; _positionY = touch.pageY; return false; } , 'touchend': function(e) { var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0] , horizontal = _positionX - touch.pageX , pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return false; if (horizontal > 50) { slideBnrNext(pos+1); } else if (horizontal < -50) { slideBnrPrev(pos-1); } else { location.href = $(this).find('a').attr('href'); } // 初期化 _distanceX = 0; _positionX = 0; _positionY = 0; } , 'touchmove': function(e) { var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0] , left = $bnrUL.offset().left , horizontal = _positionX - touch.pageX , virtical = _positionY - touch.pageY , pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return false; if (Math.abs(virtical) < 5) { e.preventDefault(); } else { if (_isAndroid4) { if (horizontal > 10) { slideBnrNext(pos+1); } else if (horizontal < -10) { slideBnrPrev(pos-1); } } else { var distanceX = (horizontal < 0) ? -10 : 10; _distanceX = _distanceX + distanceX; var totalDistance = _baseX - (_baseX + _distanceX); if (totalDistance <= _animateWidth && Math.abs(horizontal) > 20) { $bnrUL .stop(true, false) .animate({ left: _baseX - _distanceX }, 0, 'linear' , function() {} ); } } } return false; } }); }); $bnrNext .on({ 'mouseenter': function(e) { e.preventDefault(); // ループ設定時かループ未設定時にバナーが右端ではない場合 if (params.isLoop == 1 || $bnrUL.data('pos') < _bnrNum-1) { $bnrNextImg.fadeIn(params.fadeTime); } } , 'mouseleave': function(e) { e.preventDefault(); // PCの場合はフォーカスが外れると画像を非表示にする if (!_isSP) { $bnrNextImg.fadeOut(params.fadeTime); } } , 'click': function(e) { e.preventDefault(); var pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return; changeCurrentThumb($thumbLI.filter('.cur').next()); slideThmPrev(1); slideBnrNext(pos+1); } }); $bnrPrev .on({ 'mouseenter': function(e) { e.preventDefault(); // ループ設定時かループ未設定時にバナーが左端ではない場合 if (params.isLoop == 1 || $bnrUL.data('pos') > 0) { $bnrPrevImg.fadeIn(params.fadeTime); } } , 'mouseleave': function(e) { e.preventDefault(); // PCの場合はフォーカスが外れると画像を非表示にする if (!_isSP) { $bnrPrevImg.fadeOut(params.fadeTime); } } , 'click': function(e) { e.preventDefault(); var pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return; changeCurrentThumb($thumbLI.filter('.cur').prev()); slideThmNext(1); slideBnrPrev(pos-1); } }); $thumbNext .on({ 'click': function(e) { e.preventDefault(); var pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return; changeCurrentThumb($thumbLI.filter('.cur').next()); slideThmPrev(1); slideBnrNext(pos+1); } }); $thumbPrev .on({ 'click': function(e) { e.preventDefault(); var pos = parseInt($bnrUL.data('pos'), 10); if ($bnrUL.is(':animated')) return; changeCurrentThumb($thumbLI.filter('.cur').prev()); slideThmNext(1); slideBnrPrev(pos-1); } }); } , initDomReady = function() { // 画像キャッシュ生成 $bnrWrap.find('img').each(function() { (new Image()).src = $(this).attr('src'); }); _bnrNum = $bnrLI.size(); if (params.slideBnrWidth === null) { params.slideBnrWidth = params.bannerWidth + params.bannerMargin } if (params.slideThmWidth === null) { params.slideThmWidth = params.thumbWidth + params.thumbMargin } if (params.showBannersThumb == 1 && params.cloneNum == 0) { params.cloneNum = 2; } if (params.isLoop == 1 && params.cloneNum == 0) { params.cloneNum = 1; } if (_isSP && ($bnrWrap.hasClass('topShadow') || $bnrWrap.hasClass('bottomShadow'))) { _showShadow = true; $bnrLI.each(function() { $(this).prepend(''); }); } if ($('header').hasClass('sp')) { _isSP = true; params.showBannersThumb = 0; $bnrArrw.find('img').each(function() { $(this).remove(); }); } if (_bnrNum === 1) { $bnrWrap.css('paddingBottom', 0); $bnrArrw.remove(); } _isAndroid4 = /Android 4/.test(navigator.userAgent); // イベントバインド bind(); } , initDomLoaded = function() { initBannerStyle(); // サムネイルを生成する if (params.showBannersThumb == 1) { initThumbnail(); } // ページングを生成する if (_bnrNum > 1 && params.showBannersThumb == 0) { initPagenation(); } // ループ処理時、両端に番兵を生成する increaseClone(); // 自動スライド設定 slideBnrAuto(); // 初期設定完了後、バナー画像表示 $bnrLI.show().find('img'); } /** * 動的パラメータによりメインバナーのスタイルを変更する */ , initBannerStyle = function() { // 階層別にスタイルを適用するため階層設定 $bnrBase.css({ 'width' : params.bannerWidth }) .addClass('prBannerLevel'+params.level); $bnrWrap.css({ 'width' : params.bannerWidth }); $bnrUL.css({ 'position': 'absolute' , 'left': 0 , 'width' : (params.bannerWidth+params.bannerMargin) * _bnrNum }) .attr('data-pos', 1); $bnrLI.each(function(i) { var $this = $(this); $this.attr("data-pos", i+1); if (i===0) { $this.addClass('cur'); } }) .find('img').css({ 'width' : params.bannerWidth , 'height': 'auto' }); var h = $bnrLI.find('img').height(); $bnrBase.find('.prWrapper,ul').css({'height': h }); if (!_isSP) { $bnrBase.find('.arrow').css({'height': h }); } } /** * ページングの初期設定を行う */ , initPagenation = function() { var miniIconW = _bnrNum*SIZE_MINI_ICON , posNum = 0; $bnrBase.append($('