Kalıcı bir iletişim kutusu ekrandan daha uzun olduğunda sayfa nasıl kaydırılır?


87

Uygulamamda y yönünde oldukça uzun sürebilen kalıcı bir iletişim kutusu var. Bu, iletişim kutusunun içeriğinin bir kısmının sayfanın altından gizlendiği bir sorunu ortaya çıkarır.

görüntü açıklamasını buraya girin

Pencere kaydırma çubuğunun, görüntülendiğinde iletişim kutusunu kaydırmasını ve ekrana sığmayacak kadar uzun olmasını, ancak ana gövdeyi modalin arkasında yerinde bırakmasını istiyorum. Trello kullanırsanız, ne için gittiğimi biliyorsunuz.

Kaydırma çubuğunu kontrol etmek için JavaScript kullanmadan bu mümkün müdür?

Şimdiye kadar modal ve iletişim kutuma uyguladığım CSS:

body.blocked {
  overflow: hidden;
}

.modal-screen {
  background: #717174;
  position: fixed;
  overflow: hidden;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  opacity: 0.9;
  z-index: 50;
}

.dialog {
  background: #fff;
  position: fixed;
  padding: 12px;
  top: 20%;
  left: 50%;
  z-index: 10000;
  border-radius: 5px;
  box-shadow: 0, 0, 8px, #111;
}

taşmayı deneyin: otomatik veya taşma: iletişim kutusunda kaydırın ...
lakshmi priya

Yanıtlar:


198

sadece kullan

.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}

modalınızı düzenleyecek ve ardından ona dikey bir kaydırma verecektir


7
Kabul edilen cevap bu olmalıdır. Zarif ve sade.
brianfit

2
neden 210px kullanmak zorundayız? Bunun arkasında belirli bir sebep var mı?
ShellZero

9
@ShellZero, şunların toplamıdır: modal üstbilgi, kalıcı altbilgi, modal ve pencere kenarlıkları arasındaki üst ve alt boşluk.
Stalinko

3
Altbilgi ve başlık yüksekliğini sabit kodlamadan bir çözüm var mı?
Pavel

2
İOS'ta normal bir kaydırma gibi hissetmesini istiyorsanız, -webkit-overflow-scrolling eklemek isteyebilirsiniz: touch; ayrıca, çünkü Mobile Safari, özellikle belirtilmediği sürece taşma kaydırmayı normal sayfa kaydırmadan farklı şekilde ele alır.
Adam Gerthel

40

Bunu benim için düzelten şey buydu:

max-height: 100%;
overflow-y: auto;

DÜZENLEME : Şu anda Twitter'da kullanılan aynı yöntemi kullanıyorum, burada modal içeriğin üstünde ayrı bir sayfa gibi davranıyor ve modalin arkasındaki içerik siz kaydırdıkça hareket etmiyor.

Özünde şu:

var scrollBarWidth = window.innerWidth - document.body.offsetWidth;
$('body').css({
  marginRight: scrollBarWidth,
  overflow: 'hidden'
});
$modal.show();

Modal üzerindeki bu CSS ile:

position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: auto;

JSFiddle: https://jsfiddle.net/0x0049/koodkcng/
Pure JS sürümü (IE9 +): https://jsfiddle.net/0x0049/koodkcng/1/

Bu, sayfanın veya kalıcı iletişim kutusunun yüksekliği veya genişliği ne olursa olsun çalışır, farenizin / parmağınızın nerede olduğu fark etmeksizin kaydırmaya izin verir, bazı çözümlerin ana içerikte kaydırmayı devre dışı bırakan sarsıcı atlama özelliği yoktur ve harika görünür.


OP'ye hitap eden tek cevap budur. Modal çok uzun olduğunda SAYFA nasıl kaydırılır. aslında sayfayı kaydırmaz, ancak ekranda alt kenar boşluğu ile dikey alan kaplamak istememe durumuna uyan sayfayı kaydırma yanılsamasını yaratır. kabul edilen cevap dahil diğer tüm çözümlerde bu sorun var.
Ynot

