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

如何阻止侧边栏中两个嵌套绝对定位div重叠并实现滚动?

解决侧边栏绝对定位元素重叠及滚动问题

问题原因

重叠的核心问题是绝对定位元素脱离了文档流:sound-detection-details-container和AM-on-off-container使用absolute固定在底部,但上方的正常流内容不会为它们预留空间。当屏幕高度不足时,正常流的strobe-duration-container就会和底部绝对定位的元素重叠。

解决方案(Tailwind CSS实现)

通过Flex布局重构侧边栏结构,将内容分为「可滚动的主体区域」和「固定的底部区域」,既避免重叠,又能在内容溢出时自动触发滚动:

  1. 调整侧边栏容器的布局模式
    把sidebar-container改为垂直Flex布局,让内部元素自动分配空间,同时限制整体高度。
  2. 拆分内容区域
    • 将顶部到strobe-duration-container的所有内容包裹在一个新容器中,设置overflow-y-auto实现滚动。
    • 把sound-detection-details-container和AM-on-off-container放在另一个容器里,用mt-auto让它固定在侧边栏底部,不占用主体滚动区域的空间。
  3. 移除绝对定位
    删掉底部两个容器的absolute、bottom-*类,让它们回到文档流中,由Flex布局控制位置。

修改后的完整代码

