Membuat overlay Div SELURUH halaman (bukan hanya viewport)?


97

Jadi saya memiliki masalah yang menurut saya cukup umum tetapi saya belum menemukan solusi yang tepat. Saya ingin membuat penutup div overlay SELURUH halaman ... BUKAN hanya viewport. Saya tidak mengerti mengapa ini sangat sulit dilakukan ... Saya sudah mencoba mengatur body, html heights menjadi 100% dll tetapi itu tidak berhasil. Inilah yang saya miliki sejauh ini:

<html>
<head>
    <style type="text/css">
    .OverLay { position: absolute; z-index: 3; opacity: 0.5; filter: alpha(opacity = 50); top: 0; bottom: 0; left: 0; right: 0; width: 100%; height: 100%; background-color: Black; color: White;}
    body { height: 100%; }
    html { height: 100%; }
    </style>
</head>

<body>
    <div style="height: 100%; width: 100%; position: relative;">
        <div style="height: 100px; width: 300px; background-color: Red;">
        </div>
        <div style="height: 230px; width: 9000px; background-color: Green;">
        </div>
        <div style="height: 900px; width: 200px; background-color: Blue;"></div>
        <div class="OverLay">TestTest!</div>
    </div>


    </body>
</html> 

Saya juga akan terbuka untuk solusi dalam JavaScript jika ada, tetapi saya lebih suka hanya menggunakan beberapa CSS sederhana.


Dapat membaca lebih lanjut di sini: stackoverflow.com/questions/1938536/…
Marco Demaio

Bisakah ini dilakukan secara nyata dengan jQuery?
William Entriken

Jawaban:


228

Area pandang adalah yang terpenting, tetapi Anda mungkin ingin seluruh situs web tetap digelapkan bahkan saat menggulir. Untuk ini, Anda ingin menggunakan position:fixedbukan position:absolute. Fixed akan membuat elemen statis di layar saat Anda menggulir, memberikan kesan bahwa seluruh bodi digelapkan.

Contoh: http://jsbin.com/okabo3/edit

div.fadeMe {
  opacity:    0.5; 
  background: #000; 
  width:      100%;
  height:     100%; 
  z-index:    10;
  top:        0; 
  left:       0; 
  position:   fixed; 
}
<body>
  <div class="fadeMe"></div>
  <p>A bunch of content here...</p>
</body>

3
Saya mungkin salah, tetapi akankah posisi tetap berfungsi di IE6 ?! Saya tahu mungkin tidak ada yang terlalu peduli tentang IE6.
Marco Demaio

29
@MarcuTidak yakin. Sejujurnya, jika dukungan untuk browser berusia 10 tahun tidak secara eksplisit diminta, saya tidak akan repot lagi :)
Sampson

5
Jadi bagaimana kalian melakukannya di perangkat seluler? bradfrostweb.com/blog/mobile/fixed-position
BorisOkunskiy

3
+1 Terima kasih! Saya memperluas contoh Anda dengan menambahkan jendela sembulan di atas hamparan: jsbin.com/okabo3/740
kol

Masalah yang saya alami dengan ini (yang digunakan oleh banyak plugin) adalah saat Anda mengklik <select>elemen di iOS, elemen ini menggerakkan seluruh area pandang dan pada dasarnya merusak semuanya. elemen tetap bergerak, hal-hal yang seharusnya tidak menggulir, dll.
billynoah

16
body:before {
    content: " ";
    width: 100%;
    height: 100%;
    position: fixed;
    z-index: -1;
    top: 0;
    left: 0;
    background: rgba(0, 0, 0, 0.5);
}

2
Solusi terbaik di luar sana. Anda cukup mengaktifkan kelas "overlay" untuk body dan menerapkan gaya di atas ke body dengan className tersebut.
Sviatoslav Zalishchuk

3
Tolong jelaskan jawaban ini lebih lanjut. Saya tidak mengerti komentar Sviatoslav.
Lonnie Best

1

Pertama-tama, saya pikir Anda telah salah paham tentang apa itu viewport. Area pandang adalah area yang digunakan browser untuk merender halaman web, dan Anda tidak dapat membangun situs web dengan cara apa pun untuk menimpa area ini dengan cara apa pun.

Kedua, tampaknya alasan overlay-div Anda tidak menutupi keseluruhan viewport adalah karena Anda harus menghapus semua margin pada BODY dan HTML.

Coba tambahkan ini di bagian atas stylesheet Anda - ini menyetel ulang semua margin dan paddings pada semua elemen. Membuat pengembangan lebih lanjut lebih mudah:

* { margin: 0; padding: 0; }

Sunting: Saya baru saja memahami pertanyaan Anda dengan lebih baik. Position: fixed; mungkin akan berhasil untuk Anda, seperti yang ditulis oleh Jonathan Sampson.


1
Anda tidak boleh menghapus bantalan dan margin dari semuanya . Ini bisa sangat melelahkan untuk mendapatkannya kembali untuk banyak elemen seperti tombol dan input formulir.
Sampson

1
Menurut pendapat saya, ini hanya cara yang sangat mudah untuk memperlakukan semuanya lebih sama di semua browser. Mungkin tidak berlaku sebanyak hari ini seperti sebelumnya ketika beradaptasi dengan IE5, tetapi saya masih melakukannya sebagai salah satu hal pertama yang saya tulis di stylesheet.
Arve Systad

3
@Arve Ini membuat Anda dekat, tetapi lebih baik menggunakan lembar reset yang telah teruji waktu sebagai gantinya. Lihat meyerweb.com/eric/tools/css/reset untuk informasi lebih lanjut - Anda akan menyukainya, saya jamin :)
Sampson

Saya pernah melihatnya, dan menurut saya itu terlalu besar :)
Arve Systad

1
@Arve Penyetelan ulang tidak terlalu besar - coba pulihkan sepenuhnya dari *{}dan Anda akan melihat lebih banyak lagi :)
Sampson

0

Saya mengalami sedikit masalah karena saya tidak ingin MEMPERBAIKI overlay di tempatnya karena saya ingin info di dalam overlay dapat di-scroll di atas teks. Saya menggunakan:

<html style="height=100%">
   <body style="position:relative">
      <div id="my-awesome-overlay" 
           style="position:absolute; 
                  height:100%; 
                  width:100%; 
                  display: block">
           [epic content here]
      </div>
   </body>
</html>

Tentu saja div di tengah membutuhkan beberapa konten dan mungkin latar belakang abu-abu transparan tapi saya yakin Anda mengerti intinya!


-6

Saya melihat jawaban Nate Barr di atas, yang sepertinya Anda sukai. Sepertinya tidak jauh berbeda dari yang lebih sederhana

html {background-color: grey}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.