移动端支持
Ydesign 支持移动端和触屏设备吗?
✅ 支持。在移动端浏览器上,Ydesign 编辑器会自动切换布局:顶部工具栏折叠、侧边面板改为底部抽屉、手势操作优先。用户可以在手机 / 平板上直接做设计。

📱 适用范围:Ydesign 针对浏览器环境设计。原生移动 App 请使用 WebView 承载,而不是打包成原生应用。
自动判断:768px 断点
Ydesign 内部默认以 768px 作为移动端 / 桌面端的分界:
// packages/react-editor/src/utils/screen.ts
export const MOBILE_BREAKPOINT = 768;
export const isMobile = () => window.innerWidth <= MOBILE_BREAKPOINT;
export const isTouchDevice = () =>
'ontouchstart' in window || navigator.maxTouchPoints > 0;
所有内置组件(<SidePanel />、<Toolbar />、<ZoomButtons /> 等)都会监听窗口尺寸,自动切换桌面 / 移动模式。你通常什么都不用做。
在大屏上强制移动模式
有些场景你会希望在大屏幕里也展示紧凑版(比如把编辑器塞在一个狭窄的侧边栏里)。给任何祖先元素加上 polotno-mobile 类,Ydesign 内所有组件都会进入移动模式:
<body class="polotno-mobile">
<div id="root"></div>
</body>
或者条件切换:
<div className={compact ? 'polotno-mobile' : ''}>
<DesignEditorApp store={store} />
</div>
这个类名后续会逐步迁移为 ydesign-mobile,届时会通过别名保持向后兼容。
在自定义组件里同步移动 / 桌面态
如果你写了自己的 Section / 工具栏,也希望能跟随内置切换,Ydesign 提供两个工具:
useMobile() Hook(推荐)
响应式地拿到当前是否为移动端,组件会随 resize 自动重渲染:
import { useMobile } from '@ydesign/react-editor/utils/screen';
function MySection() {
const mobile = useMobile();
return (
<div style={{ padding: mobile ? 8 : 24, fontSize: mobile ? 13 : 15 }}>
{mobile ? '移动版布局' : '桌面版布局'}
</div>
);
}
mobileStyle(...)(styled-components 模板字符串)
在 styled-components 里生成"媒体查询 + .polotno-mobile 双触发"样式片段:
import styled from 'styled-components';
import { mobileStyle } from '@ydesign/react-editor/utils/screen';
const Panel = styled.div`
padding: 24px;
font-size: 15px;
${mobileStyle(`
padding: 8px;
font-size: 13px;
`)}
`;
这样即便用户给 <body> 加了 polotno-mobile 类,你的自定义组件也会跟着切到紧凑样式,体验一致。
触屏手势
Ydesign 在移动端启用了画布专用的触摸手势:
| 手势 | 行为 |
|---|---|
| 单指拖动 | 移动选中元素 |
| 双指捏合 | 缩放画布 |
| 双指平移 | 平移画布视口 |
| 双击图片 | 进入裁剪模式(与桌面一致) |
| 长按元素 | 唤出(规划中的)上下文菜单 |
如果你想自己扩展更多手势,直接在 <Workspace /> 的父容器上加 onTouchStart / onTouchMove 监听即可,Ydesign 不会拦截冒泡。
常见问题
Q:我想让桌面浏览器里的编辑器永远"小屏版"。
A:把编辑器容器宽度限制在 768px 以内即可;或者给父节点加 polotno-mobile 类强制开启。
Q:某些按钮在移动端被折叠了,能不能手动强制显示? A:内置 Toolbar 会根据空间自动折叠;想全量展示请参考 Toolbar 重写整条工具栏。
Q:微信 / 手机浏览器下双指缩放会触发整个页面放大?
A:给页面 <meta viewport> 加上 user-scalable=no, maximum-scale=1:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
这样双指手势只会作用于画布内部。
延伸阅读
- 👉 主题与 UI 样式 —— 暗色 / 浅色、品牌色覆盖
- 👉 Workspace 画布工作区 —— 触屏相关的画布配置
- 👉 工具函数 · screen ——
useMobile/mobileStyle完整 API