在非移动友好页面上创建移动友好小部件

Creating a mobile-friendly widget on a non-mobile-friendly page

本文关键字:移动 创建 小部      更新时间:2023-09-26

快速背景:

我正在尝试制作一个移动友好的小工具。我的客户有非移动友好页面,这种情况不太可能很快改变。

尝试的解决方案:

我想这不会那么糟糕。只需使用position:fixed从页面流中删除小部件,插入视口元标记,然后按。。。正确的看看这个小提琴。

问题:

尝试的解决方案在某些移动设备上中断。当使用同事的手机时,他们能够从所谓的position:fixed元素中滚动!(有问题的手机是安卓4或5,所以它不是2.1-2.3错误。)我很确定iPhone上也会出现同样的行为。

从本质上讲,它的行为似乎就像是页面左上角的position:absolute

尝试的解决方案详细信息:

我首先用javascript:附加视口元标记

$('head').append('<meta name="viewport" content="width=device-width,initial-scale=1"/>');

让我们假设一个非常基本的HTML模板:

<html>
    ...
    <div class="overlay">
        <div class="modal">
            <div class="content">...</div>
        </div>
    </div>
    ...
</html>

以及以下CSS:

.hide-overflow {
    overflow: hidden;
}
.overlay {
    position: fixed;
    -webkit-backface-visibility:hidden; /* Not that this does anything */
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    display: table;
    overflow: hidden;
    z-index: 1000;
}
.modal {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    display: table-cell;
    text-align: center;
    vertical-align: middle;
}
.content {
    display: inline-block;
    width: 800px;
    height: 500px;
}
@media (max-width: 800px) {
    .overlay * {
        max-width: 100%;
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
    }
    .content {
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
    }
}

当然,我认为这还不够。我还添加了以下javascript,以防止在<body>和最外层的<div>元素上滚动:

// This only shows up when the widget is activated--it's removed on deactivation.
$('body').addClass('hide-overflow');// Just adds overflow:hidden, in case you forgot ;)
$('body > div').addClass('hide-overflow');

在我手机的(GalaxyTabletNote)默认浏览器上,这非常有效!没有问题!如前所述,在iPhone、有问题的Android设备等上,您可以滚动离开position:fixed元素,就好像它实际上是position: absolute一样。如何让position:fixed工作?

解决方案比我想象的要简单一些。使用javascript,我已经将hide-overflow类附加到了body和第一个div元素。那个班级看起来是这样的:

.hide-overflow {
    overflow: hidden;
}

解决我问题的是将其更改为以下内容:

.hide-overflow {
    overflow: hidden;
    width: 100% !important;
    height: 100% !important;
    -webkit-box-sizing: border-box !important;
    -moz-box-sizing: border-box !important;
    box-sizing: border-box !important;
}

就是这样!只需在小部件显示时将此类添加到<body>标记中,并在小部件隐藏时将其删除即可。

这是正在工作的小提琴。