Изменение размера FlexSlider 2 при изменении размера окна
Я делаю отзывчивую тему для WordPress, созданной на Twitter Bootstrap. Я использую FlexSlider слайд-шоу jquery plugin на главной странице.
К сожалению, когда я изменяю размер моего браузера, FlexSlider не изменяет размер изящно. Когда я пойду уже, изображение может быть обрезано. Если я пойду шире, часть следующего изображения может оказаться сбоку. Это происходит даже тогда, когда я использую демо-код с сайта FlexSlider. Это даже происходит на демо-версии FlexSlider. Но Dany Duchaine [Energized theme] [3] умеет легко изменять размер FlexSlider с изменением видового экрана. Может ли кто-нибудь объяснить, как он это делает, или предложить какой-либо способ улучшить поведение моей версии?
Спасибо!
Ответы
Ответ 1
У вас, вероятно, есть решение или переместилось на этом этапе, но я подумал, что хочу указать эту проблему на github для посетителей: https://github.com/woothemes/FlexSlider/issues/391 (обратите внимание на ответ patbouche). Это решение сработало для меня. Я положил его в обратный вызов after:
.
var slider1 = $('#slider1').data('flexslider');
slider1.resize();
Ответ 2
Я объединил пару этих решений, а также добавил проверку, чтобы убедиться, что слайдер существует на первой странице.
$(function() {
var resizeEnd;
$(window).on('resize', function() {
clearTimeout(resizeEnd);
resizeEnd = setTimeout(function() {
flexsliderResize();
}, 250);
});
});
function flexsliderResize(){
if ($('.flexslider').length > 0) {
$('.flexslider').data('flexslider').resize();
}
}
Ответ 3
Мне пришлось привязать событие изменения размера окна, чтобы обеспечить надежную работу.
Поскольку FlexSlider до и после обратных вызовов не работал у меня:
$(window).bind('resize', function() {
setTimeout(function(){
var slider = $('#banner').data('flexslider');
slider.resize();
}, 1000);
});
Ответ 4
Я думаю, что лучше включить его в перед обратным вызовом:
$('.flexslider').flexslider({
// your settings
before: function(slider){
$('.flexslider').resize();
}
});
Ответ 5
Я пробовал много, а затем сделал это
if( jQuery('.iframe').length ){
var interval = window.setInterval(function() { jQuery('.flexslider').resize(); }, 100);
window.setTimeout(function(){
clearInterval(interval);
},4000);
}
Ответ 6
просто хотел добавить еще одну альтернативу, если кто-то все еще испытывает проблему "flexslider resizes to more width, но не ниже"
пользователь "PCandtheWeb" предложил добавить ниже, если у вас есть таблица обертывания, которая, как представляется, выполняет задание
.your-table
{
table-layout: fixed
}
Источник:
https://github.com/woothemes/FlexSlider/issues/980
Ответ 7
Я также пробовал много способов, но нигде не работал на самом деле... Затем я сделал это вручную, и теперь он работает: сохраните данные ползунка перед изменением с помощью flexslider, когда изменяется размер окна: destroy flexslider (fooobar.com/questions/374123/...) и полностью удалите node, вручную добавьте оригинальный слайдер node, который был сохранен в данных, добавьте его снова и инициализируйте flexslider... потому что это довольно дорого, я также добавлен измененный метод (fooobar.com/questions/33786/...), чтобы не выполняться при изменении размера... Да, это какой-то код, и он немного взломан, но он работает: )
$.fn.resized = function (callback, timeout) {
$(this).resize(function () {
var $this = $(this);
if ($this.data('resizeTimeout')) {
clearTimeout($this.data('resizeTimeout'));
}
$this.data('resizeTimeout', setTimeout(callback, timeout));
});
};
function myFlexInit(slider){
slider.data("originalslider", slider.parent().html());
slider.flexslider({
animation: "slide",
//... your options here
});
}
$(".flexslider").each(function() {
myFlexInit($(this));
});
$(window).resized(function(){
$(".flexslider").each(function() {
$(this).removeData("flexslider");
parent = $(this).parent();
originalslider = $(this).data("originalslider");
$(this).remove();
parent.append(originalslider);
newslider = parent.children().first();
myFlexInit(newslider);
});
}, 200);
Лучше оберните свой слайдер в собственный уникальный контейнер:
<div class="sliderparent">
<div class="flexslider">
<ul class="slides">
</ul>
</div>
</div>
Ответ 8
$(window).load(function(){
var mainslider;
$('.flexslider').flexslider({
animation: "slide",
start: function(slider){
mainslider = slider;
}
});
//force resize (carousel mode)
$(window).on("resize", function() {
//carousel resize code, around line 569 of query.flexslider.js
mainslider.update( mainslider.pagingCount);
mainslider.newSlides.width(mainslider.computedW);
mainslider.setProps(mainslider.computedW, "setTotal");
});
});
Я не уверен, что этот будет работать для всех случаев, но для простой карусели это работает!
Ответ 9
Я попробовал самый популярный ответ здесь, но, похоже, застрял в бесконечной петле. Вместо этого я принудительно изменяю высоту флекс-области просмотра и ширину слайда при изменении размера браузера, что, кажется, сработало.
$(window).on('resize', function () {
if ($('.flexslider').length > 0) {
$('.flexslider').each(function () {
$(this).find('.flex-viewport').css('height', 'auto');
$(this).find('>.slides').each(function () {
let height = $(this).css('height');
$(this).find('> li').css('width', height);
});
});
}
});