海信彩屏线控器展会demo项目,20230515
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

150 lines
4.0 KiB

<template>
<div id="tabs-wrapper">
<!-- 下拉 -->
<div
class="drop-down-menu"
@touchstart="dropDownMenuStart($event)"
@touchmove="dropDownMenuMove($event)"
@touchend="dropDownMenuEnd($event)">
</div>
<DropDownMenu id="menu" v-show="showMenu" ref="menu" @pull-up="pullUp()"></DropDownMenu>
<div class="swiper">
<div class="swiper-wrapper" @touchstart.self>
<div class="swiper-slide">
<div class="swiper-item">
<div><FixedTime></FixedTime></div>
</div>
</div>
<div class="swiper-slide">
<div class="swiper-item">
<div><HomeScreen></HomeScreen></div>
</div>
</div>
<div class="swiper-slide">
<div class="swiper-item">
<div><DeviceControl></DeviceControl></div>
</div>
</div>
<div class="swiper-slide">
<div class="swiper-item">
<div><Scene></Scene></div>
</div>
</div>
</div>
<div class="swiper-pagination"></div>
</div>
</div>
</template>
<script lang="ts" setup>
import {
ref,
onBeforeMount,
onMounted,
nextTick,
} from 'vue';
import { Swiper, Navigation, Pagination } from "swiper";
import FixedTime from './fixed-time.vue';
import HomeScreen from './home-screen.vue';
import DeviceControl from './device-control.vue';
import Scene from './scene.vue';
import DropDownMenu from '../drop-down-menu/drop-down-menu.vue';
import "swiper/swiper-bundle.css";
let mySwiper: Swiper; // 声明swiper
const touchStart = ref(0);
const touchDis = ref(0);
/** 是否展示菜单 */
const showMenu = ref(false);
const menuDom: any = ref();
onMounted(() => {
initSwiper();
menuDom.value = document.getElementById('menu') as HTMLElement | null;
})
/** 初始化swiper */
const initSwiper = () => {
mySwiper = new Swiper(".swiper", {
modules: [Navigation, Pagination],
// observer: true, // 修改swiper自己或子元素时,自动初始化swiper
// observeParents: true, // 修改swiper的父元素时,自动初始化swiper
pagination: {
el: ".swiper-pagination",
}, //分页样式
touchStartPreventDefault : false,
effect: "fade", //轮播图切换效果的类型
resistanceRatio: 0,
});
}
/** 下拉菜单开始 */
const dropDownMenuStart = (event: any) => {
touchStart.value = 0;
touchDis.value = 0;
touchStart.value = event.targetTouches[0].pageY;
}
/** 下拉菜单移动 */
const dropDownMenuMove = (event: any) => {
// 顶部上下拖拽
let touchPos = event.targetTouches[0].pageY;
touchDis.value = touchPos - touchStart.value;
if (document.documentElement.scrollTop === 0 && touchDis.value > 0) {
showMenu.value = true;
if (menuDom.value) {
const top = (-(window.innerHeight) + touchDis.value) > 0? 0: (-(window.innerHeight) + touchDis.value);
menuDom.value.style.top = `${top}px`;
}
} else {
showMenu.value = false;
}
}
/** 下拉菜单结束 */
const dropDownMenuEnd = (event: any) => {
if (touchDis.value > 0) {
if (menuDom.value) {
menuDom.value.style.transition = `${(window.innerHeight - touchDis.value) / (window.innerHeight)}s`;
menuDom.value.style.top = '0';
}
}
}
/** 点击收起菜单 */
const pullUp = () => {
if (menuDom.value && (menuDom.value.style.top === '0px' || menuDom.value.style.top === '0')) {
menuDom.value.style.top = '-100vh';
menuDom.value.style.transition = '0.5s';
// 0.5s动画时间。等时间过去隐藏
setTimeout(() => {
showMenu.value = false;
menuDom.value.style.transition = '0s';
}, 500);
}
}
</script>
<style lang="scss" scoped>
#tabs-wrapper {
width: 100vw;
height: 100vh;
position: relative;
-webkit-overflow-scrolling: touch;
.drop-down-menu {
width: 100vw;
height: 40px;
position: fixed;
top: 0;
left: 0;
z-index: 999;
}
#menu {
position: absolute;
top: -100vh;
z-index: 999;
}
}
</style>