Files

257 lines
6.3 KiB
Vue
Raw Normal View History

2022-08-30 10:36:30 +08:00
<template>
2022-10-01 09:12:01 +08:00
<div v-loading="loading" class="fullPage" ref="fullPageRef">
2022-10-13 17:42:32 +08:00
<div class="indicator">
<div
:class="`${state.fullpage.current == idx ? 'active' : ''}`"
v-for="idx in len"
:key="idx"
:id="idx.toString()"
class="point"
@click="handleIndicatorClick(idx)"
></div>
</div>
2022-10-01 09:12:01 +08:00
<div
class="fullPageContainer"
:data-index="state.fullpage.current"
ref="fullPageContainerRef"
@mousewheel="mouseWheelHandle"
>
<!-- @DOMMouseScroll="mouseWheelHandle" -->
<div
2022-09-20 17:31:39 +08:00
v-for="(item, $index) in state.boxList"
class="section"
:key="$index"
:style="`z-index: ${item.zIndex};`"
>
2022-10-13 17:42:32 +08:00
<!-- v-if="`index${state.fullpage.current}` == item.title" -->
<component
v-if="Math.abs(state.fullpage.current - ($index + 1)) <= 1"
:is="item.comp"
></component>
2022-10-01 09:12:01 +08:00
</div>
2022-09-20 17:31:39 +08:00
</div>
2022-08-30 10:36:30 +08:00
</div>
2022-09-20 17:31:39 +08:00
<!-- <div class="home">
<transition-group
:enter-active-class="state.animate.in"
:leave-active-class="state.animate.out"
>
<div
v-for="(item, $index) in state.boxList"
class="box"
:key="$index"
:style="`z-index: ${item.zIndex};`"
v-show="state.showBox === $index"
>
<component :is="item.comp"></component>
</div>
</transition-group>
</div>-->
2022-08-30 10:36:30 +08:00
</template>
2022-09-20 17:31:39 +08:00
2022-10-19 00:22:39 +08:00
<script setup>
2022-10-13 17:42:32 +08:00
import {
reactive,
onMounted,
ref,
shallowRef,
onUnmounted,
computed,
} from "vue";
2022-09-20 17:31:39 +08:00
import index1 from "./comp/index1.vue";
import index2 from "./comp/index2.vue";
import index3 from "./comp/index3.vue";
import index4 from "./comp/index4.vue";
import index5 from "./comp/index5.vue";
import index6 from "./comp/index6.vue";
import index7 from "./comp/index7.vue";
import index8 from "./comp/index8.vue";
2022-10-19 00:22:39 +08:00
const loading = ref(true);
2022-09-20 17:31:39 +08:00
setTimeout(() => {
loading.value = false;
2022-10-01 09:12:01 +08:00
}, 500);
const fullPageRef = ref();
const fullPageContainerRef = ref();
onMounted(() => {
fullPageContainerRef.value.addEventListener(
"DOMMouseScroll",
mouseWheelHandle
);
});
// onUnmounted(() => {
// fullPageContainerRef.value.clearEventListener(
// "DOMMouseScroll",
// mouseWheelHandle
// );
// console.log("cleard");
// });
2022-10-13 17:42:32 +08:00
const len = computed(() => state.boxList.length);
// const len = ref(6);
2022-10-01 09:12:01 +08:00
const next = () => {
2022-09-20 17:31:39 +08:00
// 往下切换
2022-10-01 09:12:01 +08:00
// TODO:
2022-10-13 17:42:32 +08:00
// let len = 6; // 页面的个数
if (state.fullpage.current + 1 <= len.value) {
2022-09-20 17:31:39 +08:00
// 如果当前页面编号+1 小于总个数,则可以执行向下滑动
state.fullpage.current += 1; // 页面+1
move(state.fullpage.current); // 执行切换
}
2022-10-01 09:12:01 +08:00
};
const pre = () => {
2022-09-20 17:31:39 +08:00
// 往上切换
if (state.fullpage.current - 1 > 0) {
// 如果当前页面编号-1 大于0则可以执行向下滑动
state.fullpage.current -= 1; // 页面+1
move(state.fullpage.current); // 执行切换
}
2022-10-01 09:12:01 +08:00
};
2022-10-19 00:22:39 +08:00
function move(index) {
2022-09-20 17:31:39 +08:00
state.fullpage.isScrolling = true; // 为了防止滚动多页,需要通过一个变量来控制是否滚动
directToMove(index); //执行滚动
setTimeout(() => {
//这里的动画是1s执行完使用setTimeout延迟1s后解锁
state.fullpage.isScrolling = false;
}, 1010);
}
2022-10-19 00:22:39 +08:00
function directToMove(index) {
2022-10-01 09:12:01 +08:00
let height = fullPageRef.value["clientHeight"]; //获取屏幕的宽度
// let scrollPage = proxy.$refs["fullPageContainer"]; // 获取执行tarnsform的元素
2022-10-19 00:22:39 +08:00
let scrollHeight; // 计算滚动的告诉,是往上滚还往下滚
2022-09-20 17:31:39 +08:00
scrollHeight = -(index - 1) * height + "px";
2022-10-01 09:12:01 +08:00
fullPageContainerRef.value.style.transform = `translateY(${scrollHeight})`;
2022-09-20 17:31:39 +08:00
state.fullpage.current = index;
}
function mouseWheelHandle(event) {
// 监听鼠标监听
// 添加冒泡阻止
let evt = event || window.event;
if (evt.stopPropagation) {
evt.stopPropagation();
} else {
evt.returnValue = false;
}
if (state.fullpage.isScrolling) {
// 判断是否可以滚动
return false;
}
let e = event.originalEvent || event;
state.fullpage.deltaY = e.deltaY || e.detail; // Firefox使用detail
if (state.fullpage.deltaY > 0) {
next();
} else if (state.fullpage.deltaY < 0) {
pre();
}
}
let state = reactive({
fullpage: {
current: 1, // 当前的页面编号
isScrolling: false, // 是否在滚动,是为了防止滚动多页,需要通过一个变量来控制是否滚动
deltaY: 0, // 返回鼠标滚轮的垂直滚动量保存的鼠标滚动事件的deleteY,用来判断是往下还是往上滚
},
showBox: 0,
boxList: [
2022-10-13 17:42:32 +08:00
{
comp: shallowRef(index1),
zIndex: 1,
title: "index1",
},
2022-10-01 09:12:01 +08:00
// {
// comp: shallowRef(index2),
// zIndex: 1,
// title: "index2",
// },
2022-09-20 17:31:39 +08:00
{
2022-10-01 09:12:01 +08:00
comp: shallowRef(index3),
2022-09-20 17:31:39 +08:00
zIndex: 1,
title: "index3",
},
2022-10-19 00:22:39 +08:00
// {
// comp: shallowRef(index4),
// zIndex: 1,
// title: "index4",
// },
2022-09-20 17:31:39 +08:00
{
2022-10-01 09:12:01 +08:00
comp: shallowRef(index5),
2022-09-20 17:31:39 +08:00
zIndex: 1,
title: "index5",
},
{
2022-10-01 09:12:01 +08:00
comp: shallowRef(index6),
2022-09-20 17:31:39 +08:00
zIndex: 1,
title: "index6",
},
{
2022-10-01 09:12:01 +08:00
comp: shallowRef(index7),
2022-09-20 17:31:39 +08:00
zIndex: 1,
title: "index7",
},
{
2022-10-01 09:12:01 +08:00
comp: shallowRef(index8),
2022-09-20 17:31:39 +08:00
zIndex: 1,
title: "index8",
},
],
animate: {
in: "animate__animated animate__fadeInDown",
out: "animate__animated animate__fadeOutDown",
},
});
2022-10-13 17:42:32 +08:00
// 点击 indicator 时
2022-10-19 00:22:39 +08:00
const handleIndicatorClick = (idx) => {
2022-10-13 17:42:32 +08:00
if (idx == state.fullpage.current) {
return;
} else if (idx > state.fullpage.current) {
for (let i = state.fullpage.current; i < idx; i++) {
next();
}
} else {
for (let i = state.fullpage.current; i > idx; i--) {
pre();
}
}
};
2022-10-01 09:12:01 +08:00
</script>
2022-09-20 17:31:39 +08:00
<style lang="scss" scoped>
.fullPage {
width: 100%;
height: 100%;
overflow: hidden;
2022-10-13 17:42:32 +08:00
position: relative;
.indicator {
position: absolute;
top: 50%;
right: 20px;
z-index: 999;
transform: translateY(-50%);
.point {
transition: all 1s;
width: 12px;
height: 12px;
background-color: #999;
border-radius: 50%;
&.active {
background-color: #0054ff;
}
&:not(:last-child) {
margin-bottom: 6px;
}
}
}
2022-09-20 17:31:39 +08:00
}
.fullPageContainer {
width: 100%;
height: 100%;
transition: all linear 0.5s;
}
.section {
width: 100%;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
}
</style>