[Vue 3]を使用してイベントのタイトルをスクロール
12890 ワード
従来学習したアクティビティThrottleとスクロールイベントを用いて,スクロール方向に基づいてタイトルをどのように表示するかを決定する論理を実現した.
既存のWebプロジェクトに機能を追加しました.
プロジェクト環境と実施方法
既存のWebプロジェクトに機能を追加しました.
プロジェクト環境と実施方法
VUE 3、アプリケーションを使用しています.vueにはHeader素子やrouter-viewなどがあります.
機能を追加します.vueとHeadervueのみ修正しました. src
- App.vue
- views
- ...
- component
- ...
- Header.vue
アプリケーションにマウントした後、スクロールイベントハンドラでスクロール方向を求め、方向に関する情報をHeader素子に渡すpropsを実現し、Header素子をどのように表示するかを決定します.
Headerでは一度に実装できますが、propsを渡す例を作成したいので実装します.
VUE 3 Throttle+Scroll Event Handlerの実装
イベント書き込みボックスは、イベントハンドラの実行を制限することでパフォーマンスを向上させます(?)これはできる技法です.あまりハンドルを動かす必要はないと思うので、1 s、500 ms、300 ms、100 ms、最も満足した動作の100 msに設定します. // App.vue
export default {
setup(){
// 스크롤 방향 정보
const scrollDirection = ref(0); // 1: up, -1 : down
// Throttle을 위한 ref
const waiting = ref(false);
// 이전 스크롤 방향을 저장하기 위한 ref
const scrollTrace = ref(0);
// Throttle이 적용된 이벤트 핸들러
function scrollHandler(e){
if(!waiting.value){
waiting.value = true; // throttle check
const currentScroll = window.scrollY; // current scrollY
// scroll down = -1
if(currentScroll > scrollTrace.value) scrollDirection.value = -1;
// scroll up = 1
else if(currentScroll < scrollTrace.value) scrollDirection.value = 1;
scrollTrace.value = currentScroll;
// Event Throttle 100 ms
setTimeout(()=>{
waiting.value = false;
}, 100);
}
}
onMounted(()=>{
// DOM이 마운트 되었을 때 이벤트 핸들러를 등록한다.
document.addEventListener('scroll',scrollHandler);
});
return {
scrollDirection
}
}
}
アクティビティのためにドラッグを掛け、スクロールが継続して発生しても100 ms周期でHandlerを実行できます.
現在のscrollyが以前のscrollyよりも現在の値が大きい場合は、下にスクロールしていることを示します.
反対の場合はスクロール中です.
PropsをHeader構成部品に渡す
<!--App.vue-->
<template>
<Header :scrollDirection="scrollDirection" />
</template>
App.vueからHeader素子まで、propsでスクロール方向に関する情報が伝達されます.
// Header.vue
export default{
props:{
scrollDirection:Number,
},
setup(props){
const headerShownClass=computed(()=>{
if(props.scrollDirection === -1) return 'header_off';
return '';
});
return {
headerShownClass
}
},
}
Headerコンポーネントでは、propsでscrollDirectionを受信し、タイトルの位置を調整するためのclassを入れるか除去するかを決定します.<template>
<header class="header" :class="headerShownClass">
...
</header>
</template>
<style scoped>
.header{
position:fixed;
top:0;
transition: top 0.2s ease-in-out;
height: var(--size-header);
...
}
.header_off{
top: calc(-1 * var(--size-header));
}
</style>
refを使用してclassListに直接追加する方法もありますが、vueでは計算属性を使用してクラスをバインドする方が便利です.
整理する
インターンシップの際にウェブページを作成し、移動環境を考慮するため、頭が固定された位置が思ったより多くのスペースを占有しているため、コンテンツ表示の領域が大幅に減少している.
スクロール方向を検出する過程で、頭を隠すユーザー体験がもっといいと思います.代表に話してみると、すぐに反映されました.
より詳細な条件を追加して適用できます.
Reference
この問題について([Vue 3]を使用してイベントのタイトルをスクロール), 我々は、より多くの情報をここで見つけました
https://velog.io/@dmstmdrbs/Vue3-scroll-이벤트에-따른-헤더-표시-with-Throttle
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
src
- App.vue
- views
- ...
- component
- ...
- Header.vue
// App.vue
export default {
setup(){
// 스크롤 방향 정보
const scrollDirection = ref(0); // 1: up, -1 : down
// Throttle을 위한 ref
const waiting = ref(false);
// 이전 스크롤 방향을 저장하기 위한 ref
const scrollTrace = ref(0);
// Throttle이 적용된 이벤트 핸들러
function scrollHandler(e){
if(!waiting.value){
waiting.value = true; // throttle check
const currentScroll = window.scrollY; // current scrollY
// scroll down = -1
if(currentScroll > scrollTrace.value) scrollDirection.value = -1;
// scroll up = 1
else if(currentScroll < scrollTrace.value) scrollDirection.value = 1;
scrollTrace.value = currentScroll;
// Event Throttle 100 ms
setTimeout(()=>{
waiting.value = false;
}, 100);
}
}
onMounted(()=>{
// DOM이 마운트 되었을 때 이벤트 핸들러를 등록한다.
document.addEventListener('scroll',scrollHandler);
});
return {
scrollDirection
}
}
}
<!--App.vue-->
<template>
<Header :scrollDirection="scrollDirection" />
</template>
// Header.vue
export default{
props:{
scrollDirection:Number,
},
setup(props){
const headerShownClass=computed(()=>{
if(props.scrollDirection === -1) return 'header_off';
return '';
});
return {
headerShownClass
}
},
}
<template>
<header class="header" :class="headerShownClass">
...
</header>
</template>
<style scoped>
.header{
position:fixed;
top:0;
transition: top 0.2s ease-in-out;
height: var(--size-header);
...
}
.header_off{
top: calc(-1 * var(--size-header));
}
</style>
インターンシップの際にウェブページを作成し、移動環境を考慮するため、頭が固定された位置が思ったより多くのスペースを占有しているため、コンテンツ表示の領域が大幅に減少している.
スクロール方向を検出する過程で、頭を隠すユーザー体験がもっといいと思います.代表に話してみると、すぐに反映されました.
より詳細な条件を追加して適用できます.
Reference
この問題について([Vue 3]を使用してイベントのタイトルをスクロール), 我々は、より多くの情報をここで見つけました https://velog.io/@dmstmdrbs/Vue3-scroll-이벤트에-따른-헤더-표시-with-Throttleテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol