gpt4 book ai didi

javascript - 调整大小时 jQuery 轮播导航中断

转载 作者:行者123 更新时间:2023-11-28 07:38:02 26 4
gpt4 key购买 nike

借助从 SO 获得的代码,我制作了一个后期轮播,它大部分都能正常工作,但我在调整窗口大小方面遇到了问题。

一切都在这里

https://github.com/dingo-d/Post-Excerpt-Carousel

如果您在某个窗口宽度上重新加载它,它工作正常,但如果您只是调整窗口大小,导航将停止正常工作。

现在,当你在第一个帖子时,你不能转到上一个(轮播不会移动),当你在最后一个时,轮播也不会前进。但如果你调整大小,他们会。使这项工作的 jquery 代码是这样的

jQuery(document).ready(function ($) {
'use strict';

$(window).on('load', function () {
$('.post_excerpt_carousel').each(function(){
var $this = $(this);
post_excerpt_positioning($this);
});
});

$(window).on('resize', function(){
$('.post_excerpt_carousel').each(function(){
var $this = $(this);
if ($(window).width()>760) {
$(this).find('li').css('width', '570px');
}
post_excerpt_positioning($this);
});
});

function post_excerpt_positioning(e){

var $carousel = e;
var outer_width = $(window).outerWidth();
var container_width;

if (outer_width > 1190) {
container_width = 1170;
}

if (outer_width > 960 && outer_width < 1190) {
container_width = 960;
}

if (outer_width < 960) {
container_width = parseInt((9/10)*outer_width,10);
}

var $prev = $carousel.find('.carousel_prev');
var $next = $carousel.find('.carousel_next');
var duration = $carousel.data('duration');
var li_number = $carousel.find('li').length;
var $ul = $carousel.find('ul');
var $li = $ul.find('li');

if (outer_width < 760){
$li.css('width', container_width);
$li.eq(1).addClass('active');
if ($li.eq(2).hasClass('active')) {
$li.eq(2).removeClass('active');
}
} else if (outer_width > 760){
$li.eq(1).addClass('active');
$li.eq(2).addClass('active');
}

var list_width = $carousel.find('li').outerWidth(true);
var left_offset;
if ($('.boxed_body_wrapper').length) {
left_offset = list_width-60;
} else{
left_offset = parseInt(list_width - (outer_width - container_width-42)/2, 10);
}

$ul.css({'display': 'inline-block', 'width': li_number * $carousel.find('li').outerWidth(true) + 'px', 'left': -left_offset + 'px'});


var not_active_no = $carousel.find('li').not('.first').not('.last').not('.active').length;
var not_active_width = not_active_no * $carousel.find('li').outerWidth(true);

$carousel.on('click', '.carousel_next', function (e) {
e.preventDefault();
var $li = $ul.find('li');
var $a = $('.active', $carousel);

if (!$a.next().hasClass('last') && !$ul.is(':animated')) {
$a.removeClass('active').next().addClass('active');
}

if (parseInt($ul.css('left'), 10) != -parseInt(not_active_width + left_offset, 10) && !$ul.is(':animated')) {
$ul.animate({
left: parseInt($ul.css('left'), 10) - $ul.find('li').outerWidth(true),
}, duration);
}
});

$carousel.on('click', '.carousel_prev', function (e) {
e.preventDefault();
var $li = $ul.find('li');
var $a = $('.active', $carousel);

if (!$a.prev().hasClass('first') && !$ul.is(':animated')) {
$a.removeClass('active').prev().addClass('active');
}

if (parseInt($ul.css('left'), 10) !== -parseInt(left_offset, 10) && !$ul.is(':animated')) {
$ul.animate({
left: parseInt($ul.css('left'), 10) + $ul.find('li').outerWidth(true),
}, duration);
}
});
}

});

主要问题是,当您调整大小时,您显然会更改偏移量,并且会出现动画。第二个问题是我正在调用的函数中有 on.('click') 事件,我认为这不是正确的编码方式,所以对此有任何帮助会有帮助。

Codepen 展示它在这里:http://codepen.io/dingo_d/pen/doNyMw

最佳答案

好吧,我放弃了这个函数,因为这个函数和里面的 on click 事件委托(delegate)不是一个好主意。我还简化了它检查最后一篇和第一篇文章的方式。

var $carousel = $('.post_excerpt_carousel');

$carousel.each(function(){

var $this = $(this);

var outer_width = $(window).outerWidth();
var container_width;

if (outer_width > 1145) {
container_width = 1170;
}

if (outer_width > 960 && outer_width < 1145) {
container_width = 960;
}

if (outer_width < 960) {
container_width = parseInt((9/10)*outer_width,10);
}

var duration = $this.data('duration');
var li_number = $this.find('li').length;
var $ul = $this.find('ul');
var $li = $ul.find('li');
$li.removeClass('active');

if (outer_width < 760){
$li.css('width', container_width);
$li.eq(1).addClass('active');
if ($li.eq(2).hasClass('active')) {
$li.eq(2).removeClass('active');
}
} else if (outer_width > 760){
$li.eq(1).addClass('active');
$li.eq(2).addClass('active');
}

var list_width = $this.find('li').outerWidth(true);
var left_offset;

left_offset = parseInt(list_width - (outer_width - container_width-42)/2, 10);

$ul.css({'display': 'inline-block', 'width': li_number * $this.find('li').outerWidth(true) + 'px', 'left': -left_offset + 'px'});


var not_active_no = $this.find('li').not('.first').not('.last').not('.active').length;
var not_active_width = not_active_no * $this.find('li').outerWidth(true);

$this.on('click', '.carousel_next', function (e) {
e.preventDefault();

if($this.find('li.last').prev().hasClass('active')){
return;
} else {
var $a = $('.active', $this);

if (!$a.next().hasClass('last') && !$ul.is(':animated')) {
$a.removeClass('active').next().addClass('active');
}

if (!$ul.is(':animated')) {
$ul.animate({
left: parseInt($ul.css('left'), 10) - $ul.find('li').outerWidth(true),
}, duration);
}
}

});

$this.on('click', '.carousel_prev', function (e) {
e.preventDefault();

if($this.find('li.first').next().hasClass('active')){
return;
} else {
var $a = $('.active', $this);

if (!$a.prev().hasClass('first') && !$ul.is(':animated')) {
$a.removeClass('active').prev().addClass('active');
}

if (!$ul.is(':animated')) {
$ul.animate({
left: parseInt($ul.css('left'), 10) + $ul.find('li').outerWidth(true),
}, duration);
}
}

});

});

现在可以正常工作了:)

关于javascript - 调整大小时 jQuery 轮播导航中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com