scrollintoview 在 chrome 版本>=81 中不起作用。行为平滑没有发生

har*_*amy 5 javascript smooth-scrolling

if (document.querySelector(target)) {
  event.preventDefault();
  document.querySelector(target).scrollIntoView({ behavior: 'smooth' });
}

Run Code Online (Sandbox Code Playgroud)

scrollIntoView即使event.preventDefault用于避免默认锚标记行为,上述行为也无法正常工作。功能在 IE 和 firefox 中有效,但在 chrome 版本中无效>=81

var dropdownElement = document.getElementById('dropdown');

dropdownElement.addEventListener('change', function(ev) {
  var containerChoosed = document.getElementById('container_' + this.value);
  containerChoosed.scrollIntoView({
    block: "center",
    behaviour: "smooth"
  });
});
Run Code Online (Sandbox Code Playgroud)
div {
  border: 1px solid;
  height: 400px;
  margin: 16px;
}

#container_1 {
  background-color: yellow;
}

#container_2 {
  background-color: blue;
}

#container_3 {
  background-color: green;
}

#container_4 {
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>

	<select id="dropdown">
	  <option value="1">Div 1</option>
	  <option value="2">Div 2</option>
	  <option value="3">Div 3</option>
	  <option value="4">Div 4</option>
	</select>

	<div id="container_1">div 1</div>
	<div id="container_2">div 2</div>
	<div id="container_3">div 3</div>
	<div id="container_4">div 4</div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当在下拉列表中选择任何 div 时,它会滚动到相应的 div,但平滑行为不仅在 chrome 中起作用,而且 chrome 的版本是 81.0.4044.138(官方版本)

Uza*_*yed 6

我找到了解决这个问题的方法

  1. 打开一个新选项卡

  2. 输入“chrome://flags”并按 Enter 键

  3. 在搜索栏中搜索“平滑滚动”

  4. 启用它并重新加载

并做了

  • chrome://flags/#smooth-scrolling =) (5认同)
  • 这与其说是一种解决方案,不如说是一种黑客攻击。 (3认同)

Mis*_*bib 5

现在有一个 css 属性可以实现相同的效果

scroll-behavior: smooth;
Run Code Online (Sandbox Code Playgroud)

尽管在撰写本文时浏览器兼容性不如 js 解决方案。


Kyr*_*Kyr 3

只是一个拼写错误,属性必须behavior改为behaviour

var dropdownElement = document.getElementById('dropdown');

dropdownElement.addEventListener('change', function(ev) {
  var containerChoosed = document.getElementById('container_' + this.value);
  containerChoosed.scrollIntoView({
    block: "center",
    behavior: "smooth"
  });
});
Run Code Online (Sandbox Code Playgroud)
div {
  border: 1px solid;
  height: 40px;
  margin: 16px;
}

hr {
  height: 40px;
}

select {
  position: fixed;
  top: 0;
  left: 0;
}
  
#container_1 {
  background-color: yellow;
}

#container_2 {
  background-color: blue;
}

#container_3 {
  background-color: green;
}

#container_4 {
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>

<head>
  <title></title>
</head>

<body>

  <select id="dropdown">
    <option value="1">Div 1</option>
    <option value="2">Div 2</option>
    <option value="3">Div 3</option>
    <option value="4">Div 4</option>
  </select>

  <div id="container_1">div 1</div>
  <hr />
  <hr />
  <hr />
  <hr />
  <hr />
  <div id="container_2">div 2</div>
  <hr />
  <hr />
  <hr />
  <hr />
  <hr />
  <div id="container_3">div 3</div>
  <hr />
  <hr />
  <hr />
  <hr />
  <hr />
  <div id="container_4">div 4</div>

</body>

</html>
Run Code Online (Sandbox Code Playgroud)

  • 即使在添加行为而不是拼写错误行为之后,平滑滚动也不会发生,而是直接跳转到 div。运行你的代码片段,同样的问题仍然存在。没有发生平滑滚动 (2认同)