前提・実現したいこと
画像遅延読み込み(v-lazy-image)を使用しているページでスムーズスクロールするページ内リンクを実装したいです。
発生している問題・エラーメッセージ
Vue.jsで画像遅延読み込み(v-lazy-image)を使用しているページでスムーズスクロール(vue-scrollto)でページ内リンクを実装すると、表示しきれない画像の分ずれてしまいました。
該当のソースコード
Vue
1<template> 2 <div> 3 <atom-button 4 tag="a" 5 v-scroll-to="'#sumple1'"> 6 <p>sumple1</p> 7 </atom-button> 8 <atom-button 9 tag="a" 10 v-scroll-to="'#sumple2'"> 11 <p>sumple2</p> 12 </atom-button> 13 <atom-button 14 tag="a" 15 v-scroll-to="'#sumple3'"> 16 <p>sumple3</p> 17 </atom-button> 18 <sumple1 id="sumple1" /> 19 <sumple2 id="sumple2" /> 20 <sumple3 id="sumple3" /> 21 </div> 22</template> 23 24<script> 25import AtomButton from ~ 26import Sumple1 from ~ 27import Sumple2 from ~ 28import Sumple3 from ~ 29 30export default { 31 name: 'Sumple', 32 components: { 33 'atom-button': AtomButton, 34 'sumple1': Sumple1, 35 'sumple2': Sumple2, 36 'sumple3': Sumple3 37 } 38} 39</script>
各Sumple内に
Vue
1<figure> 2 <v-lazy-image 3 :src="require('@sumple.png')" /> 4</figure>
のようなv-lazy-imageを使用した画像があります。
[補足]AtomButtonはリンクボタンのコンポーネントです。
Vue
1<template> 2 <atom-link 3 :to="to" 4 :tag="tag" 5 class="button" 6 :class="classObject"> 7 <span> 8 <slot /> 9 </span> 10 </atom-link> 11</template> 12 13<script> 14import Link from '@/components/atoms/Link' 15export default { 16 name: 'AtomButton', 17 components: { 18 'atom-link': Link 19 }, 20 props: { 21 to: { 22 type: String, 23 default: null 24 }, 25 tag: { 26 type: String, 27 default: null 28 }, 29 classObject: { 30 type: [String, Array, Object], 31 default: null 32 } 33 } 34} 35</script>
ここで使っているコンポーネントLinkの中身は下記の通りです。
Vue
1<template> 2 <component 3 :is="element" 4 v-bind="{ [attribute]: to }"> 5 <slot /> 6 </component> 7</template> 8 9<script> 10export default { 11 name: 'Link', 12 props: { 13 to: { 14 type: String, 15 default: null 16 }, 17 tag: { 18 type: String, 19 default: null 20 } 21 }, 22 data: () => ({ 23 element: 'div', 24 attribute: null 25 }), 26 mounted () { 27 this.element = this.checkElement() 28 this.attribute = this.checkAttribute() 29 }, 30 methods: { 31 checkElement () { 32 if (this.tag) return this.tag 33 if (!this.to) return 'div' 34 if (this.to.startsWith('http')) return 'a' 35 if (this.to.startsWith('/static') || this.to.startsWith('/assets')) return 'a' 36 return 'router-link' 37 }, 38 checkAttribute () { 39 if (this.element === 'a') return 'href' 40 if (this.element === 'router-link') return 'to' 41 } 42 } 43} 44</script> 45 46<style lang="scss" scoped> 47</style> 48
試したこと
調べているとそもそも画像遅延読み込みとスムーズスクロールの相性が悪いということはなんとなくわかりました。
https://kaiteki-chokin.com/anchor-link-lazy-loading/
にたどり着き、これならいけるかなと思いましたが、
書き方が悪いのかスクロールしない普通のリンクになってしまいました。
Vue
1<template> 2 <div> 3 <atom-button 4 tag="a" 5 to="#sumple1"> 6 <p>sumple1</p> 7 </atom-button> 8 <atom-button 9 tag="a" 10 to="#sumple2"> 11 <p>sumple2</p> 12 </atom-button> 13 <atom-button 14 tag="a" 15 to="#sumple3"> 16 <p>sumple3</p> 17 </atom-button> 18 <sumple1 id="sumple1" /> 19 <sumple2 id="sumple2" /> 20 <sumple3 id="sumple3" /> 21 </div> 22</template> 23 24<script> 25import $ from 'jquery' 26import AtomButton from ~ 27import Sumple1 from ~ 28import Sumple2 from ~ 29import Sumple3 from ~ 30 31export default { 32 name: 'Sumple', 33 components: { 34 'atom-button': AtomButton, 35 'sumple1': Sumple1, 36 'sumple2': Sumple2, 37 'sumple3': Sumple3 38 }, 39 mounted: { 40 function() { 41 this.$nextTick(function () { 42 $('a[href^="#"]').click(function(e) { 43 const href = $(this).attr("href"); 44 const target = $(href == "#" || href == "" ? 'html' : href); 45 const position = target.offset().top; 46 $.when( 47 $("html, body").animate({ 48 scrollTop: position 49 }, 500, "swing"), 50 e.preventDefault(), 51 ).done(function() { 52 const diff = target.offset().top; 53 if (diff === position) { 54 } else { 55 $("html, body").animate({ 56 scrollTop: diff 57 }, 10, "swing"); 58 } 59 }); 60 }); 61 }) 62 } 63 } 64} 65</script>
補足情報(FW/ツールのバージョンなど)
コードの意味を理解できていないまま書いている部分もあるため、
要領を得ない質問になりすみません。
足りない情報がありましたらお申し付けください。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/01 07:42
2020/10/01 07:48
2020/10/01 08:04 編集