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

JavaScript无法获取pre元素:querySelector返回null报错求助

问题解决:querySelector返回null导致样式操作报错

问题原因

你的JS代码在<head>标签内加载执行时,<body>里的<pre>元素还未被浏览器解析渲染完成,因此document.querySelector("pre")会返回null。当鼠标移动触发事件调用rotateElement函数时,尝试访问null的style属性就会抛出类型错误。

修复方案

有三种常用方法可以解决这个DOM加载顺序问题:

方法1:将script标签移至body末尾

把<script>标签放到</body>闭合标签之前,确保所有DOM元素加载完成后再执行JS代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D Effect</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <pre class="language-css" tabindex="0"><code class="language-css"><span class="token selector">.awesome-layouts</span> <span class="token punctuation">{</span>
        <span class="token property">display</span><span class="token punctuation">:</span> grid<span class="token punctuation">;</span>
        <span class="token punctuation">}</span></code></pre>

    <!-- 移至body末尾 -->
    <script src="main.js" type="application/javascript"></script>
</body>
</html>

方法2:用DOMContentLoaded事件包裹代码

在JS代码中监听DOMContentLoaded事件,确保DOM加载完成后再执行元素查询和事件绑定:

document.addEventListener('DOMContentLoaded', () => {
    const pre = document.querySelector("pre");
    console.log(pre)

    document.addEventListener("mousemove", (e) => {
        rotateElement(e, pre);
    })

    function rotateElement(event, element) {
        const x = event.clientX;
        const y = event.clientY; 

        const middleX = window.innerWidth / 2;
        const middleY = window.innerHeight / 2;

        const offsetX = ((x-middleX) / middleX) * 30;
        // 修正:原代码错误使用x计算Y轴偏移,改为y
        const offsetY = ((y-middleY) / middleY) * 30;

        element.style.setProperty("--rotateX", -1 * offsetY + "deg");
        element.style.setProperty("--rotateY", offsetX + "deg");
    }
})

方法3:给script标签添加defer属性

在<script>标签上添加defer属性,浏览器会在DOM加载完成后再执行脚本:

<script src="main.js" type="application/javascript" defer></script>

额外提示

注意你的代码中计算offsetY时错误使用了x-middleY,已在方法2中修正为y-middleY,否则3D旋转的Y轴效果会不符合预期。

内容的提问来源于stack exchange,提问作者Elton Grivith D Souza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:42:43