13

Değişiklik position

position:fixed;
overflow: hidden;

-e

position:absolute;
overflow:scroll;

1
Korkarım işe yaramıyor. Sanki pencere, iletişim kutusunun yüksekliğinin farkında değil.
David Tuite

Sorun şu ki position: fixed;, mutlak veya başka bir şekilde değiştirilebilir mi?
bitoshi.n

2
Bunu yaparsam başka bir sorunla karşılaşırım. Kullanıcı iletişim kutusunu açtığında zaten sayfanın aşağısına kaydırılmışsa, sayfanın en üstünde, geçerli pencerenin görüntüsü dışında görünecektir.
David Tuite

1
Bu benim için çalıştı - hem normal modlarda hem de bir modalda bir modal olduğunda (Bootstrap örtüşen modların desteklenmediğini söylüyor ... özel kod gerektiriyor ).
eggy

Bu aslında OP'nin doğru cevabıdır, çünkü sayfayı
kaydırıyorsunuz, modali kaydırmıyorsunuz

6

İşte içeriğine göre otomatik olarak yeniden boyutlandıran ve pencereye sığmadığında kaydırmaya başlayan modal pencere demom.

Modal pencere demosu (HTML kaynak kodundaki yorumlara bakın)

Bunların hepsi yalnızca HTML ve CSS ile yapılır - kalıcı pencereyi görüntülemek ve yeniden boyutlandırmak için JS gerekmez (ancak yine de pencereyi görüntülemek için buna ihtiyacınız vardır - yeni sürümde JS'ye hiç ihtiyacınız yoktur).

Güncelleme (daha fazla demo):

Buradaki nokta, dış tarafın sabit konumu tanımladığı ve iç tarafın kaydırmayı oluşturduğu dış ve iç DIV'lere sahip olmaktır. (Demoda, gerçek bir kalıcı pencere gibi görünmelerini sağlayacak daha fazla DIV var.)

        #modal {
            position: fixed;
            transform: translate(0,0);
            width: auto; left: 0; right: 0;
            height: auto; top: 0; bottom: 0;
            z-index: 990; /* display above everything else */
            padding: 20px; /* create padding for inner window - page under modal window will be still visible */
        }

        #modal .outer {
            box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box;
            width: 100%;
            height: 100%;
            position: relative;
            z-index: 999;
        }

        #modal .inner {
            box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box;
            width: 100%;
            height: auto;       /* allow to fit content (if smaller)... */
            max-height: 100%;   /* ... but make sure it does not overflow browser window */

            /* allow vertical scrolling if required */
            overflow-x: hidden;
            overflow-y: auto;

            /* definition of modal window layout */
            background: #ffffff;
            border: 2px solid #222222;
            border-radius: 16px; /* some nice (modern) round corners */
            padding: 16px;       /* make sure inner elements does not overflow round corners */
        }

Kaydırmayı önlemek için açılır pencere açıldığında sayfayı kilitleyebilir misiniz? Kullanıcı, fareyi pop-up'ın dışında tutarsa, pop-up yerine sayfayı kaydırır ve bu gerçekleştiğinde ve pop-up'a geçtiğinde pop-up'ı ve sayfa kaydırmayı alır. Teşekkürler
Adyyda

@Adyyda Sayfayı bir DIV'ye kaydırarak overflow:hiddenve boyutunu sayfayla aynı ve onun margin-topnegatifine ayarlayarak kaydırmayı durdurabilirsiniz scroll-top.
Radek Pech

Bu iyi ve uygun bir çözüm Radek'ti - duyarlı, çapraz tarayıcı, CSS kullanılarak yapıldı. Bana biraz zaman kazandırdı, teşekkürler
Tremendus Apps

@RadekPech, bunun yapmaktan farkı html,body{ overflow:hidden }nedir?
Steven Vachon

