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

Android端Chrome垂直滚动失效求助(Bootstrap5+Angular13)

Android端Chrome侧边栏垂直滚动失效问题(Bootstrap5 + Angular13)

问题描述

桌面端所有浏览器、Android端Firefox的侧边栏垂直滚动均正常,但Android端Chrome的垂直滚动功能完全失效。

相关代码

HTML代码

<nav class="sidenav shadow-right" id="sidenavAccordion" [ngClass]="sidenavStyle" data-cy="sideNav">
    <div class="sidenav-menu scrollable">
        <div class="nav">
            <ng-container *ngFor="let section of sideNavSections">
                <div class="sidenav-menu-heading" *ngIf="section.text">{{ section.text }}</div>
                <ng-container *ngFor="let item of section.items">
                    <sbpro-side-nav-item [sideNavItem]="sideNavItems[item]"></sbpro-side-nav-item>
                </ng-container>
            </ng-container>
        </div>
    </div>
    <div class="sidenav-footer">
        <div class="sidenav-footer-content" *ngIf="userService.user$ | async as user">
            <div class="sidenav-footer-subtitle">Logado como:</div>
            <div class="sidenav-footer-title">{{user.user.firstName}} {{user.user.lastName}}</div>
        </div>
    </div>
</nav>

SCSS代码

.sidenav {
    display: flex;
    flex-direction: column;
    height: 100%;
    flex-wrap: nowrap;
    font-size: 0.9rem;

    .sidenav-menu {
        flex-grow: 1;

        .nav {
            flex-direction: column;
            flex-wrap: nowrap;

            .sidenav-menu-heading {
                padding: 1.75rem 1rem 0.75rem;
                font-size: 0.7rem;
                font-weight: bold;
                text-transform: uppercase;
                letter-spacing: 0.05em;
            }

            .nav-link {
                display: flex;
                align-items: center;
                line-height: normal;
                padding-top: 0.75rem;
                padding-bottom: 0.75rem;
                position: relative;

                .nav-link-icon {
                    font-size: 0.9rem;
                    padding-right: 0.5rem;
                    display: inline-flex;

                    .feather {
                        width: 1rem;
                        height: 1rem;
                    }
                }

                &.active {
                    font-weight: 600;

                    .nav-icon {
                        color: $primary;
                    }
                }

                .sidenav-collapse-arrow {
                    display: inline-block;
                    margin-left: auto;
                    transition: transform 0.15s ease;
                }

                &.collapsed {
                    .sidenav-collapse-arrow {
                        transform: rotate(-90deg);
                    }
                }

                .badge {
                    padding: 0.125rem 0.25rem;
                }
            }

            .sidenav-menu-nested {
                flex-direction: column;
                margin-left: 2rem - $sidenav-nested-border-offest;
                border-left-style: solid;
                border-left-width: thin;
                padding-left: $sidenav-nested-border-offest;
            }
        }
    }
}

各端效果截图

  • Android Chrome效果:
    Android Chrome效果
  • Android Firefox效果:
    Android Firefox效果
  • 桌面端效果:
    桌面端效果

解决方案

Android Chrome在flex容器内处理滚动元素时,容易因高度计算偏差导致滚动失效,可通过以下方式修复:

方案1:完善滚动容器的高度与滚动属性

修改.sidenav及.sidenav-menu的SCSS代码,明确滚动规则并修复flex高度计算bug:

.sidenav {
    display: flex;
    flex-direction: column;
    height: 100vh; /* 用100vh确保全屏高度,避免继承高度的不确定性 */
    flex-wrap: nowrap;
    font-size: 0.9rem;
    overflow: hidden; /* 防止父容器出现多余滚动条 */

    .sidenav-menu {
        flex-grow: 1;
        overflow-y: auto; /* 明确开启垂直滚动 */
        overflow-x: hidden; /* 隐藏水平滚动 */
        min-height: 0; /* 修复Android Chrome的flex子容器高度计算bug */
    }

    .sidenav-footer {
        flex-shrink: 0; /* 固定底部区域,不被滚动容器压缩 */
    }
}

方案2:添加触摸行为声明

Android Chrome的触摸事件可能干扰滚动,给滚动容器添加属性明确允许垂直滚动:

.scrollable {
    touch-action: pan-y;
    overflow-y: auto;
}

方案3:检查Angular样式作用域

如果Angular的视图封装导致滚动样式未生效,可将滚动相关样式移至全局样式文件,或使用::ng-deep强制穿透样式作用域(注意::ng-deep后续版本可能废弃,优先调整样式作用域)。

验证方式

修改后重新编译部署,在Android Chrome中测试:

  • 确认侧边栏内容超出容器高度时可正常滚动
  • 滚动过程无卡顿或失效情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:15:01