私は低解像度の私のウェブサイトに iDangerous Swiper を使用しています。これが私がそれを呼んでいる方法です:
_var resolution = 670;
if ($(window).width() < resolution) {
var mySwiper = $('.swiper-container').swiper({
mode:'horizontal',
loop: true,
grabCursor: true,
paginationClickable: true
});
_
そのため、デスクトップブラウザでアクセスしても、スワイパーは呼び出されません。私がやりたいのは、ユーザーがウィンドウのサイズをresolution
より小さいサイズに変更した場合は「オン」にするか、ユーザーが小さいウィンドウサイズでアクセスした後、resolution
より大きいサイズにサイズ変更した場合は破棄することです。私はこれを試しましたが、うまくいきませんでした:
_$(window).resize(function(){
if ($(window).width() < resolution) {
if(typeof(mySwiper) === "undefined" ) {
var mySwiper = $('.swiper-container').swiper({
mode:'horizontal',
loop: true,
grabCursor: true,
paginationClickable: true
});
}
} else {
if (typeof(mySwiper) !== "undefined" ) {
mySwiper.destroy();
}
}
});
_
2つの望ましくないことが起こります。
私の問題はtypeof
です。 $('.swiper-container').swiper()
のように呼び出されたときに、変数がどのように機能するかはよくわかりません。
スワイパーを「呼び出す」方法と、すでに呼び出されている場合は呼び出さない方法を教えてください。
私の解決策:
var mySwiper = undefined;
function initSwiper() {
var screenWidth = $(window).width();
if(screenWidth < 992 && mySwiper == undefined) {
mySwiper = new Swiper('.swiper-container', {
spaceBetween: 0,
freeMode: true
});
} else if (screenWidth > 991 && mySwiper != undefined) {
mySwiper.destroy();
mySwiper = undefined;
jQuery('.swiper-wrapper').removeAttr('style');
jQuery('.swiper-slide').removeAttr('style');
}
}
//Swiper plugin initialization
initSwiper();
//Swiper plugin initialization on window resize
$(window).on('resize', function(){
initSwiper();
});
そしてそれはworx! :)
Swiperをオンデマンドで破棄して初期化するのにまだ問題がある場合は、少し遅れてreInit()を呼び出してみてください。
ページの読み込み時にスワイパー参照を定義する
var mySwiper;
スワイパーを開始
// Set Slider
mySwiper = new Swiper ('.swiper-container', {loop: true });
// Run Update after 500ms
setTimeout(function() { mySwiper.reInit(); },500);
デストリースワイパー
if (typeof mySwiper != 'undefined') {
mySwiper.destroy();
mySwiper = undefined;
}
Ajaxを介してマークアップを更新する場合は、最初にコンテナーを空にしてください。つまり:
if (typeof mySwiper != 'undefined') {
mySwiper.destroy();
mySwiper = undefined;
}
$('#container-with-swiper-markup').html("");
同じ問題が発生し、幅が最大幅を超えるとすぐにmySwiperが再びundefined
になり、if(typeof)
ステートメントが常にfalse
を返すことがわかりました。
以下の_fired[]
_配列を使用した別のハイブリッドソリューションを見つけました。また、私の例ではdestroy()
メソッドが実行されている可能性がありますが、スワイパー自体がラッパーとスライドDIVにスタイル属性を追加していることに気付きました。 destroyメソッドが呼び出された後も持続し、ページの更新でのみ消えました。 2つのDIVにremoveAttr()
メソッド呼び出しを追加した後、すべてが期待どおりに機能しました。
あなたのマイレージは異なる場合があります。
_$(window).on('resize', function ()
{
if ($(this).width() <= 383 && !fired[0])
{
fired[0] = true;
fired[1] = false;
mySwiper = $('.swiper-container').swiper({ mode: 'horizontal', loop: false, wrapperClass: 'swiper-wrapper', slideClass: 'swiper-slide' });
}
else if ($(this).width() >= 384 && !fired[1])
{
fired[0] = false;
fired[1] = true;
mySwiper.destroy();
$('.swiper-wrapper').removeAttr('style');
$('.swiper-slide').removeAttr('style');
}
});
_
私は同じ問題を抱えていて、同様の解決策を取りました:
init関数:
var mySwiper;
私のサイズ変更機能:
if(jQuery(window).width() < 672) {
if (typeof mySwiper == 'undefined') {
mySwiper = new Swiper('#myId', {
calculateHeight: true
});
}
} else {
if (typeof mySwiper != 'undefined') {
// destroy and delete swiper object
mySwiper.destroy();
mySwiper = undefined;
// reset styling for wrapper and slides
jQuery('.swiper-wrapper').removeAttr('style');
jQuery('.swiper-slide').removeAttr('style');
}
}
さて、私はパーティーに遅れていることを知っていますが、私は同様の問題を抱えていて、しっかりと機能する解決策に行き着きました。
ストーリー:Swiperはデスクトップで実行する必要がありますが、モバイル(小さな画面)では実行できず、サイズ変更時にそれらを変更できる必要があります。
要件:私の例では、jQuery、Swiper、Modernizrを使用しています(メディアクエリの場合、ウィンドウ幅などは信頼できないため)。
JavaScript:
/*! Michael Pumo - Web Development. http://michaelpumo.com */
(function($, Modernizr) {
'use strict';
var state = {
swiper: false,
setOrGetDevice: function(device) {
if (typeof(device) === 'undefined') {
var mq = Modernizr.mq('only screen and (min-width: 768px)') ? 'desktop' : 'mobile';
device = mq;
}
return device;
},
device: function() {
return state.setOrGetDevice();
}
};
var cache = {
$window: $(window),
$swiper: $('.swiper-container'),
$swiperElements: $('.swiper-container, .swiper-wrapper, .swiper-slide')
};
var swiper;
var app = {
init: function() {
app.swiper();
},
swiper: function() {
if(state.device() === 'desktop' && !state.swiper) {
swiper = cache.$swiper.swiper({
parallax: false,
initialSlide: 0,
direction: 'horizontal',
loop: true,
autoplay: 3000,
speed: 1000
});
state.swiper = true;
} else if(state.device() === 'mobile' && state.swiper) {
swiper.destroy();
swiper = undefined;
cache.$swiperElements.removeAttr('style');
state.swiper = false;
}
}
};
$(function() {
app.init();
});
cache.$window.on('resize', function() {
var mq = Modernizr.mq('only screen and (min-width: 768px)') ? 'desktop' : 'mobile';
state.setOrGetDevice(mq);
app.init();
});
})(window.jQuery, window.Modernizr);
'デバイス'(つまり、モバイルサイズまたはデスクトップサイズ)をチェックするだけでなく、state.swiper
で設定したフラグと照合します。これはモバイルファーストのアプローチであるため、このフラグは最初はfalse
に設定されます。
説明が簡単であることは知っていますが、これは100%機能し、フラグのおかげで、サイズ変更のすべての段階でSwiperを初期化しないという利点があります。
[〜#〜] html [〜#〜]は、Swiperが必要とする標準[〜#〜] html [〜#〜]であるため、これが必要です。このソリューションを使用する場合は、を使用する必要があります。
それが誰かの助けになることを願っています。
ありがとう、マイキー。
http://idangero.us によって与えられたより良い解決策があります
var mySwiper = new Swiper('.swiper-container', {
// Optional parameters
direction: 'vertical',
loop: true
})
if (window.innerWidth > 767) {
swiper.detachEvents();
}