jQuery转盘导航在调整大小时中断
jQuery carousel navigation breaking on resize
在SO提供的代码的帮助下,我制作了一个post carousel,它基本上可以工作,但我在调整窗口大小方面遇到了问题。
整个东西都在这里
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
事件委派是个坏主意。我还简化了它检查最后一个和第一个帖子的方式。
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);
}
}
});
});
现在正常工作:)
相关文章:
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 如何在iOS应用程序中从Firebase中删除超过6小时的数据
- 高亮显示与数组字符串一起使用时文本插件中断
- AngularJS ui路由器html5模式中断路由
- IE在将字符串转换为日期时从日期中删除4小时
- 递归函数中断
- Javascript-在文本区域中断,但不在段落中中断
- 调整屏幕大小时更改属性值
- 将直流图表库中的折线图缩放限制为小时
- 为什么要做新的.Date()与new相差1小时.日期().到ISOString()
- 让谷歌数据图表有一个24小时x轴
- 在内部映射值时渲染方法中断
- 当使用css FireFox调整大小时,Flowplayer会中断
- 动画边栏在调整大小时中断
- 引导选项卡中的高图:在窗口调整大小时不可见的图表中断
- 在窗口调整大小时更改CSS会中断CSS
- jQuery转盘导航在调整大小时中断
- 调整大小时Skrollr视差中断