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

为什么我的JavaScript子菜单系统无法正常打开且移动端布局错乱

问题根因

  • viewport元标签错误放置在body标签内,移动端浏览器无法正常识别,导致初始布局缩放异常
  • 菜单触摸事件没有限制执行环境,桌面端加载代码时找不到#box1元素会抛出JS异常,可能干扰样式加载逻辑
  • 直接赋值className会覆盖元素原有所有类名,若移动端样式依赖其他基础类名就会导致布局错乱
  • UA检测规则覆盖范围过窄,仅识别Android和Mac设备,遗漏iOS、Windows等常见设备的适配
  • 未做桌面/移动端布局的互斥隐藏,两个布局结构同时存在可能导致样式冲突
  • touchmove事件中全局禁用默认行为,会导致页面触摸到菜单区域时无法正常滑动

修复代码

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- 修复:将viewport移到head内,保证移动端正常识别 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>HOME</title>
<style>
/* 修复:默认隐藏两个布局,避免加载过程中出现样式错乱 */
#DESKTOP, #MOBILE {
    display: none;
}
</style>
</head>
<body onload="load_style()"> 
<script>
let isMobile = false; // 全局标记当前是否为移动端环境

function MOBILE_LAYOUT() {
    // 修复:补充移动端UA检测范围,覆盖iOS、安卓等常见移动设备
    if(/(Android|iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
        isMobile = true;
        var mobile = document.createElement("link");
        mobile.rel = "stylesheet";
        mobile.type = "text/css";
        mobile.media = "all";
        mobile.href = "../mobileSTYLE.css";
        console.log("MOBILE LAYOUT CSS loaded.");

        document.head.appendChild(mobile);
        // 修复:显示移动端布局,隐藏桌面端布局
        document.getElementById("MOBILE").style.display = "block";
        document.getElementById("DESKTOP").style.display = "none";
    }
}

function DESKTOP_LAYOUT() {
    // 修复:非移动端设备默认加载桌面端样式
    if(!/(Android|iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
        var desktop = document.createElement("link");
        desktop.rel = "stylesheet";
        desktop.type = "text/css";
        desktop.media = "all";
        desktop.href = "../DESKTOPstyle.css";
        console.log("DESKTOP LAYOUT CSS loaded.");

        document.head.appendChild(desktop);
        // 修复:显示桌面端布局,隐藏移动端布局
        document.getElementById("DESKTOP").style.display = "block";
        document.getElementById("MOBILE").style.display = "none";
    }
}
    
function load_style() {
    DESKTOP_LAYOUT();
    MOBILE_LAYOUT();
}

window.addEventListener('load', function(){
    // 修复:仅移动端环境绑定菜单触摸事件,避免桌面端报错
    if(!isMobile) return;

    var box1 = document.getElementById('box1')
    var startx = 0
    var starty = 0
    var dist = 0
    
    box1.addEventListener('touchstart', function(e){
        var touchobj = e.changedTouches[0]
        startx = parseInt(touchobj.clientX)
        starty = parseInt(touchobj.clientY)
    }, false)
    
    box1.addEventListener('touchmove', function(e){ 
        var touchobj = e.changedTouches[0]
        var distX = parseInt(touchobj.clientX) - startx
        var distY = parseInt(touchobj.clientY) - starty
        // 修复:仅横向滑动时禁用默认行为,避免影响页面竖向滑动
        if (Math.abs(distX) > Math.abs(distY) && e.cancelable) {
            e.preventDefault();
        }
    }, false)
    
    box1.addEventListener('touchend', function(e){
        var touchobj = e.changedTouches[0]
        var distX = parseInt(touchobj.clientX) - startx
        var distY = parseInt(touchobj.clientY) - starty
        // 修复:仅点击(移动距离小于10px)时切换菜单状态,避免滑动误触发
        if(Math.abs(distX) < 10 && Math.abs(distY) <10) {
            // 修复:用classList切换类名,不会覆盖原有类
            box1.classList.toggle("OPEN_topmenu");
            box1.classList.toggle("OPEN_submenu");
            box1.classList.toggle("closedMENU");
            box1.classList.toggle("closedsubmenu");
        }
        e.preventDefault()
    }, false)
    
}, false)
</script>

<div id="DESKTOP">
<div id="WEBSITEbanner">
  <h1>HOME</h1>
</div>
<ul class="topmenu">
  <li class="submenu"><a href="../Art_Work.html"><b>Game
        Art Work</b></a>
    <ul>
      <li><a href="../Game_Art_Work.html#Monkey">
          Monkey</a></li>
      <li><a href="../Game_Art_Work.html#3D_Work">3D
          Work</a></li>
      <li><a href="">Cztery</a></li>
    </ul>
  </li>
  <li class="submenu"><a href="../Games.html"><b>Games</b></a>
    <ul>
      <li><a href="">szesc</a></li>
      <li><a href="">siedem</a></li>
      <li><a href="">osiem</a></li>
    </ul>
  </li>
  <li class="submenu"><a href="../Games_D.html"><b>Game
        D</b></a>
    <ul>
      <li><a href="">dziesiec</a></li>
      <li><a href="">jedenascie</a></li>
    </ul>
  </li>
</ul>

<div id="center">
  <div id="Services">
    <center>
      <h1><a name="#3D_Work">About Me</a></h1>
    </center>
    Hi,
    <p></p>
    Welcome to the website.
    <p></p>
    Welcome Description </div>
</div>

</div>
<p></p>
<div id="footer">
  <h3>Footer</h3>
</div>
</div>
<div id="MOBILE">
<div id="Hometitle">
  <h1>HOME</h1>
</div>
<ul class="closedMENU closedsubmenu" id="box1">
  <div id="MENU_heading_HIDDEN">Menu </div>
  <li id="MENU_heading_HIDDEN"><br>
    <a href="../Game_Art_Work.html">Game
      Art Work</a></li>
  <li id="MENU_heading_HIDDEN"><br>
    <a href="../Games.html">Games</a></li>
  <li id="MENU_heading_HIDDEN"><br>
    <a href="../Games_D.html">Game
      D</a></li>
</ul>
<div id="BLOG_ARTICLE_1">
  <div id="BLOGtitle"> Hi,<br>
    Welcome to the website.<br>
    <br>
    Welcome Description</div>
</div>
<br>
<div id="BLOG_ARTICLE_1">
  <div id="BLOGtitle">Footer </div>
</div>
<br>
</div>
</body>
</html>

效果参考

当前异常效果:
导航菜单栏布局异常
预期正常效果:
导航菜单栏布局正常

内容的提问来源于stack exchange,提问作者Formula 1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:48:01