在开发H5活动界面的过程中,不可避免的要用到输入框,很多web前端开发人员一听到需求有输入框,就会想到一会评估工时的时候多评估点时间,因为输入框在移动端兼容会有一些问题。

我们这次先说一个问题:移动端键盘弹起,输入框被遮挡,用户看不到输入的内容。

解决方案:

方案1:

借助Element.scrollIntoView这个方法来解决,让当前元素滚动到浏览器的可视区域内。我们查看下兼容性:

image.png

上面查询的兼容性还是比较好的,结果实际测试下来,android和ios许多机型都是无效。

方案2:

度娘的方案不好使,那我们自己想想:

Element.scrollIntoView 给了我们思路,Element.scrollIntoView 无效,我们不用scrollIntoView,我们采用采用scrollTo方法。

步骤:

  1. 我们给有input的页面设置为滑动界面。
  2. 在input所在页面同级底部加一个div
  3. input onFocus 的时候,我们给底部div 填充高度,然后延迟去让页面滚动到底部。
  4. 失去焦点的时候,我们把底部div的高度设置为0

这种方案按照实现步骤,理论上应该适配性很好。

开始上代码: 我们直接在html上根节点增加class,区分mobile还是pc,以及androd还是ios

      function isMobile() {
            var flag = navigator.userAgent.match(
                /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
            );
            if (flag) {
                return true;
            }
            return false;
        };

        function isDeviceIos() {
            var ua = window.navigator.userAgent.toLowerCase();
            if (/iphone|ipad|ipod/.test(ua)) {
                return true;
            } else if (/android/.test(ua)) {
                // bridge = new AndroidBridge(this.initial.bind(this));
            }
            return false;
        }

        if (isMobile()) {
            document.body.classList.add("is-mobile");
            if (isDeviceIos()) {
                document.body.classList.add("is-ios");
            }
        } else {
            document.body.classList.add("is-pc");
        }
 

dom结构:


    handleOnFocus = () => {
        const isMob = isMobile();
        this.setState({
            placeholder: '',
        });
        if (isMob) {
            window.setTimeout(() => {
                const scroll = this.scrollRef.current;
                if (scroll) {
                    //自己封装组件到底部,其实是scrollTo方法
                    scroll.scrollToBottom();
                }
            }, 0);
        }
    };
    
    
    
 render() {
    
        return (
            <Scroll className="sc-content" ref={this.scrollRef}>
                    <Input onChange={this.setDes} ref={this.inputRef} placeholder={placeholder} className="cur-input" onFocus={this.handleOnFocus} maxLength="10" />
                    <div className="test-des">测试文本</div>
                    <div className="margin-bottom" />
            </Scroll>
        );
    }
 

css结合

.is-mobile {
    .cur-input:focus ~ .margin-bottom {
        height: 2.5rem;
    }
    &.is-ios {
        .cur-input:focus ~ .margin-bottom {
            height: 0;
        }
    }
}
 

这里会存在移动端键盘收回去,但是H5不知道,下面空白的情况,解决方案:移动端监听键盘KeyboardDown事件,发送通知给H5,H5收到事件主动触发input.blur()

    componentDidMount = () => {
        //监听移动端给的keyboardDown事件
        this.keyboardDownListener = addKeyboardDown(this.handleKeyboardDown)
    }
    
      handleKeyboardDown = () => {
        //主动移除焦点
        const inputRef = this.inputRef.current;
        if (inputRef) {
            inputRef.blur();
        }
    }
 

结语:

本文主要记录工作中遇到的一些问题和解决方案,大家有好的方案,评论区见!一赞一回,欢迎大家来支持。