我正在回答这个问题,因为它是关于这个主题的原始帖子,并且清楚地指出这里的问题是使用 明显闪烁window.scrollTo()
,或者来自 JQM 库jQuery's scrollTop()
的有争议的问题(超时 + 滚动)。$.mobile.silentScroll()
我最近不得不解决完全相同的问题,这就是我想出的:伟大的 JQM 团队过去在优化和加速低端移动设备的转换方面做得很好。
简而言之,JQM 通过尝试将与函数pages
内部的某个值配对,以某种方式解决了这个临界点§.mobile.silentScroll()
。我不得不删除这个函数来构建我自己的:
$(document).on("mobileinit", function () {
// other settings...
$.mobile.SerialTransition.prototype.scrollPage = $.noop;
$.mobile.ConcurrentTransition.prototype.scrollPage = $.noop;
});
因为我有两种页面,第一种需要记住滚动位置(列表页面),第二种(卡片页面)需要始终从顶部开始,我会将这些信息存储在自定义data-attribute
.
例如,在下面的示例中,这三个页面的设置如下:
<div id="page-one" data-role="page" data-transition-scroll="keep-position">
<div id="page-two" data-role="page" data-transition-scroll="top-position">
<div id="page-three" data-role="page" data-transition-scroll="keep-position">
正如问题中所指出的,我还必须page
从顶部偏移,这是整个代码:
var scrollHandler = {
setScrollData: function (prevPage, toPage) {
if(typeof toPage == "object" && typeof prevPage == "object") {
$(prevPage).data("scroll-top", $(window).scrollTop());
}
},
resetContent: function (toPage) {
var scrollMode = $(toPage).data("transition-scroll");
if(scrollMode === "top-position") {
var content = $(toPage).find(".ui-content")[0];
var contentStyle = $(content).attr("style"); /* Force reflow */
$(content).css({"top": "0px"});
}
},
freezeContent: function (prevPage) {
var scrollTop = $(prevPage).data("scroll-top"),
content = $(prevPage).find(".ui-content")[0],
fixedHeader = $(prevPage).find(".ui-header-fixed")[0],
headerBottom = $(fixedHeader).outerHeight() - fixedHeader.offsetTop;
$(content).css({"top": -scrollTop + "px"});
window.scrollTo(0,0);
},
unFreezeContent: function (toPage) {
var scrollTop = $(toPage).data("scroll-top"),
scrollMode = $(toPage).data("transition-scroll"),
content = $(toPage).find(".ui-content")[0],
contentStyle = $(content).attr("style"); /* Force reflow */
$(content).removeAttr("style");
window.scrollTo(0, scrollMode ==="top-position" ? 0 : scrollTop);
}
};
这里使用的 JQMpageevents
如下:
$(document).on("pagecontainerbeforehide", function(e, ui) {
scrollHandler.freezeContent(ui.prevPage);
});
$(document).on("pagecontainerbeforechange", function(e, ui) {
scrollHandler.setScrollData(ui.prevPage, ui.toPage);
});
$(document).on("pagecontainerbeforeshow", function(e, ui) {
scrollHandler.resetContent(ui.toPage);
});
$(document).on("pagecontainershow", function(e, ui) {
scrollHandler.unFreezeContent(ui.toPage);
});
最后,还有一点 CSS:
/* large desktop screen */
.ui-header,
.ui-content,
.ui-footer {
max-width: 870px;
margin: auto;
}
/* needed for the scrollhandler */
.ui-content {
position: relative;
width: 100%;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
附加说明
对于外部页面和非dom-cached的页面,将需要自定义页面历史记录,因为:
- 在我的示例中,滚动值存储在页面本身内,并且
- 当前标准的 JQM 页面历史实现对于这个目的是不够的
这是一个例子:
slide
过渡被故意放慢以检查结果: