导航栏拖拽后宽度不保持,主因是未在页面加载时读取localStorage值并正确应用:需在DOMContentLoaded后读取并设置width或CSS变量,避免flex冲突、!important覆盖及触摸事件未处理。
左侧导航栏拖拽后宽度不保持?localStorage 存的是像素值但没读回来
拖拽调整后的宽度没记住,基本是因为只存了 localstorage.setitem('navwidth', width),但没在页面加载时读取并应用。更常见的是读取了却没触发 dom 更新——比如直接改了 style.width 但元素用的是 flex 或 calc() 布局,css 优先级压过了内联样式。
- 务必在 DOM 加载完成后(如
DOMContentLoaded)读取localStorage.getItem('navWidth'),再设给导航容器 - 如果导航栏是
flex子项,别只写element.style.width = '240px',要配合flex: 0 0 240px或用min-width/max-width配合 - 存值时建议统一用整数像素,避免存
'239.7px'这类浮点字符串,后续比较或计算容易出错
resizeObserver 不适合监听导航栏拖拽,该用 mousemove + mousedown
想靠 ResizeObserver 捕获拖拽过程中的宽度变化?它只响应浏览器主动触发的尺寸变更(如窗口缩放、字体加载),对鼠标拖动改变的 style.width 无感。拖拽逻辑必须自己实现事件监听链。
- 拖拽手柄(如
.nav-resizer)绑定mousedown,记下初始鼠标位置和当前导航宽度 - 在
document上监听mousemove,用clientX差值算出新宽度,限制最小/最大值(例如Math.min(Math.max(newWidth, 180), 360)) - 松开鼠标(
mouseup或mouseleave)时存入localStorage,并移除临时监听器 - 别在
mousemove里频繁操作 DOM,先算好值,用requestAnimationFrame批量更新
CSS 强制设定宽度后拖拽失效?检查 !important 和 flex 冲突
写了 .sidebar { width: 220px !important; },结果拖拽完全没反应——!important 会锁死内联样式的 width 覆盖,而拖拽逻辑通常靠改 style.width 生效。
- 删掉所有针对导航栏宽度的
!important;真要强制最小宽度,用min-width: 180px更安全 - 如果父容器是
display: flex,子导航栏又没设flex-shrink: 0,即使 JS 改了width,flex 也会把它拉回“合理”尺寸 - 推荐组合:导航栏设
flex: 0 0 var(--nav-width, 220px),JS 改style.setProperty('--nav-width', '240px'),比直接动width更可控
移动端拖拽体验差?别忽略 touchstart/touchmove 和防误触
PC 端拖拽正常,手机上划一下就整个页面滚动了,导航栏根本拖不动——因为没拦截触摸事件的默认行为,也没做 touch-action: none。
- 拖拽手柄加
touch-action: none,否则 iOS Safari 会优先触发滚动 - 在
touchstart里调用event.preventDefault(),并绑定touchmove和touchend对应逻辑 - 为防手滑误触,可加个
deltaThreshold = 5:只有触摸移动超 5px 才进入拖拽状态,否则当普通点击处理 - 别用
mouse事件监听移动端,某些 Android 浏览器 touch 后会补发 mouse 事件,导致重复触发
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