<body class="bg-black">
    <div id="sidebar">
        <!-- 侧边栏容器改为垂直Flex,高度占满屏幕,隐藏溢出 -->
        <div id="sidebar-container" class="py-1.5 bg-gray-300 w-[400px] h-screen flex flex-col overflow-hidden z-1 opacity-100">
            <!-- 可滚动的主体内容区域 -->
            <div class="overflow-y-auto">
                <div id="sidebar-logo" class="w-[300px] mx-auto">
                    <img class="" src="assets\img\logo-V2\logo-horizontal-black.png">
                </div>

                <hr class="w-[375px] border border-solid border-zinc-700 mx-auto">

                <h3 class="text-center py-3 text-xl text-gray-600 font-semibold">STROBE SYNC MODE</h3>

                <div id="auto-manual-container" class="w-[330px] ml-[35px] flex justify-between">
                    <button id="auto" class="w-[150px] h-10 mb-4 bg-white rounded font-bold text-xl text-themeOrange selected" onclick="autoMode()">AUTO</button>
                    <button id="manual" class="w-[150px] h-10 mb-4 bg-white rounded font-bold text-xl text-gray-700" onclick="manualMode();">MANUAL</button>
                </div>

                <hr class="w-[375px] border border-solid border-zinc-700 mx-auto">

                <div id="auto-mode-container" class=""> <!-- "AM" stands for "Auto Mode" -->
                    <div id="input-device-container" class="w-[330px] ml-[35px]">
                        <h5 class="mt-3 mb-1 font-semibold text-sm text-gray-500">INPUT DEVICE</h5>

                        <select id="select-input-device" class="w-full h-10 mb-5 flex mx-auto bg-white rounded outline-none font-semibold text-center text-gray-700" required>
                            <option value="" selected disabled hidden>SELECT DEVICE</option>
                            <option value="" class="device text-left">&nbsp;Integrated Player</option>
                            <option value="" class="device text-left">&nbsp;Example Device</option>
                        </select>
                    </div>

                    <div id="frequency-range-focus-container" class="w-[330px] ml-[35px]">
                        <h5 class="mt-3 mb-1 font-semibold text-sm text-gray-500">FREQUENCY RANGE FOCUS</h5>

                        <div id="low-mid-high-container" class="w-full flex justify-between">
                            <button id="low" class="w-[100px] h-6 mb-4 pt-[2px] bg-white rounded font-bold text-base text-themeOrange selected" onclick="low_Btn()">LOW</button>
                            <button id="mid" class="w-[100px] h-6 mb-4 pt-[2px] bg-white rounded font-bold text-base text-gray-700" onclick="mid_Btn()">MID</button>
                            <button id="high" class="w-[100px] h-6 mb-4 pt-[2px] bg-white rounded font-bold text-base text-gray-700" onclick="high_Btn()">HIGH</button>
                        </div>
                        <button id="master" class="w-full h-12 mb-3 pt-[2px] bg-white rounded font-bold text-base text-gray-700" onclick="master_Btn()">MASTER</button>
                    </div>

                    <div id="detection-sensitivity-container" class="w-[330px] ml-[35px]">
                        <h5 id="sens-label" class="mt-3 mb-1 font-semibold text-sm text-gray-500"></h5>

                        <div id="sens-slider-container" class="w-full">
                            <input type="range" min="0" max="100" value="50" class="sens-slider w-full" id="sens-slider">
                            <p class="float-left font-regular text-sm text-gray-600">0</p>
                            <p class="float-right font-regular text-sm text-gray-600">100</p>
                        </div>
                    </div>

                    <br>

                    <div id="strobe-duration-container" class="w-[330px] ml-[35px]">
                        <h5 id="AM-duration-label" class="mt-3 mb-1 font-semibold text-sm text-gray-500"></h5>

                        <div id="duration-slider-container" class="duration-slider-container">
                            <input type="range" min="10" max="1000" value="200" class="duration-slider w-full" id="AM-duration-slider">
                            <p class="float-left font-regular text-sm text-gray-600">10</p>
                            <p class="float-right font-regular text-sm text-gray-600">1000</p>
                        </div>
                    </div>

                    <br>
                </div>
            </div>

            <!-- 固定在底部的区域:自动推到底部,不随主体滚动 -->
            <div class="mt-auto pb-4">
                <div id="sound-detection-details-container" class="w-[330px] ml-[35px] mb-4">
                    <h5 class="mt-3 mb-1 font-semibold text-sm text-gray-500">SOUND DETECTION DETAILS</h5>

                    <div id="SDD-container" class="w-full h-40 px-4 bg-white rounded flex flex-col justify-evenly">
                        <div id="SCT-container" class="w-full">
                            <h4 class="float-left font-semibold text-base text-gray-600">SOUND COME THROUGH</h4>
                            <label id="SCT-check-container" class="float-right">
                                <input type="checkbox" disabled checked> <!-- only check when audio coming trough, change with javascript -->
                                <span class="SCT-checkmark"></span>
                            </label>
                        </div>

                        <hr>
                        
                        <div id="tempo-container" class="w-full">
                            <h4 class="float-left font-semibold text-base text-gray-600">TEMPO:</h4>
                            <h4 id="bpm" class="float-right font-semibold text-base text-gray-600">150BPM</h4> <!-- change with javascript -->
                        </div>

                        <hr>
                        
                        <div id="audio-meter-container" class="w-full">
                            <h4 class="float-left font-semibold text-base text-gray-600">AUDIO METER</h4>
                            <label id="AM-check-container" class="float-right"><!-- in this context "AM" stands for "Audio Meter" -->
                                <input type="checkbox">
                                <span class="AM-checkmark"></span>
                            </label>
                        </div>
                    </div>
                </div>

                <div id="AM-on-off-container" class="w-[330px] ml-[35px] flex justify-between">
                    <button id="AM-off" class="w-[150px] h-10 bg-white rounded font-bold text-xl text-themeOrange selected" onclick="AM_turnOff()">OFF</button>
                    <button id="AM-on" class="w-[150px] h-10 bg-white rounded font-bold text-xl text-gray-700" onclick="AM_turnOn();">ON</button>
                </div>
            </div>
        </div>
    </div>
</body>

关键改动说明

  • sidebar-container:添加flex flex-col改为垂直布局,h-screen占满屏幕高度,overflow-hidden隐藏整体溢出。
  • 新增滚动容器:包裹顶部所有内容,添加overflow-y-auto,内容高度超过容器时自动显示滚动条。
  • 底部区域:用mt-auto让容器自动贴到侧边栏底部,移除原有的absolute定位类,确保底部元素始终在可视区域底部,且不会和上方内容重叠。
  • 修正单位:把ml-35px改为ml-[35px],Tailwind中自定义数值需要用方括号包裹。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:35:17