สร้าง Div ซ้อนทับทั้งหน้า (ไม่ใช่แค่วิวพอร์ต)?


97

ดังนั้นฉันจึงมีปัญหาที่ฉันคิดว่าค่อนข้างบ่อย แต่ฉันยังไม่พบวิธีแก้ปัญหาที่ดี ฉันต้องการสร้าง Div โอเวอร์เลย์ครอบคลุมหน้าทั้งหมด ... ไม่ใช่แค่วิวพอร์ต ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงทำได้ยาก ... ฉันได้ลองตั้งค่าร่างกาย html สูงถึง 100% ฯลฯ แต่ไม่ได้ผล นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

<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> 

ฉันยังเปิดกว้างสำหรับโซลูชันใน JavaScript หากมีอยู่ แต่ฉันอยากใช้ CSS ธรรมดา ๆ


สามารถอ่านเพิ่มเติมได้ที่นี่: stackoverflow.com/questions/1938536/…
Marco Demaio

สามารถทำได้จริงกับ jQuery หรือไม่?
William Entriken

คำตอบ:


228

วิวพอร์ตเป็นสิ่งสำคัญ แต่คุณอาจต้องการให้ทั้งเว็บไซต์มืดลงแม้ในขณะที่เลื่อน สำหรับสิ่งนี้คุณต้องการใช้position:fixedแทนposition:absolute. คงที่จะทำให้องค์ประกอบคงที่บนหน้าจอในขณะที่คุณเลื่อนทำให้รู้สึกว่าทั้งร่างกายมืดลง

ตัวอย่าง: 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
ฉันอาจจะผิด แต่ตำแหน่งคงทำงานใน IE6 หรือไม่! ฉันรู้ว่าอาจไม่มีใครสนใจ IE6 อีกต่อไป
Marco Demaio

29
@Marco ไม่แน่ใจ. พูดตามตรงถ้าไม่ได้ขอการสนับสนุนเบราว์เซอร์อายุ 10 ปีอย่างชัดเจนฉันจะไม่รบกวนอีกต่อไป :)
Sampson

5
แล้วพวกคุณทำบนอุปกรณ์มือถือได้อย่างไร? bradfrostweb.com/blog/mobile/fixed-position
BorisOkunskiy

3
+1 ขอบคุณ! ฉันขยายตัวอย่างของคุณโดยเพิ่มหน้าต่างป๊อปอัปเหนือภาพซ้อนทับ: jsbin.com/okabo3/740
kol

ปัญหาที่ฉันมีกับสิ่งนี้ (ซึ่งใช้โดยปลั๊กอินจำนวนมาก) คือเมื่อคุณคลิก<select>องค์ประกอบใน iOS มันจะย้ายวิวพอร์ตทั้งหมดและแบ่งทุกอย่างโดยทั่วไป องค์ประกอบคงที่ย้ายสิ่งที่ไม่ควรเลื่อนเลื่อน ฯลฯ
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
ทางออกที่ดีที่สุดที่เป็นไปได้ คุณเพียงแค่สลับคลาส "ซ้อนทับ" สำหรับร่างกายและใช้สไตล์ด้านบนกับร่างกายด้วยชื่อคลาสนั้น
Sviatoslav Zalishchuk

3
กรุณาอธิบายคำตอบนี้เพิ่มเติม ฉันไม่เข้าใจความคิดเห็นของ Sviatoslav
Lonnie Best

1

ก่อนอื่นฉันคิดว่าคุณเข้าใจผิดว่าวิวพอร์ตคืออะไร วิวพอร์ตเป็นพื้นที่ที่เบราว์เซอร์ใช้ในการแสดงผลหน้าเว็บและคุณไม่สามารถสร้างเว็บไซต์ของคุณเพื่อแทนที่พื้นที่นี้ไม่ว่าด้วยวิธีใด ๆ

ประการที่สองดูเหมือนว่าสาเหตุที่การซ้อนทับของคุณไม่ครอบคลุมวิวพอร์ตทั้งหมดเป็นเพราะคุณต้องลบระยะขอบทั้งหมดใน BODY และ HTML

ลองเพิ่มสิ่งนี้ที่ด้านบนสุดของสไตล์ชีตของคุณ - มันจะรีเซ็ตระยะขอบและการพายเรือในทุกองค์ประกอบ ทำให้การพัฒนาต่อไปง่ายขึ้น:

* { margin: 0; padding: 0; }

แก้ไข: ฉันเพิ่งเข้าใจคำถามของคุณดีขึ้น Position: fixed; อาจจะได้ผลสำหรับคุณอย่างที่โจนาธานแซมป์สันเขียนไว้


1
คุณไม่ควรลบ padding และกำไรจากทุกอย่าง อาจเป็นเรื่องยากมากที่จะนำสิ่งเหล่านั้นกลับมาสำหรับองค์ประกอบต่างๆเช่นปุ่มและอินพุตแบบฟอร์ม
Sampson

1
ในความคิดของฉันมันเป็นเพียงวิธีที่ง่ายมากในการจัดการทุกอย่างให้เหมือนกันในเบราว์เซอร์ อาจใช้ไม่ได้มากเท่าที่เคยทำมาก่อนเมื่อปรับเข้ากับ IE5 แต่ฉันยังคงทำเป็นสิ่งแรก ๆ ที่ฉันเขียนในสไตล์ชีท
Arve Systad

3
@Arve ช่วยให้คุณเข้าใกล้ได้ แต่ควรใช้แผ่นรีเซ็ตที่ทดสอบตามเวลาแทน ตรวจสอบmeyerweb.com/eric/tools/css/resetสำหรับข้อมูลเพิ่มเติม - คุณจะรักมันฉันรับรองว่าคุณ :)
Sampson

ฉันได้เห็นมันและฉันคิดว่ามันใหญ่เกินไป :)
Arve Systad

1
@Arve การรีเซ็ตไม่ได้ใหญ่ขนาดนั้น - ลองกู้คืนอย่างสมบูรณ์แล้ว*{}คุณจะเห็นอะไรอีกมากมาย :)
Sampson

0

ฉันมีปัญหาเล็กน้อยเนื่องจากฉันไม่ต้องการแก้ไขภาพซ้อนทับให้เข้าที่เนื่องจากฉันต้องการให้ข้อมูลภายในภาพซ้อนทับเลื่อนไปบนข้อความได้ ฉันใช้:

<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>

แน่นอนว่า div ที่อยู่ตรงกลางต้องการเนื้อหาบางส่วนและอาจเป็นพื้นหลังสีเทาโปร่งใส แต่ฉันแน่ใจว่าคุณเข้าใจแล้ว!


-6

ฉันดูคำตอบของ Nate Barr ข้างต้นซึ่งคุณดูเหมือนจะชอบ ดูเหมือนจะไม่แตกต่างจากแบบเรียบง่ายมากนัก

html {background-color: grey}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.