🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1981閲覧

vue-click-outsideを実装し、ドロップダウンメニューを開き、 メニュー以外(リンク以外の場所)をクリックしたら非表示にするようにしたい。

TMTN

総合スコア53

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

ドロップダウンメニュー

GUIを操作するユーザーインターフェイスで、リストボックスに似ており、ユーザーがリストから値を選べるようにするものです。ドロップダウンのリストが非アクティブの場合は、単体の値を表示します。アクティブ化されると、ユーザーが選択可能な値のリスト一覧を表示(ドロップダウン)します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/03/30 05:16

【Vue.jsライブラリ】vue-click-outsideを実装したい!

下記、参考にさせていただきvue-click-outsideを実装し、ドロップダウンメニューを開き、
メニュー以外(リンク以外の場所)をクリックしたら非表示にするようにしたいです。

※現状は、クリックで表示・非表示のみです。。

【簡単】vue-click-outsideライブラリを使ってみた
枠外をクリックして閉じれるドロップダウンの実装

参考しにて実際に記述してみましたが、上手く実装されません・・
もし分かる方いらっしゃいましたらお力添えをいただきたいです。

勉強し始めたばかりなので至らぬ点が多いかとお思いますが、どこをどう直したら良いかご教授いただけると幸いです。
宜しくお願い致します。

html

1<template> 2 <header class="header"> 3 <router-link to="/" class="header-ttl"> 4 <span class="header-ttl-color">C</span>inema</router-link 5 > 6 <ul class="header-menu"> 7 <li> 8 <router-link to="/first" class="header-link">初めての方へ</router-link> 9 </li> 10 <li> 11 <router-link to="/signup" class="header-link" v-if="authenticatedUser" 12 >新規登録</router-link 13 > 14 </li> 15 <li> 16 <router-link to="/signin" class="header-link" v-if="authenticatedUser" 17 >ログイン</router-link 18 > 19 </li> 20 <li> 21 <span class="dropdown-menu" v-click-outside="close" @click="open"> 22 <a class="header-link" 23 >マイページ<span class="dropdown-arrow"></span 24 ></a> 25 <ul class="dropdown" :class="{ isOpen }"> 26 <li class="dropdown-items"> 27 <router-link to="/mypage" class="dropdown-link" 28 >マイページ</router-link 29 > 30 </li> 31 <li class="dropdown-items"> 32 <router-link to="/profile" class="dropdown-link" 33 >プロフィール編集</router-link 34 > 35 </li> 36 <li class="dropdown-items" v-if="authenticatedUserSignout"> 37 <button 38 class="dropdown-link" 39 @click="signOut" 40 v-if="authenticatedUserSignout" 41 > 42 ログアウト 43 </button> 44 </li> 45 </ul> 46 </span> 47 </li> 48 </ul> 49 </header> 50</template> 51 52

js

1<script> 2import firebase from "firebase"; 3import ClickOutside from "vue-click-outside"; 4 5export default { 6 name: "signOut", 7 data() { 8 return { 9 authenticatedUser: "", 10 authenticatedUserSignout: "", 11 isOpen: false, 12 }; 13 }, 14 methods: { 15 //ログアウトを実装 16 signOut: function() { 17 firebase 18 .auth() 19 .signOut() 20 .then(() => { 21 // alert("ログアウトしました。"); 22 this.$router.push("/signin"); 23 }) 24 .catch(() => { 25 // alert("ログアウトができません。"); 26 }); 27 }, 28 open: function() { 29 this.isOpen = !this.isOpen; 30 }, 31 }, 32 mounted() { 33 //以下、ユーザーが認証済みであれば「ログイン」と「新規登録」を非表示 34 firebase.auth().onAuthStateChanged((user) => { 35 if (user) { 36 this.authenticatedUser = false; 37 } else { 38 this.authenticatedUser = true; 39 } 40 }); 41 //以下、ユーザーが認証済みであれば「ログアウト」を表示 42 firebase.auth().onAuthStateChanged((user) => { 43 if (user) { 44 this.authenticatedUserSignout = true; 45 } else { 46 this.authenticatedUserSignout = false; 47 } 48 }); 49 this.popupItem = this.$el; 50 }, 51 //directivesオプションを使用することにより、ローカルディレクティブに登録されるため、機能を使える 52 directives: { 53 ClickOutside, 54 }, 55}; 56</script>

css

1<style lang="scss"> 2@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@1,500&display=swap"); 3 4.header { 5 position: sticky; 6 top: 0; 7 background-color: #000000; 8 padding: 1rem 3rem; 9 z-index: 999; 10 display: flex; 11 align-items: center; 12 &-ttl { 13 color: #fff; 14 font-size: 2rem; 15 font-weight: bold; 16 text-decoration: none; 17 background-color: transparent; 18 border: none; 19 outline: none; 20 font-family: "Roboto", sans-serif; 21 &-color { 22 color: grey; 23 font-size: 2.5rem; 24 } 25 } 26 &-menu { 27 display: flex; 28 margin-left: auto; 29 .dropdown-menu { 30 position: relative; 31 display: flex; 32 .dropdown-link { 33 color: #fff; 34 font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; 35 text-decoration: none; 36 background-color: transparent; 37 border: none; 38 outline: none; 39 font-size: 1rem; 40 font-weight: bold; 41 cursor: pointer; 42 cursor: hand; 43 &:hover { 44 color: grey; 45 } 46 } 47 } 48 } 49 &-link { 50 color: #fff; 51 font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; 52 text-decoration: none; 53 background-color: transparent; 54 border: none; 55 outline: none; 56 font-size: 1rem; 57 font-weight: bold; 58 cursor: pointer; 59 cursor: hand; 60 margin-left: 3rem; 61 &:not(:first-child) { 62 margin-left: 2rem; 63 } 64 &:hover { 65 color: #bbb; 66 } 67 } 68} 69 70.dropdown-arrow { 71 width: 0px; 72 height: 0px; 73 position: absolute; 74 top: 9px; 75 right: -20px; 76 border-left: 6px solid transparent; 77 border-right: 6px solid transparent; 78 border-top: 7px solid white; 79 .header-link:hover & { 80 border-top-color: #bbb; 81 } 82} 83 84.dropdown { 85 width: 10rem; 86 height: auto; 87 position: absolute; 88 top: 50px; 89 right: -47px; 90 display: none; 91 background-color: #000000; 92 &-items { 93 padding: 1rem; 94 border-bottom: 1px solid #fff; 95 } 96} 97 98.isOpen { 99 display: block; 100} 101 102a.header-ttl:hover, 103a.header-ttl:hover span { 104 color: #bbb; 105} 106</style>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

closeの記述漏れが発覚しました。訂正したら正常に実装できました。

投稿2021/03/30 11:09

TMTN

総合スコア53

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問