@StevenVachon Demo kadar basit bir sayfada ve sınırlı sayıda desteklenen tarayıcıda herhangi bir fark olmayabilir. Ancak daha karmaşık bir sayfada veya belirli bir tarayıcı ayarında html,body{ overflow:hidden }beklendiği gibi çalışmayabilir. Bu yüzden abartılı gibi görünebilir ama üzgün olmaktan daha güvenli .
Radek Pech

2

Sabit konumlandırma tek başına bu sorunu çözmüş olmalıdır, ancak bu sorunu önlemek için başka bir iyi çözüm, modal div'lerinizi veya öğelerinizi sitenizin düzeninde değil sayfanın altına yerleştirmektir. Modal eklentilerin çoğu, kullanıcının ana sayfayı kaydırmaya devam etmesini sağlamak için kalıcı konumlandırmalarını mutlak olarak verir.

<html>
        <body>
        <!-- Put all your page layouts and elements


        <!-- Let the last element be the modal elemment  -->
        <div id="myModals">
        ...
        </div>

        </body>
</html>

2

İşte .. Benim için mükemmel çalışıyor

.modal-body { 
    max-height:500px; 
    overflow-y:auto;
}

2

Bu css'yi ekleyerek bunu yapmanın basit yolu Yani, bunu CSS'ye eklediniz:

.modal-body {
position: relative;
padding: 20px;
height: 200px;
overflow-y: scroll;
}

ve çalışıyor!


1

position:fixedmodal pencerenin bakış açısına göre sabit kalacağını ima eder. Bu senaryoda uygun olduğuna dair değerlendirmenize katılıyorum, bunu akılda tutarak neden kalıcı pencerenin kendisine bir kaydırma çubuğu eklemiyorsunuz?

Eğer öyleyse, doğru max-heightve overflowözellikler hile yapmalıdır.


0

Sonunda, kalıcı ekranın arkasındaki sayfanın içeriğinde, sayfayı kaydıracak kadar uzun süre kalmamasını sağlamak için değişiklik yapmak zorunda kaldım.

Bunu yaptıktan sonra position: absolute, kullanıcı artık sayfayı aşağı kaydıramadığı için iletişim kutusuna başvururken karşılaştığım sorunlar çözüldü.


sorununuzu
atladınız

hem soru hem de cevap gönderisi sizin tarafınızdan ve siz de cevabınızı kabul ediyorsunuz, o zaman neden soruyu buraya gönderiyorsunuz?
Thiyagu

2
@Thiyagu Tamam olarak kabul edilir. Soruyu soran kişi çözümü bulursa, bir yanıt göndermelidir. Ayrıca hangi cevabın kendilerine yardımcı olduğunu kabul etmekte özgürler. Nihai amaç, bir bütün olarak topluluğa yardım etmektir.
Bugs

0

Modal açıkken Pencere Sayfası Kaydırma Çubuğu tıklanabilir

Bu benim için çalışıyor. Saf CSS.

<style type="text/css">

body.modal-open {
padding-right: 17px !important;
}

.modal-backdrop.in {
margin-right: 16px; 

</style>

Deneyin ve bana bildirin


-1

Dinamik genişlik ve yüksekliğe sahip bu model sorununa saf CSS cevabımı eklemek istedim. Aşağıdaki kod, aşağıdaki gereksinimlerle de çalışır:

  1. Modu ekranın ortasına yerleştirin
  2. Modal, görüntü alanından daha yüksekse, kaydırma kısıcı (kalıcı içerik değil)

HTML:

<div class="modal">
    <div class="modal__content">
        (Long) Content
    </div>
</div>

CSS / DAHA AZ:

.modal {
    position: fixed;
    display: flex;
    align-items: center;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    padding: @qquad;
    overflow-y: auto;
    background: rgba(0, 0, 0, 0.7);
    z-index: @zindex-modal;

    &__content {
        width: 900px;
        margin: auto;
        max-width: 90%;
        padding: @quad;
        background: white;
        box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.75);
    }
}

Bu şekilde modal her zaman görünüm alanı içindedir. Modalin genişliği ve yüksekliği istediğiniz kadar esnektir. Basit olması için yakın simgemi bundan kaldırdım.

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.