javascript - 手风琴滚动到
问题描述
我正在尝试向以下手风琴代码添加一个 scrollTo 命令。
问题是 slideup() 命令改变了屏幕然后位置被检测到错误。
$handlers.removeClass('active');
$panels.slideUp();
$(this).addClass('active').parent().find('.accordion-container').slideDown();
var position = $(this).position();
window.scrollTo(position.left, position.top - 110);
如果所有手风琴容器都关闭,则上述代码可以正常工作。如果其中一个容器是打开的,并且使用 slideup() 命令将其关闭,则位置命令将失败,然后屏幕将移动到完全错误的位置。
全功能
!(function($){
$.fn.Accordion = function(options){
var settings = $.extend({
hidefirst: 0
}, options);
return this.each(function(){
var $items = $(this).find('>div');
var $handlers = $items.find('.toggler');
var $panels = $items.find('.accordion-container');
if( settings.hidefirst === 1 )
{
$panels.hide().first();
}
else
{
$handlers.first().addClass('active');
$panels.hide().first().slideDown();
}
$handlers.on('click', function(){
if( $(this).hasClass('active') )
{
$(this).removeClass('active');
$panels.slideUp();
}
else
{
$handlers.removeClass('active');
$panels.slideUp();
$(this).addClass('active').parent().find('.accordion-container').slideDown();
var position = $(this).position();
window.scrollTo(position.left, position.top - 110);
}
event.preventDefault();
});
});
};
})(jQuery);
解决方案
如果由于某种原因您不能使用回调,您还可以添加一个超时时间,比如说 100 毫秒,并在完成后滚动。这样,当滚动开始时,dom 可能已经构建好了。
但我建议使用 slideDown 的回调。它需要一个“完整”功能,如下所示:http: //api.jquery.com/slidedown/
所以把你的代码改成这样:
$(this).addClass('active');
var accCont = $(this).parent().find('.accordion-container');
accCont.slideDown(200, function() {
var position = accCont.position();
window.scrollTo(position.left, position.top - 110);
});
对于您的用例,它可能不是 100% 正确,但我想您明白了。
推荐阅读
- java - NoSuchMethodError:org.apache.poi.ss.usermodel.Font.getIndexAsInt()
- matrix - sympy 矩阵元素圆?
- sass - 我可以在 sass 中创建我的类名变量吗?
- frisby.js - Frisby.js 循环运行测试
- excel - 比较 PSCustomObjects 的所有属性(Excel 工作表数据)
- html - 不透明度属性在 css 中没有给出预期的结果
- angular - Highcharts Sunburst 在水平变化时改变颜色
- c# - MigraDoc:如何在奇数页的部分之后添加空白页?
- python - 将 csv 导入 OrderedDict 并使用回归进行预测
- c++ - 用 C++ 画一棵 ASCII 艺术圣诞树