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

如何通过JavaScript根据屏幕尺寸动态加载对应的CSS文件

现有实现的问题

你当前的代码只能满足页面首次加载时窗口宽度小于576px的单一加载场景,不算完整可用的实现,存在以下明显缺陷:

  • 仅在页面初始化时判断一次宽度,用户后续手动缩放窗口、横竖屏切换时,不会动态切换/卸载对应样式,容易出现样式冲突
  • 依赖JS执行,用户禁用JS时对应样式完全不会加载,兼容性差
  • 动态加载CSS会产生短暂的无样式内容闪烁(FOUC),影响用户体验
更优实现方案

方案1:原生link标签media属性实现(首推)

完全不需要写JS,用HTML原生特性即可实现需求,浏览器会自动根据当前屏幕尺寸匹配生效的样式,窗口变化时也会自动切换:

<!-- 宽度<576px时自动生效,大于该尺寸时仅加载不启用样式 -->
<link rel="stylesheet" href="xs_0/style.css" media="(max-width: 575.98px)">
<!-- 其他断点的适配样式可同理配置 -->
<link rel="stylesheet" href="sm_style.css" media="(min-width: 576px) and (max-width: 767.98px)">
<link rel="stylesheet" href="default_style.css" media="(min-width: 768px)">

该方案优势:

  • 原生支持无兼容性问题,不依赖JS运行
  • 窗口尺寸变化时自动切换生效样式,无需额外逻辑
  • 样式可提前加载,不会出现FOUC问题

方案2:优化后的动态JS实现(适合需要节省带宽的场景)

如果你不想提前加载所有断点的CSS、希望按需加载减少带宽消耗,可以用优化后的JS方案,新增resize监听、防抖处理、旧样式卸载逻辑:

// 存储已加载的样式节点,方便后续卸载
let loadedStyleNode = null
const MOBILE_BREAKPOINT = 576
// 防抖定时器
let resizeTimer = null

function loadAdaptiveStyle() {
  const isMobileViewport = window.innerWidth < MOBILE_BREAKPOINT
  // 已加载对应样式则直接返回
  if (loadedStyleNode) {
    const loadedIsMobile = loadedStyleNode.href.includes('xs_0')
    if (loadedIsMobile === isMobileViewport) return
    // 样式不匹配则卸载旧节点
    loadedStyleNode.remove()
    loadedStyleNode = null
  }
  // 创建新样式节点加载对应CSS
  const link = document.createElement('link')
  link.rel = 'stylesheet'
  link.type = 'text/css'
  link.href = isMobileViewport ? 'xs_0/style.css' : 'default_style.css'
  document.head.appendChild(link)
  loadedStyleNode = link
}

// 页面初始化时执行
loadAdaptiveStyle()
// 监听窗口变化,加200ms防抖避免频繁触发
window.addEventListener('resize', () => {
  clearTimeout(resizeTimer)
  resizeTimer = setTimeout(loadAdaptiveStyle, 200)
})

内容的提问来源于stack exchange,提问作者Path Parakh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:24:00