Sadece kaydırma devre dışı değil gizlemek değil mi?


200

Bir ışık kutusu kullanırken üst html / body kaydırma çubuğunu devre dışı bırakmaya çalışıyorum. Buradaki ana kelime devre dışıdır . Ben do not ile gizlemek istiyorum overflow: hidden;.

Bunun nedeni overflow: hidden, sitenin zıplamasını ve kaydırmanın yapıldığı alanı kaplamasıdır.

Hala bir kaydırma çubuğunu gösterirken devre dışı bırakmanın mümkün olup olmadığını bilmek istiyorum.


1
Herhangi bir kaydırma mümkün müdür? (
Işık kutusunda

site kaydırma var ama sadece ışık kutusu açıkken devre dışı bırakmak istiyorum. i sadece bir kaydırma çubuğunu gösterirken devre dışı bırakmak mümkün olup olmadığını bilmek istiyorum. bir ışık kutusunda veya başka bir şeyde nasıl yapılacağı gibi başka hiçbir şeye ihtiyaç yoktur.
Dejan.S

kaydırma çubuğu ile lightbox kullanmanın sorunu nedir?
manny

1
@Dejan Çünkü tüm kaydırmayı nasıl devre dışı bırakacağımı biliyorum - bu ana kaydırma çubuğunu değil, aynı zamanda ışık kutusundaki ...
Šime Vidas

1
Lütfen cevabı bu gönderiye tekrar düzenlemeyin. Aşağıdaki cevap bölümü cevaplar içindir. Eğer senin soruya bir cevap varsa farklı aşağıda bir cevap dışında, cevap seçiminde kendi çözümünüzü ekleyebilir.
intcreator

Yanıtlar:


174

Üst katmanın altındaki sayfa üstte "sabitlenebilir" ise, kaplamayı açtığınızda

body { position: fixed; overflow-y:scroll }

yine de sağ kaydırma çubuğunu görmelisiniz, ancak içerik kaydırılamaz. Yer paylaşımını kapattığınızda, bu özellikleri

body { position: static; overflow-y:auto }

Sadece bu şekilde teklif ettim çünkü herhangi bir kaydırma etkinliğini değiştirmeniz gerekmiyordu

Güncelleme

Ayrıca küçük bir iyileştirme de yapabilirsiniz: document.documentElement.scrollTopözelliği, katman açılmadan hemen önce javascript aracılığıyla alırsanız, bu değeri topgövde öğesinin özelliği olarak dinamik olarak atayabilirsiniz : bu yaklaşımla sayfa, üstte veya daha önce kaydırdıysanız.

css

.noscroll { position: fixed; overflow-y:scroll }

JS

$('body').css('top', -(document.documentElement.scrollTop) + 'px')
         .addClass('noscroll');

2
düzenimle uğraşır, ancak bazı değişikliklerle işe yarayabilir. i like this i will try it out more
Dejan.S

4
küçük bir değişiklikle bu çalışır. bir genişlik ekledim:% 100; im gitti Çözüm ile sorumu güncelleyin ama genişliği ile% 100 değiştirebilirsiniz ;? öneri için teşekkürler
Dejan.S

3
Neden bilmiyorum, ama bu benim için daha iyi çalışıyor: $('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
PDXIII

4
@whitesiroi, haklısın. Kemanı güncelledim: jsfiddle.net/evpozdniakov/2m8km9wg Teşekkür ederiz!
evpozdniakov

1
Bir çözümün yorumlarını okuyanlar için son keman, her iki durumda da kaydırma çubuğu konumunu korurken kaydırma çubuğunu devre dışı bırakmak ve yeniden etkinleştirmek için bir çözüm sağlar. Teşekkürler!
user1063287

80

Seçilen çözüme dört küçük ekleme:

  1. IE'de çift kaydırma çubuklarını önlemek için gövde yerine html'ye 'noscroll' uygulayın
  2. 'Noscroll' sınıfını eklemeden önce gerçekten bir kaydırma çubuğunun olup olmadığını kontrol etmek için . Aksi takdirde, site yeni kaydırılmayan kaydırma çubuğu tarafından atlanır.
  3. Mümkün olan scrollTop'u tutmak için sayfanın tamamı tekrar yukarı çıkmaz (Fabrizio'nun güncellemesi gibi, ancak 'noscroll' sınıfını eklemeden önce değeri almanız gerekir)
  4. Tüm tarayıcılar scrollTop'u http://help.dottoro.com/ljnvjiow.php adresinde belirtilen şekilde işlemez.

Çoğu tarayıcıda işe yarayan eksiksiz bir çözüm:

CSS

html.noscroll {
    position: fixed; 
    overflow-y: scroll;
    width: 100%;
}

Kaydırmayı devre dışı bırak

if ($(document).height() > $(window).height()) {
     var scrollTop = ($('html').scrollTop()) ? $('html').scrollTop() : $('body').scrollTop(); // Works for Chrome, Firefox, IE...
     $('html').addClass('noscroll').css('top',-scrollTop);         
}

Kaydı etkinleştir

var scrollTop = parseInt($('html').css('top'));
$('html').removeClass('noscroll');
$('html,body').scrollTop(-scrollTop);

Beni doğru yola koydukları için Fabrizio ve Dejan'a ve çift kaydırma çubuğuna çözüm için Brodingo'ya teşekkürler


1
Bu, masaüstünde iyi test edildi, ancak iPhone'da, okuyucu sayfayı kaydırmaya çalışana kadar boş bir beyaz ekran oluşturdu. Okuyucu sayfa ile etkileşime girmeye çalıştığında, amaçlanan ekran kaydırma kilitlendiğinde görünür hale geldi.
Michael Khalili

Bu, lightbox görüntüsünün afterLoad()ve afterClosegeri aramaların kaydırılmasını devre dışı bırakmak için iPad'deki Fancybox ile mükemmel bir şekilde çalıştı . Bu soruyu araştıran başkaları için yararlı olabilir.
Tomanow

"Kaydırma etkinleştirme" bölümünde, "kaydırmayı devre dışı bırak" çağrısından sonra html öğesine yerleştirilen stil niteliğini kaldırmak isteyebilirsiniz; değil mi?
Ben

3
jQuery, yerel DOM'ları scrollTop'Kaydırmayı devre dışı bırak' kodunun 2. satırı olarak ifade edilebilecek şekilde standart hale getirir $( window ).scrollTop().
Barney

Sanırım buna başka bir şey daha eklenmeli. OSX'teki Chrome'da, tarayıcının esnek bir his veren "aşırı kaydırma" yapması mümkündür. Bu kodla sayfanın üstündeki veya altındaki gri alandaysanız ve kaydırmayı devre dışı bıraktığınız bir noktanın üzerine gelirseniz. Tarayıcı penceresinin üstünde / altında bir noktaya yapışacaktır. Bu nedenle negatif bir kaydırma değeri için bir çek eklemem gerekiyor: if (scrollTop < 0) { scrollTop = 0; }. Devre dışı bırak gist.github.com/jayd3e/2eefbbc571cd1668544b için tam kod .
JayD3e

34

JQuery dahil olduğunda:


devre dışı

$.fn.disableScroll = function() {
    window.oldScrollPos = $(window).scrollTop();

    $(window).on('scroll.scrolldisabler',function ( event ) {
       $(window).scrollTop( window.oldScrollPos );
       event.preventDefault();
    });
};

etkinleştirme

$.fn.enableScroll = function() {
    $(window).off('scroll.scrolldisabler');
};

kullanım

//disable
$("#selector").disableScroll();
//enable
$("#selector").enableScroll();

1
bu benim için mükemmeldi, önceki cevap sayfamı sektirdi, bu değil
Bogdan Tomi

yardımcı olabilir sevindim, mobil cihazlar, alkış için "touchmove" kontrol etmeniz gerekebilir
ceed

Eh, bu neredeyse benim için çalıştı. Firefox'ta Windows (Firefox, Chrome) ve MacOS'ta harikalar yarattı ... ama sonra Windows IE ve Edge'e, Chrome ve Safari'de MacOS ile birlikte gittim. Sorun artık sayfadan diğerine atlamakla ilgili değildi, ancak kaydırma çubuğu yukarıdan mevcut konuma atlıyor veya sayfa yukarı doğru titriyordu. Adam, bu oldu böylece , bu yüzden yakın. Belki hala işe yarayabiliriz.
Steven Ventimiglia

Bu benim için mükemmel çalıştı, teşekkürler! Bindirme menüsünün de sayfanın altında olduğu bir web sitesinde ideal tu kullanımı!
SauriolJf

13

OP benim

Fcalderan'ın cevabı sayesinde bir çözüm oluşturabildim. Çözümümü burada bırakıyorum çünkü nasıl kullanılacağına açıklık getiriyor ve çok önemli bir ayrıntı ekliyor,width: 100%;

Bu sınıfı ekliyorum

body.noscroll
{
    position: fixed; 
    overflow-y: scroll;
    width: 100%;
}

bu benim için çalıştı ve Fancyapp kullanıyordum.


11

Bu benim için gerçekten iyi çalıştı ....

// disable scrolling
$('body').bind('mousewheel touchmove', lockScroll);

// enable scrolling
$('body').unbind('mousewheel touchmove', lockScroll);


// lock window scrolling
function lockScroll(e) {
    e.preventDefault();
}

bu iki kod satırını kaydırmayı kilitlediğinizde karar verdiğiniz her şeyle sarın.

Örneğin

$('button').on('click', function() {
     $('body').bind('mousewheel touchmove', lockScroll);
});

Bu en iyi cevap
Jafo

7

Kaydırma olayını devre dışı bırakamazsınız, ancak fare tekerleği ve dokunma hareketi gibi bir kaymaya neden olan ilgili eylemleri devre dışı bırakabilirsiniz:

$('body').on('mousewheel touchmove', function(e) {
      e.preventDefault();
});

4

Vücudun kaydırma çubuğunu ile gizleyebilir ve overflow: hiddeniçerik atlamaması için aynı anda bir kenar boşluğu ayarlayabilirsiniz:

let marginRightPx = 0;
if(window.getComputedStyle) {
    let bodyStyle = window.getComputedStyle(document.body);
    if(bodyStyle) {
        marginRightPx = parseInt(bodyStyle.marginRight, 10);
    }
}

let scrollbarWidthPx = window.innerWidth - document.body.clientWidth;
Object.assign(document.body.style, {
    overflow: 'hidden',
    marginRight: `${marginRightPx + scrollbarWidthPx}px`
});

Ardından, boşluğu doldurmak için sayfaya devre dışı bırakılmış bir kaydırma çubuğu ekleyebilirsiniz:

textarea {
  overflow-y: scroll;
  overflow-x: hidden;
  width: 11px;
  outline: none;
  resize: none;
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  border: 0;
}
<textarea></textarea>

Bunu kendi ışık kutusu uygulamam için yaptım. Şimdiye kadar iyi çalışıyor gibi görünüyor.


1
Aslında bu yöntemi en çok seviyorum. Çok basit ve harika çalışıyor. Teşekkürler!
derikkain

2

Birlikte gittiğimiz çözüm bu. Kaplama açıldığında kaydırma konumunu kaydedin, kullanıcı sayfayı kaydırmaya çalıştığında kaydedilen konuma geri dönün ve kaplama kapandığında dinleyiciyi kapatın.

IE'de biraz gergin, ancak Firefox / Chrome'da bir cazibe gibi çalışıyor.

var body = $("body"),
  overlay = $("#overlay"),
  overlayShown = false,
  overlayScrollListener = null,
  overlaySavedScrollTop = 0,
  overlaySavedScrollLeft = 0;

function showOverlay() {
  overlayShown = true;

  // Show overlay
  overlay.addClass("overlay-shown");

  // Save scroll position
  overlaySavedScrollTop = body.scrollTop();
  overlaySavedScrollLeft = body.scrollLeft();

  // Listen for scroll event
  overlayScrollListener = body.scroll(function() {
    // Scroll back to saved position
    body.scrollTop(overlaySavedScrollTop);
    body.scrollLeft(overlaySavedScrollLeft);
  });
}

function hideOverlay() {
  overlayShown = false;

  // Hide overlay
  overlay.removeClass("overlay-shown");

  // Turn scroll listener off
  if (overlayScrollListener) {
    overlayScrollListener.off();
    overlayScrollListener = null;
  }
}

// Click toggles overlay
$(window).click(function() {
  if (!overlayShown) {
    showOverlay();
  } else {
    hideOverlay();
  }
});
/* Required */
html, body { margin: 0; padding: 0; height: 100%; background: #fff; }
html { overflow: hidden; }
body { overflow-y: scroll; }

/* Just for looks */
.spacer { height: 300%; background: orange; background: linear-gradient(#ff0, #f0f); }
.overlay { position: fixed; top: 20px; bottom: 20px; left: 20px; right: 20px; z-index: -1; background: #fff; box-shadow: 0 0 5px rgba(0, 0, 0, .3); overflow: auto; }
.overlay .spacer { background: linear-gradient(#88f, #0ff); }
.overlay-shown { z-index: 1; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<h1>Top of page</h1>
<p>Click to toggle overlay. (This is only scrollable when overlay is <em>not</em> open.)</p>
<div class="spacer"></div>
<h1>Bottom of page</h1>
<div id="overlay" class="overlay">
  <h1>Top of overlay</h1>
  <p>Click to toggle overlay. (Containing page is no longer scrollable, but this is.)</p>
  <div class="spacer"></div>
  <h1>Bottom of overlay</h1>
</div>


Gerçekten çalışır, ancak kaydırma çubuğu altına daldıkça sabit bir başlık durumunda tasarımı renklendirir.
Leon Willens

@LeonWillens Ne demek istediğinden emin değilim. Sabit bir başlık altında görünen yer paylaşımı konusunda endişeleriniz varsa z-index, .overlay-showndeğerini sabit başlıktan daha büyük olacak şekilde ayarlamanız gerekir . (Bu kod sabit bir başlık ile bir sitede üretimde çalışan ve iyi çalışıyor.)
0b10011

Hayır, bodyetiketin kaydırma çubuğundan bahsediyordum . Dün kodunuzu denedim ve sayfamın üstünde sabit bir başlık var. bodyEtiketi kullanarak kaydırmayı idare edersem , kaydırma çubuğu sabit başlığın altında olacaktır.
Leon Willens

1
@LeonWillens Oops, bunu bir noktada üretimde düzelttim ve güncellemeyi unuttum gibi görünüyor. Bunun yerine $("body")kullanıyoruz gibi görünüyor $(window). Ve z-index: -1gizlemek için bindirme yerine visibility: hiddenveya benzerlerini kullanabilirsiniz . Bkz jsfiddle.net/8p2gfeha eğer çalışırsa görmek için hızlı test için. Sabit başlık artık kaydırma çubuğunun üstünde görünmüyor. Sonunda bu değişiklikleri cevaba dahil etmeye çalışacağım.
0b10011

Tıkır tıkır çalışıyor! Teşekkür ederim :)
Leon Willens

1

Benzer bir sorunum vardı: göründüğünde kaydırmayı önleyen bir sol menü. Yükseklik 100vh olarak ayarlanır ayarlanmaz kaydırma çubuğu kayboldu ve içerik sağa sarsıldı.

Bu nedenle, kaydırma çubuğunu etkin tutmanın sakıncası yoksa (ancak pencereyi tam olarak herhangi bir yere kaydırılmayacak şekilde tam yüksekliğe ayarlamak), başka bir olasılık, kaydırma çubuklarının gösterilmesini sağlayacak küçük bir alt kenar boşluğu ayarlamaktır:

body {
    height: 100vh;
    overflow: hidden;
    margin: 0 0 1px;
}

Teminatın overflow:hiddenherhangi bir etkisi olmasını engellemiyor mu?
Koja

0

taşmayı koruyabilirsiniz: gizli ancak kaydırma konumunu manuel olarak yönetin:

gerçek kaydırma konumunun izini göstermeden önce:

var scroll = [$(document).scrollTop(),$(document).scrollLeft()];
//show your lightbox and then reapply scroll position
$(document).scrollTop(scroll[0]).scrollLeft(scroll[1]);

İşe yaramalı


0

Kaba ama çalışma yolu, kaydırmayı üste doğru zorlamak ve böylece kaydırmayı etkili bir şekilde devre dışı bırakmak olacaktır:

var _stopScroll = false;
window.onload = function(event) {
    document.onscroll = function(ev) {
        if (_stopScroll) {
            document.body.scrollTop = "0px";
        }
    }
};

Işık kutusunu açtığınızda bayrağı kaldırın ve kapatırken bayrağı indirin.

Canlı test durumu .


0

Ben "taşma: gizli" yöntemine sadık ve sadece kaydırma çubuğu genişliğine eşit dolgu sağ ekleyin.

Kayıp çubuk genişliği fonksiyonunu lostsource ile alın .

function getScrollbarWidth() {
    var outer = document.createElement("div");
    outer.style.visibility = "hidden";
    outer.style.width = "100px";
    outer.style.msOverflowStyle = "scrollbar"; // needed for WinJS apps

    document.body.appendChild(outer);

    var widthNoScroll = outer.offsetWidth;
    // force scrollbars
    outer.style.overflow = "scroll";

    // add innerdiv
    var inner = document.createElement("div");
    inner.style.width = "100%";
    outer.appendChild(inner);        

    var widthWithScroll = inner.offsetWidth;

    // remove divs
    outer.parentNode.removeChild(outer);

    return widthNoScroll - widthWithScroll;
}

Yer paylaşımını gösterirken, html'ye "noscroll" sınıfını ekleyin ve gövdeye dolgu hakkı ekleyin:

$(html).addClass("noscroll");
$(body).css("paddingRight", getScrollbarWidth() + "px");

Gizlerken sınıfı ve dolguyu çıkarın:

$(html).removeClass("noscroll");
$(body).css("paddingRight", 0);

Noscroll tarzı sadece şu şekildedir:

.noscroll { overflow: hidden; }

Sabit konumlu herhangi bir elemanınız varsa, dolguyu bu elemanlara da eklemeniz gerektiğini unutmayın.


Bu çözümü kullandım. Çift kaydırma çubuklarından kaçınmama yardımcı oldu (gövde için bir 'boş' ve kaplamanın içeriği için ikinci bir çubuk). Ayrıca, kaydırma çubuklarını gösterebilecek veya göstermeyecek OSX üzerinde çok iyi çalışır.
Novazembla

0

<div id="lightbox"><body>öğenin içinde olduğundan ışık kutusunu kaydırdığınızda gövdeyi de kaydırırsınız. Çözüm, <body>öğeyi% 100'ün üzerine uzatmamak, uzun içeriği başka bir divöğenin içine yerleştirmek ve gerekirse bu divöğeye bir kaydırma çubuğu eklemektir overflow: auto.

html {
  height: 100%
}
body {
  margin: 0;
  height: 100%
}
#content {
  height: 100%;
  overflow: auto;
}
#lightbox {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
<html>
  <body>
    <div id="content">much content</div>
    <div id="lightbox">lightbox<div>
  </body>
</html>

Şimdi, ışık kutusu (ve bodyde) üzerinde kaydırmanın bir etkisi yoktur, çünkü gövde ekran yüksekliğinin% 100'ünden daha uzun değildir.


0

Tüm kip / ışık kutusu javascript tabanlı sistemler, kip / ışık kutusunu görüntülerken, html etiketi veya gövde etiketinde taşma kullanır.

Işık kutusu gösterildiğinde, js html veya gövde etiketinde gizli bir taşmayı iter. Işık kutusu gizlendiğinde, bazıları gizli olanı kaldırır, html veya gövde etiketinde taşma otomatik olarak iter.

Mac üzerinde çalışan geliştiriciler kaydırma çubuğunun sorununu görmezler.

Kaydırma çubuğunun kaldırılmasının modalının altında kayan içeriği görmemek için gizli olanı bir kümeyle değiştirin.

Işık kutusu açık / göster:

<html style="overflow: unset;"></html>

Işık kutusu kapat / gizle:

<html style="overflow: auto;"></html>

0

Üst katmanın altındaki sayfa üstte "sabitlenebilir" ise, kaplamayı açtığınızda

.disableScroll { position: fixed; overflow-y:scroll }

kaydırılabilir gövdeye bu sınıfı sağlayın, yine de sağ kaydırma çubuğunu görmelisiniz, ancak içerik kaydırılamaz.

Sayfanın konumunu korumak için bunu jquery'de yapın

$('body').css('top', - ($(window).scrollTop()) + 'px').addClass('disableScroll');

Yer paylaşımını kapattığınızda, bu özellikleri

var top = $('body').position().top;
$('body').removeClass('disableScroll').css('top', 0).scrollTop(Math.abs(top));

Sadece bu şekilde teklif ettim çünkü herhangi bir kaydırma etkinliğini değiştirmeniz gerekmiyordu


0

Bu, kaydırma konumunu kaydedip kaydırmayı etkinleştirerek geri yükleyerek görünüm alanının üste atlamasını durduracaktır.

CSS

.no-scroll{
  position: fixed; 
  width:100%;
  min-height:100vh;
  top:0;
  left:0;
  overflow-y:scroll!important;
}

JS

var scrollTopPostion = 0;

function scroll_pause(){
  scrollTopPostion = $(window).scrollTop();
  $("body").addClass("no-scroll").css({"top":-1*scrollTopPostion+"px"});
}

function scroll_resume(){
  $("body").removeClass("no-scroll").removeAttr("style");
  $(window).scrollTop(scrollTopPostion);
}

Şimdi tek yapmanız gereken fonksiyonları çağırmak

$(document).on("click","#DISABLEelementID",function(){
   scroll_pause();
});

$(document).on("click","#ENABLEelementID",function(){
   scroll_resume();
});

0

Gövde kaydırma kaldırılırken sabit modal içerik atlama kurtulmak için başka bir çözüm, sayfa genişliğini normalleştirmek için:

body {width: 100vw; overflow-x: hidden;}

Daha sonra sabit konum veya taşma ile oynayabilirsiniz: modal açıkken vücut için gizli. Ancak yatay kaydırma çubuklarını gizleyecektir - genellikle duyarlı web sitesinde gerekli değildir.


-1

Javascript ile yapabilirsiniz:

// Classic JS
window.onscroll = function(ev) {
  ev.preventDefault();
}

// jQuery
$(window).scroll(function(ev) {
  ev.preventDefault();
}

Ardından, ışık kutunuz kapalıyken devre dışı bırakın.

Ancak, ışık kutunuzda bir kaydırma çubuğu varsa, açıkken kaydırma yapamazsınız. Çünkü windowhem bodyve içerir #lightbox. Bu yüzden aşağıdaki gibi bir mimari kullanmalısınız:

<body>
  <div id="global"></div>
  <div id="lightbox"></div>
</body>

Ve sonra onscrolletkinliği yalnızca tarihinde uygulayın #global.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.