12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vue.jsで実装するシンプルな吹き出し

Last updated at Posted at 2018-10-05

inputやtextareaの入力中に、ちょっとした入力ヒントを出したい時があります。
そんな時に便利な、focusで出る吹き出しをVue.jsで実装します。

実装デモ

See the Pen Input Balloon by Vue.js - flow3 by Shoko Oyamada (@chcltn) on CodePen.

吹き出しの実装の流れ

1. 単純な吹き出しをHTMLとCSSで作る
2. focusとblurでv-showを切り替える
3. 吹き出し内のリンクもクリック出来るようにする

##1.単純な吹き出しをHTMLとCSSで作る

ごく単純な吹き出しをHTMLとCSSで実装します。
ここではまだ吹き出しは最初から表示されており、focus時の動きはありません。

See the Pen Input Balloon by Vue.js - flow1 by Shoko Oyamada (@chcltn) on CodePen.

##2.focusとblurでv-showを切り替える

フラグとなる変数 isFocusedをdata内に作っておきます。
この変数を、inputにfocus/blurした時にtrue/falseで切り替わるようにします。

methodでそのisFocusedをtrueにするメソッドopenBalloonを作ります。
同様にfalseにするcloseBalloonも記述します。

この2つのメソッドを、HTML側で、inputのv-onディレクティブで呼び出すようにしています。
そして、input-balloonは、v-showでisFocusedがtrueのときのみ表示させるようにします。

See the Pen Input Balloon by Vue.js - flow2 by Shoko Oyamada (@chcltn) on CodePen.

(v-ifでも実装可能ですが、吹き出しは表示切り替え頻度が高いコンポーネントであることから、ここではv-showが良いでしょう)

##3.吹き出し内のリンクもクリック出来るようにする

正直なところ、上記だけであればVueで実装する必要はなく、CSSのみで作ることができます。input:focusのように擬似クラスを使います。

しかしながら実際のアプリケーション開発の現場では、この吹き出し内にリンクなど貼りたいことがあるでしょう。
以下では、リンクをクリックしても(つまり、blurしても)吹き出しが閉じないようにしています。

まず、HTML側ではbackdropというdivを用意します。
それをCSSでposition:fixedopacity:0に設定しましょう。
透明なため目には見えませんが、このbackdropは画面全体に描写されます。

先ほどinputのblurに設定したcloseBalloonというメソッドを、このbackdropに移動します。(同時に、blurでなくclickにします)
また、このbackdropもv-showでfocus時のみ現れるようにしておきます。

See the Pen Input Balloon by Vue.js - flow3 by Shoko Oyamada (@chcltn) on CodePen.

これで、ごくシンプルな吹き出しがVueで実装できました。
お疲れ様でした。

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?