JS实现css响应式布局方案

方案一: 纯css响应式布局

原理: 基于特定元素的宽度 而非视图 进行响应式布局
⚠️ 有兼容性问题

  • 观察的元素上
js 复制代码
    container-type :inline-size ; 
    container-name: drawer-container
  • 基于容器宽度的响应式布局定义
js 复制代码
 基于容器宽度(而非视口)的条件样式
  @container drawer-container (max-width: 780px) {
    .custom-drawer { 
       position: absolute; 
    } 
  }

方案二: css媒体查询的js实现

原理: 通过JS new ResizeObserver监听元素尺寸,动态切换css样式

1.你的场景:

  • 用户调整窗口大小 → 触发 ResizeObserver 回调,检测目标元素宽度变化。
  • 根据宽度阈值 → 动态修改 data-mode,切换 CSS 样式。

2. 关键问题分析:

  1. ResizeObserver 本身已经是异步的,浏览器会自动优化,避免强制同步布局(reflow)。
  2. requestAnimationFrame 的作用:确保 UI 更新与浏览器渲染帧同步,适合动画或高频视觉更新。
  3. throttle 的作用:控制回调执行频率,避免冗余计算。

2.1 需要使用 requestAnimationFrame

❌ 通常不需要,因为:

  • ResizeObserver 回调已经是在布局计算完成后触发,不会导致强制重排。
  • data-mode 的切换是轻量操作(修改 DOM 属性),不涉及复杂渲染或动画。

2.2 是否需要 throttle

✅ 推荐使用,但取决于 ResizeObserver 的触发频率:

  • 如果用户 快速拖拽窗口边缘ResizeObserver 可能高频触发(如每秒 100+ 次)。
  • 通过 throttle 限制检测频率(如 100ms),可减少不必要的计算。
js 复制代码
// 纯 throttle,100ms 检测一次(最佳平衡)
const handleResize = throttle((entries) => {
  const width = entries[0].contentRect.width;
  element.dataset.mode = width >= 768 ? "desktop" : "mobile";
}, 100, { leading: true, trailing: true });

const observer = new ResizeObserver(handleResize);
observer.observe(targetElement);
相关推荐
仟濹10 分钟前
【HTML】基础学习【数据分析全栈攻略:爬虫+处理+可视化+报告】
大数据·前端·爬虫·数据挖掘·数据分析·html
小小小小宇1 小时前
前端WebWorker笔记总结
前端
小小小小宇1 小时前
前端监控用户停留时长
前端
小小小小宇2 小时前
前端性能监控笔记
前端
烛阴2 小时前
Date-fns教程:现代JavaScript日期处理从入门到精通
前端·javascript
全栈小52 小时前
【前端】Vue3+elementui+ts,TypeScript Promise<string>转string错误解析,习惯性请出DeepSeek来解答
前端·elementui·typescript·vue3·同步异步
穗余2 小时前
NodeJS全栈开发面试题讲解——P6安全与鉴权
前端·sql·xss
穗余4 小时前
NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
前端·node.js
航Hang*4 小时前
WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM
前端·笔记·edge·less·css3·html5·webstorm
江城开朗的豌豆4 小时前
JavaScript篇:a==0 && a==1 居然能成立?揭秘JS中的"魔法"比较
前端·javascript·面试