質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

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

Q&A

解決済

1回答

3179閲覧

Vue.js カスタムディレクティブ(スクロール処理)について

okpk

総合スコア38

Vue.js

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

0グッド

1クリップ

投稿2018/12/04 10:42

編集2018/12/04 11:23

カスタムディレクティブ(スクロール処理)の使い方について質問です。

ふわっと出現させたい要素にそれぞれv-scrollを付与しそれぞれのタイミングでcss等が付与される処理を作りたく公式ドキュメントを触って見たのですが(https://jp.vuejs.org/v2/cookbook/creating-custom-scroll-directives)、
一番上に付与したv-scroll要素が判定に入るたびに全ての要素にcssが付与されてしまいます。

各要素それぞれのタイミングでcssを付与するにはどのように書けば良いのでしょうか。

scrolljs

1import Vue from 'vue' 2 3Vue.directive('scroll', { 4 inserted: function (el, binding) { 5 let f = function (evt) { 6 if (binding.value(evt, el)) { 7 window.removeEventListener('scroll', f) 8 } 9 } 10 window.addEventListener('scroll', f) 11 } 12})

各p要素には上下にmargin100px程度あるとします。
現時点でhoge1にスクロールしたタイミングでhoge4まで全てcssが適用されるので、これを各々のタイミングで処理したいです。

indexVue

1<template> 2 <div> 3 <p v-scroll="handleScroll">hoge1</p> 4 <p v-scroll="handleScroll">hoge2</p> 5 <p v-scroll="handleScroll">hoge3</p> 6 <p v-scroll="handleScroll">hoge4</p> 7 </div> 8</template> 9<script> 10 export default { 11 methods: { 12 handleScroll: function (evt, el) { 13 if (window.scrollY > 50) { 14 el.setAttribute( 15 'style', 16 'opacity: 1; transform: translate3d(0, -10px, 0)' 17 ) 18 } 19 return window.scrollY > 100 20 } 21 } 22 } 23</script>

nuxt.config.jsでpluginとして読み込んでいます。

nuxtconfigjs

1plugins:[ 2 '~plugins/scroll.js' 3]

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

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

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

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

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

okpk

2018/12/04 11:10

アドバイスありがとうございます。取り急ぎコードの追記をさせて頂きました。
guest

回答1

0

ベストアンサー

スタイルを変更する判定部分が、静的な値になっていることが原因です。handleScroll()はスクロールのたびに4回呼ばれますが、window.scrollY > 50を満たした時点で4つ全ての要素のスタイルが変更されます。

要素のY座標に基づいてスタイル変更の条件を設定するようにすれば解決します。

簡易的なものですが、サンプルを用意したので、確認してみてください。
jQueryを使えるかわからなかったので、ただのJavaScriptで要素のY座標を取得するようにしています。

投稿2018/12/04 11:59

NozomuIkuta

総合スコア1260

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

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

okpk

2018/12/05 02:59

サンプルまで用意して回答して頂きありがとうございます。 50のような数値でなく各要素のtop値を取得しそれを条件にすれば各々のタイミングに切り替わるのですね。 理想の挙動になりました。
NozomuIkuta

2018/12/05 04:38

解決したようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問