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

纯JavaScript实现屏幕尺寸适配视频源失效问题及视频重复加载疑问

纯JavaScript实现屏幕尺寸适配视频源失效问题及视频重复加载疑问

你遇到的这两个问题其实都有明确的解决方案,我来帮你拆解分析:

一、纯JavaScript版本视频源不加载的原因及修复

你原来的纯JS代码里,直接用mainVideo.append("<source...>")的方式添加字符串形式的标签,虽然能在DOM里看到,但video元素并不会自动识别并加载这个新添加的源——因为这种方式只是插入了HTML文本,没有触发video的资源加载逻辑。

正确的做法是创建真正的<source>DOM元素节点,添加到video里后,还要调用load()方法让video重新加载资源。另外,别忘了处理窗口大小变化的情况,不然用户调整窗口后视频源不会跟着切换。修正后的代码如下:

const mainVideo = document.getElementById("myVideo");
const medi = "/videos/ground_540p.mp4";
const large = "/videos/ground_1080p.mp4";

// 封装切换视频源的函数
function switchVideoSource() {
  // 先清除已有的source标签,避免重复添加
  while (mainVideo.firstChild) {
    mainVideo.removeChild(mainVideo.firstChild);
  }

  let sourceUrl;
  if (window.innerWidth >= 1080) {
    sourceUrl = large;
  } else if (window.innerWidth >= 720) {
    sourceUrl = medi;
  }

  if (sourceUrl) {
    const source = document.createElement("source");
    source.src = sourceUrl;
    source.type = "video/mp4";
    mainVideo.appendChild(source);
    // 让video加载新的源
    mainVideo.load();
  }
}

// 页面加载时执行一次
switchVideoSource();

// 监听窗口 resize 事件,动态切换
window.addEventListener("resize", switchVideoSource);

这样修改后,video元素能正确识别新添加的source并加载对应的视频资源,而且窗口大小变化时也能自动切换。

二、HTML原生media属性方案是否会重复加载?

你后来改用的HTML原生方案是更优的选择!这种方式完全不需要JS,浏览器会自动根据当前视口尺寸匹配对应的<source>标签,只会加载符合media查询条件的那个视频源,不会同时加载多个,所以不用担心重复加载的问题。

这个方案的优势很明显:

  • 浏览器原生支持,兼容性更好
  • 代码更简洁,不需要维护JS逻辑
  • 性能更优,浏览器会提前判断合适的源,避免不必要的资源请求

另外,建议你补充一个默认的source(不加media属性),确保在小屏幕设备上也有对应的视频源:

<div class="video-section">
  <div id="video-wrapper">
    <video autoplay muted loop id="myVideo" preload="auto">
      <source src="/videos/ground_1080p.mp4" media="(min-width: 1200px)" />
      <source src="/videos/ground_540p.mp4" media="(min-width: 768px)" />
      <!-- 小屏幕默认源 -->
      <source src="/videos/ground_360p.mp4" />
      I'm sorry; your browser doesn't support HTML video.
    </video>
  </div>
</div>

备注:内容来源于stack exchange,提问作者Malte K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:12:57