Vue

by Alex Kyriakidis

HTML

<div id="app">
  <h2>Click Outside</h2>
  <div v-click-outside="clickedOutside" class="box">
    Here is some text
  </div>
</div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}

.box {
  border: 2px solid purple;
  width: 200px;
  height: 100px;
}

Vue

new Vue({
  el: "#app",
  data: {},
  directives: {
  	clickOutside: {
      bind (el, binding) {
        el.__ClickOutsideHandler__ = event => {
          if (!(el === event.target || el.contains(event.target))) {
            binding.value(event)
          }
        }
        document.body.addEventListener('click', el.__ClickOutsideHandler__)
      },
      unbind (el) {
        document.body.removeEventListener('click', el.__ClickOutsideHandler__)
      }
    }
  },
  methods: {
  	clickedOutside () {
    	alert('you clicked outside 👏')
    }
  }
})