评论

input adjust-position 键盘弹起 + 自定义导航 解决固定定位偏移top方案

input adjust-position 键盘弹起 + 自定义导航 解决flex;top;定位偏移方案

input adjust-position 键盘弹起 + 自定义导航 解决flex定位问题

关键词:adjust-position,键盘弹起 ;"navigationStyle": "custom";

解决方案:当键盘弹起时,通过已知值计算top偏移;
主要获取数值
键盘高度,窗口高度,获取焦点的输入框的top偏移(主要);


窗口高度 - 键盘高度 = 可视的高度
输入框Top偏移(主要是这个,在不同位置) - 可视的高度 + 输入框高度 = 相对窗口顶部(top)偏移


wxml 部分

<view  class="navigation-bar" style="{{keyboardHeight > 0?'top:'+OffsetTop +'px':''}}">
     <navigation-bar  /> <!--自定义导航-->
</view>

.navigation-bar{
position: fixed;
top:0;
left:0;
widt:100%;
}

<view>
<view style="height:600px"></view>
<!-- 非必需,看个人需要;cursor-spacing 指定光标与键盘的距离,取 input 距离底部的距离和 cursor-spacing 指定的距离的最小值作为光标与键盘的距离 -->
<!-- 必须 id  -->
<!-- 必须 bindfocus bindblur 指向同一个事件-->
<input cursor-spacing="20" id="input-phone" 
bindfocus="getTelIptHeight" bindblur="getTelIptHeight"  
type="text" value="{{phone}}" bindinput="phoneInput" 
placeholder="请输入手机号" placeholder-class="input-placeholder"
 />
</view>



js事件部分

const selectDom = (createSelectorQuery, select) => {
  return new Promise((resolve, reject) => {
    try {
      createSelectorQuery.select(select).boundingClientRect((e) => {
        resolve(e)
      }).exec();
    } catch (error) {
      console.log(error);
    }
  })
}

{
  data:{
      OffsetTop:0,
  },
  getTelIptHeight(e) {
      console.log("height---------", e);
      let keyboardHeight = e?.detail?.height || 0
      this.setData({
        keyboardHeight: keyboardHeight
      })
      // 自定义导航栏逻辑计算
      const windowHeight = wx.getSystemInfoSync().windowHeight; // 获取窗口高度
      const query = wx.createSelectorQuery();
     // selectDom 自己疯装的
      Promise.all([selectDom(query, '#' + e.currentTarget.id)]).then((rect) => {
        console.log(rect[0], windowHeight)
        const inputTop = rect[0]?.top; // 获取输入框的 top偏移
        const bottomOffs = windowHeight - keyboardHeight; // 可视窗口高度
       //输入框偏移位置 - 可视窗口高度 + 自身高度 = 相对窗口顶部(top)偏移
        const Offset = (inputTop - bottomOffs) + rect[0]?.height; 
      console.log('Offset', Offset)
      this.setData({
        OffsetTop: Offset
      })
    })
  }
}




最后一次编辑于  04-16  
点赞 3
收藏
评论
登录 后发表内容