固定領域を除いて画面全体を暗くしますか?


88

ユーザーがクリックする場所を正確に案内するチュートリアルを作成したいと思います。私は、画面全体をカバーしようとしている<div>以外のすべての要素を暗くなる特定の地域固定でありwidthheighttopleft

問題は、親の "キャンセル"方法が見つからないことです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ライブラリの1つに興味があるかもしれません。彼らはいくつかの気の利いた機能を備えており、一回限りのcss効果の束を書く手間を省くでしょう。introjs.comまたはlinkedin.github.io/hopscotchをチェックしてください。
オクターン2017

2
これはlibの提案にすぎません:heelhook.github.io/chardin.js
オンラインThomas

回答:


125

1つだけでそれを実行し、それをdiv与えることができますbox-shadow

編集: @Nick Shvelidzeが指摘したように、追加を検討する必要がありますpointer-events: none

@Prinzhornが提案したvmax値を追加しましたbox-shadow

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>


28
pointer-events: noneその下の領域をクリック可能にする場合は、必ず追加してください。
Nick Shvelidze 2017

4
1,000pxでは十分ではないように見えます。これで画面がいっぱいにならない場合が多すぎるようです。
ESR 2017

1
@EdmundReedをニーズに合わせて調整できます:)
VilleKoo 2017

8
box-shadow: 0 0 0 100vmax rgba(0,0,0,.3);画面全体をカバーすることが保証されます
Prinzhorn 2017

2
@VilleKoo 1000px線の後ろに追加して、フォールバックとして保持できます
Prinzhorn

19

必要な穴があるパスで満たされたSVGを作成できます。しかし、クリックの処理方法を見つける必要があると思います。それらすべてがオーバーレイされたsvgをターゲットにしているからです。私document.getElementFromPointはここであなたを助けることができます。mdn


私はsvgを使用して休憩所を薄暗くするGoogleフィードバックフォームを考えています。
ドゥルガ2017

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

CSS プロパティを使用して、VilleKooの回答と同じことを実現できoutlineます。優れたブラウザサポートを備えています(IE8以降でも動作します)。アウトラインの構文はボーダーと同じですが、ボーダーとは異なり、スペースをとらないため、コンテンツの上に描画されます。

また、IE9のために、置き換えることができる+ 99999pxcalc(100 * (1vh + 1vw - 1vmin))

このアプローチの欠点は、のoutline影響を受けないことborder-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

@VilleKoo cssを使用した簡単なjQueryコードは次のとおりです

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.