移动端 textarea 内容被截断或无法滚动的根本原因是 layui 的 .layui-textarea 容器默认设置 overflow: hidden 或固定高度且未适配 touch 滚动,ios safari 尤其敏感;需显式设置 -webkit-overflow-scrolling: touch、overflow-y: auto,并避免父级 overflow: hidden 和 white-space: nowrap。

移动端 textarea 内容被截断或无法滚动
根本原因是 Layui 的 textarea 默认套在 .layui-textarea 容器里,该容器设置了 overflow: hidden 或固定高度,且未适配 touch 设备的滚动行为。iOS Safari 尤其敏感——内容撑开后不触发滚动,反而被裁剪。
- 检查是否用了
layedit替代原生textarea:Layui 的富文本编辑器(layedit)在移动端默认禁用滚动、缩放受限,不是纯文本域;若只需输入长文本,应直接用原生textarea+ 自定义样式 - 显式设置
textarea的min-height和max-height,避免父容器(如.layui-form-item)用height或line-height压缩空间 - 必须加 CSS:
.layui-textarea textarea { -webkit-overflow-scrolling: touch; overflow-y: auto; },否则 iOS 拖不动 - 禁止给
textarea父级设overflow: hidden或white-space: nowrap,这两者会直接吞掉滚动能力
文字输入后看不见光标或内容被遮挡
常见于弹窗(layer.open)内嵌 textarea 场景:弹窗自身有 overflow: auto,而 textarea 又被包裹进另一个带 overflow: hidden 的容器(如 .layui-layer-content),导致焦点区域不可见。
- 临时解法:在弹窗
success回调中执行$('textarea').focus(),并加setTimeout(() => $('textarea').scrollIntoView({ behavior: 'smooth' }), 100)强制滚动到可视区 - 根治方式:覆盖弹窗内容区域的溢出限制,例如加自定义 skin:
skin: 'layer-mobile-textarea',再写 CSS:.layer-mobile-textarea .layui-layer-content { overflow: visible !important; } - 若用了
laydate或layselect同页共存,注意它们的z-index可能压住textarea光标,需手动提高textarea父级的z-index
软键盘弹起后 textarea 被顶出视口
Android 和 iOS 在软键盘展开时对 viewport 计算不同:iOS 会缩小 viewport 高度但不触发 resize 事件,Android 则常把 textarea 推到键盘上方失败,导致输入框不可见。
- 不要依赖
window.innerHeight动态调高textarea,它在键盘弹起时返回值不稳定 - 改用
focus事件 +scrollIntoView组合:textarea.addEventListener('focus', () => { setTimeout(() => el.scrollIntoView({ block: 'nearest', inline: 'start' }), 200); }) - 在
meta标签中补一句:<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover">,尤其 iOS 需要viewport-fit=cover防刘海屏遮挡 - 避免给
textarea外层加position: fixed—— 键盘弹起时 fixed 元素会脱离文档流,位置彻底失控
换行符 \n 不渲染、显示为方块或挤成一行
这不是移动端特有,但小屏下更明显:Layui 表单渲染时若用 templet 或 JS 拼接 textarea 值,\n 会被当普通字符忽略;若从接口取值后直接赋给 value,浏览器也不解析换行。
- 服务端返回的字段含
\n,前端填入前必须转义:textarea.value = data.content.replace(/\n/g, '\n')(注意是字符串'\n',不是正则) - 若内容来自富文本,且含 HTML 标签,别用
innerHTML直接塞进textarea——textarea只接受纯文本,HTML 会被当字面量显示;应先用DOMPurify.sanitize()提取文本再替换换行 - CSS 上加
white-space: pre-wrap; word-break: break-word;,确保换行保留且长单词可折行 - 别用
layui.util.escape()包裹后再填值——它会把\n变成,浏览器不识别为换行
textarea 的表现是 viewport 设置、父容器 overflow、软键盘策略、CSS white-space 和 JS 赋值时机五者叠加的结果,动其中一环,其他可能连锁异常。











