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

React App.js移动端浏览器滚动失效问题求助

移动端React双面板布局右侧内容无法滚动的解决方法

问题场景

React应用采用双面板布局,左侧为菜单面板,右侧为内容展示面板。已为SplitPaneRight设置style={{ overflowY: 'auto', maxHeight: '100vh' }}以实现内容超出时滚动,PC端浏览器显示正常,但在智能手机浏览器中,右侧内容虽需多页展示,却仅能显示第一页,无法通过上下滑动查看全部内容。

相关代码

App.js

import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate} from "react-router-dom";
import 'bootstrap/dist/css/bootstrap.min.css';
import { Layout } from "./components/common/Layout";
import SplitPane, {
  Divider,
  SplitPaneLeft,
  SplitPaneRight,
} from "./components/common/SplitPane";
import Liubao from './components/Liubao';
import Sidebar from './components/Sidebar';
import ListWork from './components/ListWork';
import Itemdetail from './components/common/Itemdetail';
import helper from './components/lib/helper';
import global from './components/lib/global';

const App = () => {

  const [routes, setRoutes] = useState([]);

  useEffect(() => {
    let isActive = true, _routes=[];
    const asynctask = async (url) => {
      let _cates = [];
      try {
          _cates = await helper.getAPIp(url,  "GET"); //retrieve categories
          if (_cates.status === 200) {
              let cat = await _cates.json();
              cat.map(i => {
                let temp = {
                  path:`${i.value}`,
                  element:<ListWork title={i.name} cateid={i.id} />
                };
                _routes.push(temp);
              });
              if (isActive) {
                setRoutes(_routes);  
              };
          } else {
              setRoutes([]);
          } 
      } catch(err) {
          console.log(err); 
          setRoutes([]);
      }
    };
    let urlcate = `${global.BASE_URL}/api/categories/cates`; // no middleware required
    asynctask(urlcate);
    return () => isActive = false;
  }, []);
  
  return (
    <Layout>
      <SplitPane className="split-pane-row">
        <Router>
          <SplitPaneLeft>
            <Sidebar style={{ borderRight: '1px solid #ccc', padding: '0 16px' }} />
          </SplitPaneLeft>
          <Divider className="separator-col" />
          <SplitPaneRight style={{ overflowY: 'auto', maxHeight: '100vh' }}>
              <Routes>
                <Route key={routes.length+2} path={'/liubao'} element={<Liubao />} />
                {routes.map(({ path, element, index }, idx) => (
                  <Route key={idx} path={path} element={element} index={index} />
                ))}
                 <Route key={routes.length + 1} path={'/itemdetail'} element={<Itemdetail />} />
                 <Route path="/*" element={<Navigate to="/liubao" />} />
              </Routes>
          </SplitPaneRight>
        </Router>
      </SplitPane>
    </Layout>
  );
};

export default App;

Layout.js

import React from "react";
import Container from "react-bootstrap/Container";
export const Layout = (props) => {
    return (<Container>
        {props.children}
    </Container>
    )};

解决方法

1. 重置全局样式,修正视口高度计算

移动端浏览器默认的html/body边距会导致100vh的实际高度超出视口,滚动被外层容器截断。在全局CSS文件中添加:

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
  overflow: hidden;
}

2. 调整Layout组件的容器样式

Container组件默认带有内边距,会压缩子元素高度。修改Layout.js,让容器占满整个视口:

import React from "react";
import Container from "react-bootstrap/Container";
export const Layout = (props) => {
    return (<Container fluid style={{ height: '100vh', padding: 0, margin: 0 }}>
        {props.children}
    </Container>
    )};

3. 优化右侧面板的滚动样式

为SplitPaneRight添加触摸滚动支持,确保移动端浏览器识别滚动行为:

<SplitPaneRight style={{ 
  overflowY: 'auto', 
  height: '100vh',
  WebkitOverflowScrolling: 'touch',
  touchAction: 'pan-y',
  flex: 1
}}>

4. 确保SplitPane父容器布局正确

检查自定义SplitPane组件的样式,确保采用flex布局并占满视口:

.split-pane-row {
  display: flex;
  height: 100vh;
  width: 100%;
}
.SplitPaneLeft {
  flex-shrink: 0; /* 左侧菜单保持固定宽度,不被压缩 */
}
.SplitPaneRight {
  flex: 1; /* 右侧面板占满剩余空间 */
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:17:08