小程序textarea完美填坑

本文分享了在微信小程序中解决Textarea组件常见问题的经验,包括placeholder错位、穿透弹窗、iOS输入法遮挡等难题,通过巧妙设置替代元素及调整样式实现完美适配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等。。。

反正综上所述我全遇到了,埋完一个坑又出一个新坑,在埋坑过程中数次想过放弃(就想跟老板说这是小程序的bug解决不了),但想想自己曾经夸下的海口(没有搞不定的,只有不想搞的),又默默地把手放在鼠标键盘上!

  先上一个完美填坑后的效果图:

  

填坑步骤1:

  解决页面滚动时placeholder/输入内容不随textarea组件滚动,经多方尝试,出现这种情况是textarea的某个父级元素设置了overflow属性,去掉所有父级元素的overflow属性即可解决

 填坑步骤2:
  解决textarea组件为原生组件层级最高,穿透弹窗或遮罩层。
  这步应该是最复杂的了,网上有很多方法但都不尽如人意。此处的解决思路是设置一个跟textarea布局一致的替代元素,与textarea交替展现。当点击替代元素时textarea展现,就可以输入内容,当textarea失去焦点时替代元素展现,将输入值赋给替代元素,这样不输入内容页面滚动时就不会出现textarea穿透问题。

  本坑注意要设置textarea自动聚焦(否则要点两次替代元素才能拉起键盘),且两个元素的切换要用wx:if,不能用显示和隐藏

  填坑步骤3:

   解决ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡问题
  第二步骤完成时在安卓机上已经能很完美的使用textarea了,可在坑b的ios上还是无一例外的出现了各种奇怪问题。输入法弹起输入到第三行时底部的结算栏上去了,输入内容直接跑结算栏里还穿透了!!!输入多行删除输入内容时内容直接被输入法弹窗遮挡了!!!奋战许久填的坑,在ios上全线溃败,这让我情何以堪!!(实在忍不住,说了这么多废话。。。)
  多方尝试给textarea的父级元素加个margin-bottom,并且这个值足够大在ios就不会出现这种问题,于是尝试在展现textarea加大textarea的父级元素加个margin-bottom,展现替代元素时再将这个值恢复原值,心心念念写好了代码以为解决了,现实又给了我一记响亮的大耳刮。原设有margin-bottom行,后改的不认、不认、不认呀!!加了个setTimeout发现加大textarea的父级元素加个margin-bottom后要将页面滚动到底部此时再弹出输入法就可以了。
     综上,步骤3就是要给textarea的父级元素加个margin-bottom,具体多少视情况而定(反正不够就一直加呗),在点击替代元素后先给textarea的父级元素加个margin-bottom,然后将页面滚动到底部,最后再展现textarea并拉起输入法键盘
主要代码:

<view class='bgcfff font28 padd30 new_borders1'style='{{areaHeight}}'>
  <textarea wx:if="{{!multiShow}}" class='areaInput' bindblur="ifshowArea" data-show="yes" value="{{u_remark}}"bindinput='inputchange'maxlength="100" data-type="u_remark"auto-height placeholder="订单备注(0/100)" focus="true" />
  <view wx:if="{{multiShow}}" style='min-height:20px;color:{{areatext=="订单备注(0/100)"?"#999":"#2b2b2b"}};' data-show="no" bindtap="ifshowArea">{{areatext}}</view>
</view>


data: {
  areatext:'订单备注(0/100)',
  areaHeight: 'margin-bottom: 90rpx;',
  multiShow:true,
  u_remark:""
},
ifshowArea(e){
  var t_show = e.currentTarget.dataset.show=="yes"?true:false;
  if (t_show){//不显示textarea
    this.setData({
      areatext: this.data.u_remark ? this.data.u_remark:"订单备注(0/100)",
      areaHeight: 'margin-bottom: 90rpx;'
    });
    this.setData({ multiShow: t_show })
  } else {//显示textarea
    this.setData({
      areaHeight:' margin-bottom: 250rpx;'
    });
    wx.createSelectorQuery().select('.j_page').boundingClientRect((rect)=> {
      console.log(rect)
      // 使页面滚动到底部
      wx.pageScrollTo({
        scrollTop: rect.bottom
      })
      this.setData({
        multiShow: t_show
      })
    }).exec()
  }
}

### 小程序 `textarea` 组件概述 在微信小程序开发中,`textarea` 是一个多行文本输入框组件,适用于用户需要输入大量文字的场景。此组件支持多种属性配置来满足不同的需求[^1]。 #### 属性说明 - **auto-focus**: 设置为 true 可使该控件初始状态下获得焦点- **cursor-spacing**: 当键盘弹起时,底部与键盘的距离,默认为 0。 - **disabled**: 是否禁用输入框。 - **maxlength**: 最大输入长度,设置为 -1 的时候不限制最大长度。 - **placeholder**: 输入框为空时占位符内容。 - **placeholder-style**: 定义 placeholder 的样式。 - **placeholder-class**: 自定义 placeholder 类名。 - **show-confirm-bar**: 默认情况下,在 iOS 上点击完成按钮会触发软键盘收起动画;设为 false 则不会显示确认栏。 - **selection-start**, **selection-end**: 光标的起始位置和结束位置。 - **adjust-position**: 键盘弹起时,是否自动上推页面。 #### 基本使用案例 下面是一个简单的例子展示如何创建并初始化一个带有默认样式的 `textarea`: ```html <view> <!-- 多行文本域 --> <textarea value="{{content}}" bindinput="onInput" maxlength="-1" placeholder="在这里写下您的想法..." /> </view> ``` ```javascript Page({ data: { content: '' }, onInput(e){ this.setData({content:e.detail.value}); } }) ``` #### 解决常见问题 对于提到的新入项自动聚焦失败的问题,这可能是由于版本差异造成的 bug。建议更新至最新版的小程序基础库以修复此类已知缺陷。 当遇到 `textarea` 的 `blur` 事件延迟于其他交互操作的情况时,推荐通过监听整个表单提交的方式来代替单独依赖按钮点击获取数据[^2]。 另外需要注意的是,不应当尝试实时修改多行文本的内容,因为这样做可能会引起用户体验不佳以及难以预料的行为变化。因此,任何对用户输入内容的操作都应谨慎考虑其必要性和实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值