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

WordPress区块开发中screen.width/innerWidth值异常求助

问题原因解释

WordPress区块的save.js负责生成区块的静态HTML标记,这段代码的执行时机是在webpack编译阶段或者WordPress的服务器端渲染过程中,而非用户的浏览器前端环境。这意味着你在save.js中访问的screen.width、window.innerWidth,实际上是编译/服务器环境中的固定值(比如服务器的屏幕尺寸或者webpack编译时的模拟环境值),自然不会随用户设备变化。

而绑定在onclick事件中的alert()是在用户浏览器中触发执行的,此时访问的是当前设备的真实浏览器环境,所以能拿到正确的屏幕宽度值。

解决方案

针对WordPress区块的响应式需求,正确的做法是将逻辑拆分到静态生成和前端交互两个层面:

  • 优先用CSS媒体查询控制:如果只是简单的显示/隐藏或样式调整,直接在区块的样式文件中写媒体查询,这是最符合WordPress区块设计逻辑的方式——静态HTML统一输出,样式由浏览器根据设备自动适配:

    /* 示例:移动端隐藏指定元素 */
    @media (max-width: 768px) {
      .your-block-target-element {
        display: none;
      }
    }
    
  • 前端JS动态处理(复杂逻辑场景):如果必须用JS实现交互逻辑,不要在save.js中处理,而是将逻辑放到edit.js的组件生命周期中,或者单独编写前端脚本加载到前端:
    比如在edit.js中监听窗口尺寸变化,动态渲染内容:

    import { useEffect, useState } from '@wordpress/element';
    
    const YourBlockEdit = () => {
      const [screenWidth, setScreenWidth] = useState(window.innerWidth);
    
      useEffect(() => {
        const handleResize = () => setScreenWidth(window.innerWidth);
        window.addEventListener('resize', handleResize);
        // 组件卸载时移除监听
        return () => window.removeEventListener('resize', handleResize);
      }, []);
    
      return (
        <div className="your-block">
          {screenWidth < 768 ? <p>移动端专属内容</p> : <p>桌面端专属内容</p>}
        </div>
      );
    };
    
    export default YourBlockEdit;
    

    对应的save.js只输出基础静态容器即可:

    const YourBlockSave = () => {
      return <div className="your-block"></div>;
    };
    
    export default YourBlockSave;
    

内容的提问来源于stack exchange,提问作者Bernard Gineste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:57:39