Chcę stworzyć tutorial, który poprowadzi użytkownika dokładnie, gdzie kliknąć. Staram się pokryć cały ekran z <div>
którego będzie przyciemnić wszystkie elementy z wyjątkiem określonym regionie , który jest w stałym width
, height
, top
i left
.
Problem w tym, że nie mogę znaleźć sposobu na „anulowanie” rodzica background-color
(co również jest przezroczyste).
Na poniższym wycięciu hole
znajduje się div, który powinien być bez żadnego background-color
, w tym jego rodzica.
Czy można to w ogóle osiągnąć? Jakieś pomysły?
#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>
Oto przykładowy obraz tego, co próbuję osiągnąć:
javascript
jquery
html
css
Koby Douek
źródło
źródło
Odpowiedzi:
Możesz to zrobić tylko z jednym
div
i nadać mu plikbox-shadow
.EDYCJA: jak zauważył @Nick Shvelidze, powinieneś rozważyć dodanie
pointer-events: none
vmax
Wartość dodanabox-shadow
zgodnie z sugestią @Prinzhorndiv { 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>
źródło
pointer-events: none
jeśli chcesz, aby obszar pod nim był klikalny.box-shadow: 0 0 0 100vmax rgba(0,0,0,.3);
na pewno obejmie cały ekranMożesz utworzyć plik SVG wypełniony ścieżką z otworem w odpowiednim miejscu. Ale wydaje mi się, że musisz znaleźć sposób na obsługę kliknięć, ponieważ wszystkie z nich będą skierowane na nałożony plik SVG. I co
document.getElementFromPoint
może pomóc tutaj. mdnźródło
Można to również zrobić podobnie jak odpowiedź @ VilleKoo, ale z obramowaniem.
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>
źródło
Możesz osiągnąć to samo, co w odpowiedzi VilleKoo za pomocą
outline
właściwości CSS . Ma doskonałą obsługę przeglądarek (działa również w IE8 +). Kontury mają taką samą składnię jak obramowania, ale w przeciwieństwie do obramowań nie zajmują miejsca, są rysowane nad treścią.Również dla IE9 + można zastąpić
99999px
zcalc(100 * (1vh + 1vw - 1vmin))
.Wadą tego podejścia jest to, że
outline
nie ma na niego wpływuborder-radius
.Próbny:
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>
źródło
Oto prosty kod jQuery wykorzystujący @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>
źródło
#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; }
źródło