JQueryを使って、私は体のスクロールを無効にしたいです。
私の考えは:
body{ overflow: hidden;}
を設定scrollTop();/scrollLeft()
をキャプチャするもっと良い方法はありますか?
更新:
私の例とその理由を http://jsbin.com/ikuma4/2/edit でご覧ください。
私は誰かが「なぜ彼はパネルにposition: fixed
を使わないのですか?」と考えるようになるでしょう。
私は他の理由があるのでこれを提案しないでください。
私がこれを行うことを発見した唯一の方法はあなたが説明したものと似ています:
それから再びスクロールを許可する準備ができたら、それを元に戻します。
編集:私はそれを掘り下げるためにトラブルに行って以来私はあなたにコードを与えることができない理由はありません...
// lock scroll position, but retain settings for later
var scrollPosition = [
self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
];
var html = jQuery('html'); // it would make more sense to apply this to body, but IE7 won't have that
html.data('scroll-position', scrollPosition);
html.data('previous-overflow', html.css('overflow'));
html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);
// un-lock scroll position
var html = jQuery('html');
var scrollPosition = html.data('scroll-position');
html.css('overflow', html.data('previous-overflow'));
window.scrollTo(scrollPosition[0], scrollPosition[1])
これは完全にスクロールを無効にします。
$('html, body').css({
overflow: 'hidden',
height: '100%'
});
復元するには:
$('html, body').css({
overflow: 'auto',
height: 'auto'
});
FirefoxとChromeでテストしました。
これを試して
$('#element').on('scroll touchmove mousewheel', function(e){
e.preventDefault();
e.stopPropagation();
return false;
})
あなたはこのコードを使うことができます:
$("body").css("overflow", "hidden");
私は tfe によってソリューションを少しだけ調整します。特に、ページコンテンツの移動がないことを確認するための追加の制御を追加しました(別名ページ移動)スクロールバーがhidden
に設定されている場合。
2つのJavascript関数lockScroll()
およびunlockScroll()
をそれぞれ定義して、ページスクロールをロックおよびロック解除することができます。
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});
}
<body>
には最初の余白がないと仮定しました。
上記の解決策はほとんどの実用的なケースでうまくいきますが、例えばposition:fixed
の付いたヘッダを含むページのためにはそれ以上のカスタマイズが必要なので決定的ではありません。例を使ってこの特別なケースに入りましょう。持っているとします
<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>
と
#header{position:fixed; padding:0; margin:0; width:100%}
それから、関数lockScroll()
とunlockScroll()
に以下を追加するべきです:
function lockScroll(){
//Omissis
$('#header').css('margin-right', marginR);
}
function unlockScroll(){
//Omissis
$('#header').css('margin-right', 0);
}
最後に、マージンまたはパディングのためのいくつかの可能な初期値に注意してください。
スクロールをオフにするには、これを試してください。
var current = $(window).scrollTop();
$(window).scroll(function() {
$(window).scrollTop(current);
});
リセットする:
$(window).off('scroll');
イベントをスクロールしてそのデフォルトの振る舞いを防ぐために関数を添付することができます。
var $window = $(window);
$window.on("mousewheel DOMMouseScroll", onMouseWheel);
function onMouseWheel(e) {
e.preventDefault();
}
これを処理するjQueryプラグインを書きました。$。disablescroll。
マウスホイール、タッチ移動、キープレスなどのイベントからのスクロールを防止します。 Page Down。
デモはこちらがあります。
使用法:
$(window).disablescroll();
// To re-enable scrolling:
$(window).disablescroll("undo");
マウスの中央ボタンを含むスクロールを無効にするための1つのライナー。
$(document).scroll(function () { $(document).scrollTop(0); });
編集:とにかくjQueryは必要ありません。VanillaJSの上記と同じです(つまり、フレームワークがないこと、JavaScriptだけが必要です)。
document.addEventListener('scroll', function () { this.documentElement.scrollTop = 0; this.body.scrollTop = 0; })
this.documentElement.scrollTop - 標準
this.body.scrollTop - IE互換性
身長を100%に設定してオーバーフローを非表示にすることはできませんか。 http://jsbin.com/ikuma4/13/edit を参照してください。
私はここに役立つかもしれない答えを入れました: jQuery simplemodalスクロールを無効にします
テキストを移動せずにスクロールバーをオフにする方法を示します。あなたはsimplemodalに関する部分を無視することができます。
これはあなたの目的にはうまくいくかもしれないし、うまくいかないかもしれませんが、スクロールする前に jScrollPane を拡張して他の機能を起動することができます。私はほんの少しだけこれをテストしましたが、私はあなたが飛び込んでスクロールを完全に防ぐことができることを確認することができます。私がしたのは、
<script type="text/javascript" src="script/jquery.jscrollpane.js"></script>
positionDragY(destY, animate)
関数の最初の行です)Events.htmlを起動すると、コーディングのためにスクロールしない通常のスクロールボックスが表示されます。
この方法でブラウザのスクロールバー全体を制御できます(fullpage_scroll.htmlを参照)。
ですから、おそらく次のステップは他の機能への呼び出しを追加することです。それはあなたの固定の魔法をかけ、そしてスクロールを続けるかどうかを決定します。また、scrollTopとscrollLeftを設定するためのAPI呼び出しもあります。
あなたがより多くの援助を望むならば、あなたが起きるところに投稿してください!
これが役に立ったことを願っています。
$("body").css("overflow", "hidden");
$("body").css("overflow", "initial");
誰かがこのコードを投稿しましたが、復元したときにスクロール位置を保持しないという問題があります。その理由は、人々はそれをhtmlとbodyあるいは単なるbodyに適用する傾向があるからです。このようにして復元されたときのスクロール位置は保持されます。
$('html').css({
'overflow': 'hidden',
'height': '100%'
});
復元するには:
$('html').css({
'overflow': 'auto',
'height': 'auto'
});
このコードを試してください:
$(function() {
// ...
var $body = $(document);
$body.bind('scroll', function() {
if ($body.scrollLeft() !== 0) {
$body.scrollLeft(0);
}
});
// ...
});
キーボードナビゲーションでスクロールを無効にしたいだけなら、keydownイベントをオーバーライドすることができます。
$(document).on('keydown', function(e){
e.preventDefault();
e.stopPropagation();
});
DOMを使ってそうすることもできます。あなたがこのように呼ぶ関数があるとしましょう:
function disable_scroll() {
document.body.style.overflow="hidden";
}
そしてそれだけです。これが他のすべての答えに加えて役立つことを願っています!
これは私がやってしまったものです:
CoffeeScript:
$("input").focus ->
$("html, body").css "overflow-y","hidden"
$(document).on "scroll.stopped touchmove.stopped mousewheel.stopped", (event) ->
event.preventDefault()
$("input").blur ->
$("html, body").css "overflow-y","auto"
$(document).off "scroll.stopped touchmove.stopped mousewheel.stopped"
Javascript:
$("input").focus(function() {
$("html, body").css("overflow-y", "hidden");
$(document).on("scroll.stopped touchmove.stopped mousewheel.stopped", function(event) {
return event.preventDefault();
});
});
$("input").blur(function() {
$("html, body").css("overflow-y", "auto");
$(document).off("scroll.stopped touchmove.stopped mousewheel.stopped");
});
誰かが私の解決策を試したかどうかわからない。これはbody/html全体に作用しますが、スクロールイベントを発生させる要素には適用できることは間違いありません。
必要に応じてscrollLockを設定および設定解除するだけです。
var scrollLock = false;
var scrollMem = {left: 0, top: 0};
$(window).scroll(function(){
if (scrollLock) {
window.scrollTo(scrollMem.left, scrollMem.top);
} else {
scrollMem = {
left: self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
top: self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
};
}
});
これがその例です JSFiddle
これが誰かに役立つことを願っています。
あなたはページ上のコンテンツのスクロールを防ぐためにスクロール可能なdivでウィンドウを隠すことができます。そして、非表示にして表示することで、あなたはあなたのスクロールをロック/ロック解除することができます。
このようなことをしなさい:
#scrollLock {
width: 100%;
height: 100%;
position: fixed;
overflow: scroll;
opacity: 0;
display:none
}
#scrollLock > div {
height: 99999px;
}
function scrollLock(){
$('#scrollLock').scrollTop('10000').show();
}
function scrollUnlock(){
$('#scrollLock').hide();
}
私は最善かつクリーンな解決策だと思います:
window.addEventListener('scroll',() => {
var x = window.scrollX;
var y = window.scrollY;
window.scrollTo(x,y);
});
そしてjQueryで:
$(window).on('scroll',() => {
var x = window.scrollX;
var y = window.scrollY;
window.scrollTo(x,y)
})
これらのイベントリスナーはスクロールをブロックします。スクロールを有効にするためにそれらを削除するだけです。
(margin:0 auto;
を使って)レイアウトを中央揃えにしている人のために、これはposition:fixed
の解決策と@ tfeの提案された解決策のマッシュアップです。
スクロールバーが表示/非表示になっているためにページスナップが発生している場合は、このソリューションを使用してください。
// lock scroll position, but retain settings for later
var scrollPosition = [
window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
];
var $html = $('html'); // bow to the demon known as MSIE(v7)
$html.addClass('modal-noscroll');
$html.data('scroll-position', scrollPosition);
$html.data('margin-top', $html.css('margin-top'));
$html.css('margin-top', -1 * scrollPosition[1]);
…と組み合わせ…
// un-lock scroll position
var $html = $('html').removeClass('modal-noscroll');
var scrollPosition = $html.data('scroll-position');
var marginTop = $html.data('margin-top');
$html.css('margin-top', marginTop);
window.scrollTo(scrollPosition[0], scrollPosition[1])
…そして最後に、.modal-noscroll
のためのCSS…
.modal-noscroll
{
position: fixed;
overflow-y: scroll;
width: 100%;
}
私はこれが他のどの解決策よりも正しい修正であると言うことを試みるつもりですが、私はそれをまだテストしていませんまだ… :P
編集:私はこれがタッチデバイス上でどのくらいひどく実行されるかもしれない(読む:爆破する)手がかりを持っていないことに注意してください。