หรี่หน้าจอทั้งหมดยกเว้นพื้นที่คงที่?


90

ฉันต้องการสร้างบทช่วยสอนซึ่งจะนำผู้ใช้ไปยังตำแหน่งที่คลิก ฉันพยายามที่จะครอบคลุมทั้งหน้าจอด้วย<div>ซึ่งจะสลัวองค์ประกอบทั้งหมดยกเว้นพื้นที่เฉพาะที่อยู่ในการแก้ไขwidth, height, และtopleft

ปัญหาคือฉันไม่สามารถหาวิธี "ยกเลิก" ของผู้ปกครองได้background-color(ซึ่งก็โปร่งใสเช่นกัน)

ในด้านล่างนี้holeคือ div ที่ควรจะไม่มีเลยbackground-colorรวมถึงพาเรนต์ด้วย

สิ่งนี้จะสำเร็จได้หรือไม่? ความคิดใด ๆ ?

#bg{
   background-color:gray;
   opacity:0.6;
   width:100%;
   height:100vh;
}
#hole{
   position:fixed;
   top:100px;
   left:100px;
   width:100px;
   height:100px;
}
<div id="bg">
    <div id="hole"></div>
</div>

นี่คือภาพจำลองของสิ่งที่ฉันพยายามบรรลุ:

ป้อนคำอธิบายภาพที่นี่


13
หากคุณกำลังสร้างทัวร์ชมคุณลักษณะ / บทช่วยสอนคุณอาจสนใจหนึ่งในไลบรารี js สำหรับการดำเนินการนี้ พวกเขามีคุณสมบัติที่ดีและจะช่วยให้คุณประหยัดปัญหาในการเขียนเอฟเฟกต์ css แบบครั้งเดียว ตรวจสอบintrojs.comหรือlinkedin.github.io/hopscotch
60

2
นี่เป็นเพียงข้อเสนอแนะสำหรับ lib: heelhook.github.io/chardin.js
ออนไลน์ Thomas

คำตอบ:


127

คุณสามารถทำได้โดยใช้เพียงอันเดียวdivและให้ไฟล์box-shadow.

แก้ไข: ตามที่ @Nick Shvelidze ชี้ให้เห็นคุณควรพิจารณาเพิ่มpointer-events: none

เพิ่มvmaxมูลค่าbox-shadowตามที่ @Prinzhorn แนะนำ

div {
  position: fixed;
  width: 200px;
  height: 200px;
  top: 50px;
  left: 50px;
  /* for IE */
  box-shadow: 0 0 0 1000px rgba(0,0,0,.3);
  /* for real browsers */
  box-shadow: 0 0 0 100vmax rgba(0,0,0,.3);
  pointer-events: none;
}
<div></div>


29
อย่าลืมเพิ่มpointer-events: noneถ้าคุณต้องการให้พื้นที่ด้านล่างคลิกได้
Nick Shvelidze

4
1,000px ดูเหมือนจะไม่เพียงพอสำหรับฉัน - ดูเหมือนว่าจะมีหลายกรณีเกินไปที่สิ่งนี้ไม่เต็มหน้าจอมิฉะนั้นวิธีแก้ปัญหาที่ชาญฉลาดจริงๆ
ESR

1
@EdmundReed คุณสามารถปรับเปลี่ยนได้ตามความต้องการของคุณ :)
VilleKoo

8
box-shadow: 0 0 0 100vmax rgba(0,0,0,.3);รับประกันว่าจะครอบคลุมทั้งหน้าจอ
Prinzhorn

2
@VilleKoo คุณสามารถเพิ่มไว้ด้านหลังเส้น 1,000px และเก็บไว้เป็นส่วนหลัง
Prinzhorn

19

คุณสามารถสร้าง SVG ซึ่งเต็มไปด้วยเส้นทางที่มีช่องโหว่ที่คุณต้องการ แต่ฉันเดาว่าคุณต้องหาวิธีจัดการการคลิกมากกว่าเนื่องจากทั้งหมดจะถูกกำหนดเป้าหมายไปที่ svg ที่ซ้อนทับ ฉันdocument.getElementFromPointสามารถช่วยคุณได้ที่นี่ mdn


ฉันคิดว่าแบบฟอร์มข้อเสนอแนะของ Google โดยใช้ svg เพื่อหรี่พื้นที่พักผ่อน
Durga

3

สิ่งนี้สามารถทำได้เช่นเดียวกับคำตอบของ @ VilleKoo แต่มีเส้นขอบ

div {
    border-style: solid;
    border-color: rgba(0,0,0,.3);
    pointer-events: none;
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
    border-width: 40px 300px 50px 60px;
}
<div></div>


2

คุณสามารถบรรลุเช่นเดียวกับคำตอบของ VilleKooโดยใช้outlineคุณสมบัติCSS มีการสนับสนุนเบราว์เซอร์ที่ยอดเยี่ยม (และใช้งานได้ใน IE8 +) โครงร่างมีไวยากรณ์เหมือนกันกับเส้นขอบ แต่ต่างจากเส้นขอบที่ไม่ใช้พื้นที่พวกเขาจะวาดเหนือเนื้อหา

นอกจากนี้สำหรับ IE9 + คุณสามารถแทนที่99999pxด้วยcalc(100 * (1vh + 1vw - 1vmin)).

ข้อเสียของวิธีนี้คือการที่ไม่ได้รับผลกระทบจากoutlineborder-radius

การสาธิต:

div {
  position: fixed;
  width: 200px;
  height: 200px;
  top: 50px;
  left: 50px;
  /* IE8 */
  outline: 99999px solid rgba(0,0,0,.3);
  /* IE9+ */
  outline: calc(100 * (1vw + 1vh - 1vmin)) solid rgba(0,0,0,.3);
  /* for other browsers */
  outline: 100vmax solid rgba(0,0,0,.3);
  pointer-events: none;
}
<div></div>


0

นี่คือโค้ด jQuery ง่ายๆโดยใช้ @VilleKoo css

var Dimmer = (function(){
  var el = $(".dimmer");
  
  return {
    showAt: function(x, y) {
      el
        .css({
          left: x,
          top: y,
        })
        .removeClass("hidden");
    },
    
    hide: function() {
      el.addClass("hidden");
    }
  }
}());


$(".btn-hide").click(function(){ Dimmer.hide(); });
$(".btn-show").click(function(){ Dimmer.showAt(50, 50); });
.dimmer {
  position: fixed;
  width: 200px;
  height: 200px;
  top: 50px;
  left: 50px;
  box-shadow: 0 0 0 1000px rgba(0,0,0,.3); /* for IE */
  box-shadow: 0 0 0 100vmax rgba(0,0,0,.3); /* for real browsers */
  pointer-events: none;
}

.hidden { display: none; }
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>

  <div>
    <input type="text">
    <select name="" id=""></select>
    <input type="checkbox">
  </div>
  <div>
    <input type="text">
    <select name="" id=""></select>
    <input type="checkbox">
  </div>
  <div>
    <input type="text">
    <select name="" id=""></select>
    <input type="checkbox">
  </div>
  <div>
    <input type="submit" disabled>
  </div>
  
  <input type="button" value="Hide" class="btn-hide">
  <input type="button" value="Show" class="btn-show">
  <div class="dimmer hidden"></div>
  <script src="https://code.jquery.com/jquery-2.2.4.js"></script>
</body>
</html>


0
#bg {
   background-color: gray;
   opacity: 0.6;
   position: absolute;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   z-index: 99998;
}
#hole {
   position: fixed;
   top: 100px;
   left: 100px;
   width: 100px;
   height: 100px;
   z-index: 99999;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.