Tôi chỉ cung cấp một chút điều chỉnh cho giải pháp bằng tfe . Cụ thể, tôi đã thêm một số điều khiển bổ sung để đảm bảo rằng không có sự dịch chuyển nội dung trang (còn gọi là dịch chuyển trang ) khi thanh cuộn được đặt thành hidden
.
Hai chức năng Javascript lockScroll()
và unlockScroll()
có thể được xác định tương ứng để khóa và mở khóa cuộn trang.
function lockScroll(){
$html = $('html');
$body = $('body');
var initWidth = $body.outerWidth();
var initHeight = $body.outerHeight();
var scrollPosition = [
self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
];
$html.data('scroll-position', scrollPosition);
$html.data('previous-overflow', $html.css('overflow'));
$html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);
var marginR = $body.outerWidth()-initWidth;
var marginB = $body.outerHeight()-initHeight;
$body.css({'margin-right': marginR,'margin-bottom': marginB});
}
function unlockScroll(){
$html = $('html');
$body = $('body');
$html.css('overflow', $html.data('previous-overflow'));
var scrollPosition = $html.data('scroll-position');
window.scrollTo(scrollPosition[0], scrollPosition[1]);
$body.css({'margin-right': 0, 'margin-bottom': 0});
}
nơi tôi giả định rằng <body>
không có ký quỹ ban đầu.
Lưu ý rằng, mặc dù giải pháp trên hoạt động trong hầu hết các trường hợp thực tế, nhưng nó không dứt khoát vì nó cần một số tùy chỉnh thêm cho các trang bao gồm, ví dụ, một tiêu đề với position:fixed
. Hãy đi vào trường hợp đặc biệt này với một ví dụ. Giả sử có
<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>
với
#header{position:fixed; padding:0; margin:0; width:100%}
Sau đó, người ta nên thêm các chức năng sau lockScroll()
và unlockScroll()
:
function lockScroll(){
//Omissis
$('#header').css('margin-right', marginR);
}
function unlockScroll(){
//Omissis
$('#header').css('margin-right', 0);
}
Cuối cùng, hãy quan tâm đến một số giá trị ban đầu có thể cho lề hoặc phần đệm.