微信小程序完美解决textarea的坑(textarea替换)

完美解决textarea的坑

先上效果图:
在这里插入图片描述

解决textarea组件穿透弹窗或遮罩层:

.wxss


.view_contain1{
  width: 96%;
  height: 200rpx;
  border: 3rpx solid #6699FF;
  margin: 0 2% 0 2%;
}

.areaInput{
  width: 100%;
  height: 150rpx;
  
}

.textarea-counter {
  font-size: 24rpx;
  color: #999;
  text-align: right;
  height: 40rpx;
  line-height: 40rpx;
  padding-top: 4rpx;
}

.wxml

<text>解决页面滚动时placeholder/输入内容不随textarea组件滚动,经多方尝试,出现这种情况是textarea的某个父级元素设置了overflow属性,去掉所有父级元素的overflow属性即可解决...解决textarea组件为原生组件层级最高,穿透弹窗或遮罩层。
  这步应该是最复杂的了,网上有很多方法但都不尽如人意。此处的解决思路是设置一个跟textarea布局一致的替代元素,与textarea交替展现。当点击替代元素时textarea展现,就可以输入内容,当textarea失去焦点时替代元素展现,将输入值赋给替代元素,这样不输入内容页面滚动时就不会出现textarea穿透问题。
  本坑注意要设置textarea自动聚焦(否则要点两次替代元素才能拉起键盘),且两个元素的切换要用wx:if,不能用显示和隐藏</text>



<!-- 关键性代码 -->
<view class='view_contain1' data-show="1" bindtap="ifshowArea">
	<textarea wx:if="{{textareaIsShow}}" class='areaInput' bindblur="ifshowArea" data-show="0" value="{{textareaValue}}" maxlength="200" placeholder="请输入" focus="true" bindinput="textareaInput"/>

	<view wx:if="{{!textareaIsShow}}" class='areaInput' style='color:{{textareaValue==""?"#999":"#2b2b2b"}}; white-space:pre-line;'  >{{textareaValue==""?"请输入":textareaValue}}</view>
  <view class="textarea-counter">{{textareaValue.length}}/200</view>
</view>




<text>解决页面滚动时placeholder/输入内容不随textarea组件滚动,经多方尝试,出现这种情况是textarea的某个父级元素设置了overflow属性,去掉所有父级元素的overflow属性即可解决...解决textarea组件为原生组件层级最高,穿透弹窗或遮罩层。
  这步应该是最复杂的了,网上有很多方法但都不尽如人意。此处的解决思路是设置一个跟textarea布局一致的替代元素,与textarea交替展现。当点击替代元素时textarea展现,就可以输入内容,当textarea失去焦点时替代元素展现,将输入值赋给替代元素,这样不输入内容页面滚动时就不会出现textarea穿透问题。
  本坑注意要设置textarea自动聚焦(否则要点两次替代元素才能拉起键盘),且两个元素的切换要用wx:if,不能用显示和隐藏</text>

.js

const app = getApp()

Page({
  data: {
    
    textareaIsShow: false,    
    textareaValue: ''
  },
  onLoad: function () {

  },

  /**
   * textarea失去焦点时候触发,按view触发
   * @param {} e 
   */
  ifshowArea(e) {
    console.log('显示:', e)    
    if (e.currentTarget.dataset.show==1) { //view按了后进入
      this.setData({        
        textareaIsShow: true
      });
      
    } else { //textarea是去焦点会进入
      
      this.setData({
        // textareaValue:e.detail.value,
        textareaIsShow: false,
      })
      
    }
  },

  textareaInput(e){
    this.setData({
      textareaValue:e.detail.value,
    })
  }

})

猜你喜欢

转载自blog.csdn.net/wy313622821/article/details/108051431
今日推荐