Javascript window.scrollTo的选项在Microsoft Edge上不起作用
我有一个奇怪的问题,我只能在微软浏览器上复制(Edge和IE11测试)Javascript window.scrollTo的选项在Microsoft Edge上不起作用,javascript,microsoft-edge,Javascript,Microsoft Edge,我有一个奇怪的问题,我只能在微软浏览器上复制(Edge和IE11测试) 身体{ 高度:5000px; 宽度:5000px; } 单击按钮将文档窗口滚动至1000像素 点击我滚动! 函数scrollWin(){ window.scrollTo({ 左:1000, 前1000名, 行为:“平稳” }); } 不幸的是,该方法无法在这两种浏览器中工作。 您可以在此处查看未解决的问题,并查看他们对此问题没有采取任何行动。 从这个词的意义上讲,这可能不是一个真正的答案,但我通过使用这个有用的polyf
身体{
高度:5000px;
宽度:5000px;
}
单击按钮将文档窗口滚动至1000像素
点击我滚动!
函数scrollWin(){
window.scrollTo({
左:1000,
前1000名,
行为:“平稳”
});
}
不幸的是,该方法无法在这两种浏览器中工作。
您可以在此处查看未解决的问题,并查看他们对此问题没有采取任何行动。
从这个词的意义上讲,这可能不是一个真正的答案,但我通过使用这个有用的polyfill解决了这个问题:它在所有浏览器中都非常有效 pollyfill的示例页面:
非常感谢作者。您可以尝试在Window.scrollTo()中使用Element.ScrollLeft和Element.ScrollTop属性 下面是使用Edge和其他浏览器的示例
身体{
高度:5000px;
宽度:5000px;
}
单击按钮将文档窗口滚动至1000像素
点击我滚动!
功能scrollWin(pos){
滚动至(位置偏移设置+1000,位置偏移设置+1000);
}
事实上,他们不支持这种变体,MDN文章应该更新
polyfill此方法的一种方法是在requestAnimationFrame循环中运行scroll
方法。这里没什么特别的
出现的主要问题是如何检测何时不支持此变体。实际上完美地解决了这个问题
为此,我们可以使用这样一个事实:如果视口确实滚动,则调用Window#scroll将触发ScrollEvent。这意味着我们可以设置一个异步测试,该测试将:
滚动(左,上)
变量以确保事件将触发/*多边形填充窗口#滚动(选项)和窗口#滚动到(选项)*/
(函数ScrollPolyfill(){
//异步测试仪
//包装在iframe中(在SO的StackSnippet®中不起作用)
var iframe=document.createElement('iframe');
iframe.onload=函数(){
var win=iframe.contentWindow;
//侦听滚动事件
win.addEventListener('scroll',函数处理程序(e){
//当scroll事件触发时,请检查我们是否已移动
如果(win.pageXOffset<99){/!==0应该足够了,但最好是安全的
attachPolyfill();
}
//清理
document.body.removeChild(iframe);
});
//设置文档以便滚动
var body=win.document.body;
body.style.width=body.style.height='1000px';
win.scrollTo(10,0);//强制事件
scrollTo({left:100,behavior:'instant'});//我们实际测试的那个
};
//准备好我们的框架
iframe.src=“关于:空白”;
iframe.setAttribute('width',1);
iframe.setAttribute('height',1);
setAttribute('style','position:absolute;z-index:-1');
iframe.onerror=函数(){
错误('加载帧失败,请在JSFIDLE中重试');
};
document.body.appendChild(iframe);
//Polyfill
函数attachPolyfill(){
var original=window.scroll,//保留原始方法
animating=false,//将保留计时器的id
dx=0,
dy=0,
target=null;
//超越我们的方法
window.scrollTo=window.scroll=函数polyFilled滚动(用户选择){
//如果我们已经平滑滚动,我们需要停止上一个
//不管当前的争论是什么
如果(动画){
clearAnimationFrame(动画);
}
//不是对象语法,而是使用默认语法
if(arguments.length==2){
返回原件。应用(此,参数);
}
如果(!user_opts | | type of user_opts!=='object'){
抛出新的TypeError(“值无法转换为字典”);
}
//创建一个克隆以不弄乱传递的对象
//并设置缺少的条目
变量选项={
左:(“左”在用户选项中)?用户选项。左:window.pageXOffset,
顶部:(“用户选项”中的“顶部”)?用户选项。顶部:window.pageYOffset,
行为:(“用户选项”中的“行为”)?用户选项。行为:“自动”,
};
if(opts.behavior!==“即时”&&opts.behavior!==“平滑”){
//基于“平滑行为”属性的CSS计算值分析“自动”
//但请注意,如果浏览器不支持此变体
//很有可能它也不支持CSS属性。。。
opts.behavior=window.getComputedStyle(document.scrollingElement | | document.body)
.getPropertyValue('scroll-behavior')=='smooth'?
“平滑”:“瞬间”;
}
如果(opts.behavior==='instant'){
//不是平滑的,只是在解析项目后默认为原始
返回原始调用(this,opts.left,opts.top);
}
//更新我们的方向
dx=(opts.left-window.pageXOffset)| | 0;
dy=(opts.top-window.pageYOffset)| 0;
//无处可去
如果(!dx&&!dy){
返回;
}
//保存传递的参数
目标=选择;
//保存英国皇家空军的身份证
设置动画=动画();
};
//动画循环
F