Reveal.jsでプレゼン画面にスポットライトを浴びせるよ

# やりたいこと
logicoolの「[SPOTLIGHT](https://www.logicool.co.jp/ja-jp/product/spotlight-presentation-remote/page/spotlight-features)」を知っているかな？　レーザーポインタのようだけど、プレゼン画面の任意の箇所をソフトウェア的にスポットライトを浴びせることができるクールなガジェットなんだ。これを使えばプレゼンの内容に関係なく注目を集めることは間違いなし！
ただ、少々お値段がはるので、普段あまりプレゼンをしない人にとっては購入が難しいよね。
けど、Reveal.jsなら、同じことがデキるんだ。こんなふうにね！
<img src="https://qiita-image-store.s3.amazonaws.com/0/160451/ebac7915-fd63-a3ec-91c2-347c05c52ff3.gif" width=70%>

# やり方
JavaScrptでスポットライトを当てるCodePenの[こちらの投稿](https://codepen.io/kensnyder/pen/lfGiI)を参考にするよ。そのままでは、背景が不透過だったり、スポットライトのオンオフができなかったりするので、少々手を加えるよ。

## 仕組み
手を加えるために、CodePenの例ではどのようにスポットライトが実現されているのか見てみたよ。まず、明るく照らされている部分は、背景を円形グラデーションで塗る「[radial-gradient](http://www.htmq.com/css3/radial-gradient.shtml)」で、中心に透明色を指定し、周囲に黒を指定したdivをJavaScriptでマウスに追従させることで実現しているようだ。ここまでは予想通りだよ。具体的には下のコードの部分だよ。

```css
.spotlight.on {
background: -webkit-radial-gradient(center, ellipse cover,  rgba(0,0,0,0) 0%,rgba(0,0,0,0) 50%,rgba(0,0,0,1) 60%,rgba(0,0,0,1) 100%);
}
```

でも、この仕組みだけだと、div以外の箇所が下の図みたいに丸見えだね・・。
<img src="https://qiita-image-store.s3.amazonaws.com/0/160451/43adad0d-fa79-8659-807e-942bc23eb504.png" width=40%>
そこで、divの枠(border)を思いっきり太く描くことで、divの外側も黒で隠しているみたいだ。これを思いついたひとはスゴイね:clap:

```css
.searchlight {
    border-width: 100vh 100vw !important;
}
```

試しに、枠を緑色にすると下のような感じだ。わかりやすいね。
<img src="https://qiita-image-store.s3.amazonaws.com/0/160451/4c0c71f0-64c9-2dda-69a0-59ee8d741404.png" width=40%>

## 手を加える
仕組みがわかったら、多少の修正は簡単だね。やりかたの結果だけ書いておくよ。まずはCSSだ。themeで読み込むCSS(`solarized.css`とか)の最後にでも追記するよ。

```css
.searchlight {
    position: absolute !important;
    z-index: 100 !important;
    height: 300px !important;
    width: 300px !important;
    border-width: 100vh 100vw !important;
    border-style: solid !important;
    border-color: rgba(0, 255, 0, 0.7) !important;
    top: -100vh !important;
    left: -100vw !important;
    background: #000 !important;
    -moz-box-sizing: content-box !important;
    -webkit-box-sizing: content-box !important;
    -ms-box-sizing: content-box !important;
    box-sizing: content-box !important;
    transition: opacity 500ms;
    opacity: 0;
}

.searchlight.on {
    background: -webkit-radial-gradient(center, ellipse cover,
    rgba(0,0,0,0) 0%,rgba(0,0,0,0) 59%,rgba(0,0,0,0.7) 60%,rgba(0,0,0,0.7) 100%) !important; /* Chrome10+,Safari5.1+ */
    background-repeat: no-repeat !important;
}
```

次はJavaScriptだ。Gistにコードをあげたので、index.htmlで下記を読み込めばOKだよ。久々にJQueryも使ったよ。

```html
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script src="https://gist.github.com/vimyum/d0c01a508b448da888b41084a0975db0.js"></script>
```

一応、コードも書いておくね。

```js
var toggle = false;
$('.searchlight')
    .on('mousemove', function(event) {
        $(this).addClass('on').css({'margin-left': event.pageX -150, 'margin-top': event.pageY -150});
    })          
    .on('mouseout', function(event) {
        $(this).removeClass('on');
    })
    .on('click', function() {
        if (toggle) {
            $(this).css('opacity', '0').css('cursor', 'auto');
        } else {
            $(this).css('opacity', '1').css('cursor', 'none');;
        }
        toggle = !toggle;
    });
```

あとは、Reveal.jsの`section`内に`searchlight`クラスをもつ要素を配置すればOKだ。

```html
 <section>
     <h3>それ、Reveal.jsでできるよ</h3>
     <div class="searchlight"></div>
</section>
```

以上！

[Reveal.jsシェル芸](http://qiita.com/vimyum/items/ab1732c84e473e23b83e)なんかと組み合わせればちょっと目を引くプレゼンができるかも :smirk: