最近移动端开发遇到一种布局,固定底部容器,里面有输入框,列表

使用fixed很好实现了上面的布局

<style>
    .history-warp {
        width: 100%;
        height: 300px;
        position: fixed;
        bottom: 0;
        background: #333;
    }

    .history-list {
        height: 200px;
        color: white;
        font-size: 20px;
        text-align: center;
        line-height: 200px;
    }

    .fixfixed.history-warp {
        bottom: -200px;
    }
</style>

<div class="history-warp">
    <ul class="aui-list aui-form-list">
        <li class="aui-list-item">
            <div class="aui-list-item-inner">
                <div class="aui-list-item-label-icon">
                    <i class="aui-iconfont aui-icon-mobile"></i>
                </div>
                <div class="aui-list-item-input">
                    <input type="text" placeholder="username">
                </div>
            </div>
        </li>
        <li class="aui-list-item">
            <div class="aui-list-item-inner">
                <div class="aui-list-item-label-icon">
                    <i class="aui-iconfont aui-icon-lock"></i>
                </div>
                <div class="aui-list-item-input">
                    <input type="password" placeholder="password">
                </div>
                <div class="aui-list-item-label-icon">
                    <i class="aui-iconfont aui-icon-display"></i>
                </div>
            </div>
        </li>
    </ul>
    <div class="history-list">
      这是一个可以滚动的列表
    </div>
</div>

那么问题来了,在android上,弹出键盘时候相当于resize了整个windows,结果整个窗口高度会变小,fixed布局会一直定位在底部,结果会变成这样

下面的黑色滚动列表也被弹上去了,这不是我们想要的,比较完美的实现应该是这样的

其实还是resize的问题,在弹出键盘的时候窗口变小了,而底部fixed的元素会向上移动,那么可以在弹出键盘时候改变fixed元素的bottom值为负数,让fiexd元素下移就可以了

安卓弹出键盘会触发resize,ios则不会

可以通过新增一个fixed class,通过脚本控制样式解决这个问题

.fixfixed.history-warp {
    bottom: -200px;
}
var $fixedEl = $(".history-warp");
// 实现ios和android同样效果
$(document).on('focus', 'input', function() {
    addClsIfNotExist($fixedEl, "fixfixed");
});
$(document).on('blur', 'input', function() {
    $fixedEl.removeClass('fixfixed');
});
var nowHeight = $(window).height();
// 针对安卓的
$(window).resize(function() {
    var h = $(this).height();
    if (nowHeight - h > 200) {
        // 键盘显示
        addClsIfNotExist($fixedEl, "fixfixed");
    } else {
        // 键盘隐藏
        $fixedEl.removeClass('fixfixed');
    }
})

function addClsIfNotExist($el, clsName) {
    if (!$el.hasClass(clsName)) {
        $el.addClass(clsName);
    }
}