You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte 3如何阻止修改number/range类型input值时页面滚动到顶部

Svelte 3 修改number/range类型input时页面滚动到顶部的解决方法

Svelte 3 本身没有内置和 sapper:noscroll 对应的针对input值修改场景的专用指令,你遇到的滚动问题和Sapper路由跳转触发的滚动属于两类不同场景,可通过以下几种方案解决:

  • 方案1:阻止input修改值时的默认滚动行为
    在input的输入事件中调用preventDefault(),拦截浏览器默认的滚动到控件定位逻辑,不会影响值的绑定效果:
<input 
  type="number" 
  bind:value={temper} 
  min="0" 
  max="50"
  on:input={(e) => e.preventDefault()}
/>
  • 方案2:固定input的DOM节点避免重渲染
    如果滚动是因为值更新触发了上层DOM重排、Svelte销毁重建input节点导致的,给input加固定key属性,强制Svelte复用同一个DOM节点:
<input 
  type="number" 
  bind:value={temper} 
  min="0" 
  max="50"
  key="fixed-temper-input"
/>
  • 方案3:手动记录恢复滚动位置
    如果前两种方案都不生效,可以在值更新前记录当前页面滚动位置,DOM更新完成后恢复:
<script>
  let temper = 0;

  function handleInput(e) {
    const currentScroll = window.scrollY;
    temper = e.target.value;
    requestAnimationFrame(() => {
      window.scrollTo(0, currentScroll);
    })
  }
</script>

<input 
  type="number" 
  bind:value={temper} 
  min="0" 
  max="50"
  on:input={handleInput}
/>

内容的提问来源于stack exchange,提问作者Gani Ganapathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:27:05