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

JavaScript中如何还原媒体查询触发的样式变更?

JavaScript中如何还原媒体查询触发的样式变更?

嘿,我明白你的困扰——硬编码还原样式确实很麻烦,尤其是当原始样式来自CSS样式表而非内联定义的时候。这里有几个实用的方法可以帮你解决这个问题:

方法一:提前保存原始样式值

在页面初始化时,把元素的原始样式(比如字体大小)保存下来,后续还原时直接使用这个值即可。你可以把值存在元素的dataset属性里,或者单独的变量中,方便后续调用:

// 初始化阶段:获取并保存元素的原始字体大小
// 用getComputedStyle获取元素实际应用的样式(不管来自样式表还是内联)
const originalFontSize = window.getComputedStyle(elms).fontSize;
// 存在元素的dataset中,方便多元素场景复用
elms.dataset.originalFontSize = originalFontSize;

let mQuery = window.matchMedia(`(max-width: ${attributes.size}px)`);

function resize() {
  let change = {
    style: attributes.modifier.split("-")[0],
    by: attributes.modifier.split("-")[1]
  };

  if (mQuery.matches) {
    switch (change.style) {
      case "f":
        elms.style.fontSize = `${change.by}px`;
        break;
    }
  } else {
    switch (change.style) {
      case "f":
        // 使用保存的原始值还原样式
        elms.style.fontSize = elms.dataset.originalFontSize;
        break;
    }
  }
}

// 监听媒体查询变化
mQuery.addListener(resize);
// 页面加载时先执行一次,确保样式正确
resize();

方法二:用CSS类替代直接修改内联样式

这是更推荐的做法,把样式逻辑完全交给CSS,JavaScript只负责添加或移除类名。这样当媒体查询不匹配时,只要移除对应的类,元素就会自动回到原始样式,完全不用手动处理样式值:

首先在CSS中定义样式类:

/* 元素的默认样式 */
.target-element {
  font-size: 16px; /* 你的默认字体大小 */
}

/* 媒体查询触发的样式类 */
.target-element.font-24 {
  font-size: 24px;
}

.target-element.font-36 {
  font-size: 36px;
}

然后修改JavaScript代码:

let mQuery = window.matchMedia(`(max-width: ${attributes.size}px)`);

function resize() {
  let change = {
    style: attributes.modifier.split("-")[0],
    by: attributes.modifier.split("-")[1]
  };

  if (mQuery.matches) {
    switch (change.style) {
      case "f":
        // 添加对应的样式类
        elms.classList.add(`font-${change.by}`);
        break;
    }
  } else {
    switch (change.style) {
      case "f":
        // 移除样式类,自动还原原始样式
        elms.classList.remove(`font-${change.by}`);
        break;
    }
  }
}

mQuery.addListener(resize);
resize();

方法三:直接重置内联样式为空

如果你的元素原始样式完全来自CSS样式表(没有内联样式),可以直接把对应的样式属性设为空字符串,浏览器会忽略内联样式,自动应用样式表中的规则:

else {
  switch (change.style) {
    case "f":
      // 重置内联fontSize,回到CSS定义的原始样式
      elms.style.fontSize = "";
      break;
  }
}

总结

优先推荐第二种方法(CSS类切换),它更符合“关注点分离”的原则,样式逻辑集中在CSS中,JavaScript只负责状态管理,后期维护起来更轻松。如果必须使用内联样式修改,第一种保存原始值的方法更可靠,能覆盖内联和外部样式的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:47:32