事实证明这是一个webkit bug &我们可以做的并不多。
但是我确实发现了一个可以接受的工作。 我最终保持弹出作为一个普通的文档流div没有绝对或固定的位置,而在布局和弹出之间跳转的方式,用户获得相同的感觉,就好像他是在一个弹出窗口内,下面是一步一步说明我是什么做:
- 当弹出被触发时,保存布局
jQuery('body').scrollTop()
的当前滚动位置。
- 动画整个页面出来
opacity: 0
(整个布局在一个div中,弹出窗口在它之外)。
- 将隐藏溢出的布局高度设置为0。
- 在弹出窗口中设置动画(弹出窗口的位置是静态的或相对的)
- 在显示弹出窗口之前,我们必须跳到页面顶部。
- 现在当关闭弹出窗口时做相反的事情。
- 动画出来弹出
- 组布局的高度来自动
- 滚动布局回到我们前面保存先前的位置。
- 现在我们可以将布局动画返回到
opacity: 1
。
这种一步一步的过渡将让用户感觉它是一个弹出式窗口,但我们只是隐藏布局并显示另一个类似于弹出窗口的div。
这样做意味着我们的弹出不再位置固定&该错误不会触发。
演示:JSBIN & Editor
下面是代码:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<script src="https://code.jquery.com/jquery-3.0.0.js"></script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div class="wrapper">
<section>
<h1>A</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<a href="#" class="js-popup-open">Click me.</a>
</section>
<section>
<h1>B</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<a href="#" class="js-popup-open">Click me.</a>
</section>
<section>
<h1>C</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<a href="#" class="js-popup-open">Click me.</a>
</section>
<section>
<h1>D</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Et ea officiis ipsam sunt, nam quam sint omnis, quisquam cum. Dignissimos pariatur porro quis sunt optio laborum, sint vero fugit unde?</p>
<a href="#" class="js-popup-open">Click me.</a>
</section>
</div>
<div class="popup-wrap"></div>
<div class="popup">
<a href="#" class="js-popup-close">Close</a>
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</div>
</body>
</html>
CSS:
body{
background: #000;
padding: 0;
margin: 0;
}
.wrapper{
background: #fff;
margin: 0;
padding: 20px;
}
.popup {
position: relative;
top: -5%;
opacity: 0;
left: 5%;
width: 90%;
max-height: 90%;
background: #fff;
overflow: auto;
display: none;
-webkit-transition: all 0.35s ease-in-out;
-moz-transition: all 0.35s ease-in-out;
-o-transition: all 0.35s ease-in-out;
-ms-transition: all 0.35s ease-in-out;
transition: all 0.35s ease-in-out;
}
input {
width: 90%;
margin-left: 5%;
display: block;
margin-bottom: 20px;
margin-top: 20px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.popup-wrap{
position: absolute;
background: rgba(0,0,0,0.75);
top: 0;
left: 0;
}
.popup-on body {
oveflow: hidden;
}
.popup-on .popup{
display: block;
}
.popup-on .wrapper{
overflow: hidden;
}
.popup-animate .popup{
top: 5%;
opacity: 1;
}
JS:
$(document).ready(function(){
var currentScrollPosition = 0;
// Open Popup
$('.js-popup-open').click(function(e){
e.preventDefault();
// Save current popup location.
currentScrollPosition = jQuery('body').scrollTop();
// Fadeout layout
$('.wrapper').animate({
opacity: 0
}, 350, function() {
// Hide layout
$('.wrapper').css('height', 0);
// Show Popup
$('body').addClass('popup-on');
// Scroll layout to top so popup is not shown half way through.
jQuery('html, body').animate({
scrollTop: 0
}, 0);
// Animate Popup
setTimeout(function(){
$('body').addClass('popup-animate');
}, 10); /* this set timeout let transition be applied even when display property was changed from display none to blcok */
});
});
// Close Poup
$('.js-popup-close').click(function(e){
e.preventDefault();
// Animate out the poup
$('body').removeClass('popup-animate');
// Wait while popup is animting to fade.
setTimeout(function(){
// Hide the popup
$('body').removeClass('popup-on');
// scroll to previous position.
jQuery('html, body').animate({
scrollTop: currentScrollPosition
}, 0);
// Layout back to normal height.
$('.wrapper').css('height', 'auto');
setTimeout(function(){
$('.wrapper').animate({
opacity: 1
}, 350);
}, 10);
}, 360);
});
});
试了它...没有工作 - https://jsbin.com/yowiqivowi –
嗯,这确实为我解决了它。经过iPhone 5,OS 9.3.3 - 9.0 Mobile/13G34 Safari/601.1测试。你有哪个操作系统? –
我没有设备,但错误肯定来自浏览器检查[this](https://bugs.webkit.org/show_bug.cgi?id=158276),感谢您的努力,但我相信它无法解决,但我确实使用了我在这里发布的工作。 –