海信彩屏线控器展会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.
 
 
 
 
 

279 lines
8.2 KiB

<!-- 智慧模式 -->
<template>
<div class="smart-wrapper">
<div class="swiper swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide" v-for="(item, index) in modeList">
<div class="swiper-item">
{{ item.name }}
</div>
</div>
</div>
<div class="select-wrapper">
<img src="@/assets/imgs/device-detail/smart-mode/select@2x.png">
</div>
</div>
<!-- 底部 -->
<div class="smart-btm">
<div class="illustrate">
<img src="@/assets/imgs/device-detail/smart-mode/illustrate@2x.png">
</div>
<div class="switch-btn-container">
<div class="switch-btn" @click="changeSwitch()">
<img :src="getImgSrc(onOffImg)" alt="">
</div>
<div class="btn-text">开关</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, toRefs, onMounted, onActivated, nextTick } from 'vue';
import { Swiper, Navigation, Pagination } from "swiper";
import "swiper/swiper-bundle.css";
import { SmartModeEnum } from './enmu/smart-mode';
import { $commonService } from '@/services/framework/dependency-injection-service';
const getImgSrc = $commonService.$imgService.getImgSrc;
let mySwiper: Swiper; // 声明swiper
/** 智慧模式数组 */
const modeList = ref<any[]>([
{
id: SmartModeEnum.COLD,
name: '偏冷' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_cold@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_cold@2x.png'
},
{
id: SmartModeEnum.COOL,
name: '凉爽' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_cool@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_cool@2x.png'
},
{
id: SmartModeEnum.COMFORT,
name: '舒适' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_comfort@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_comfort@2x.png'
},
{
id: SmartModeEnum.WARM,
name: '温暖' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_warm@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_warm@2x.png'
},
{
id: SmartModeEnum.HOT,
name: '偏热' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_hot@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_hot@2x.png'
},
{
id: SmartModeEnum.COLD,
name: '偏冷' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_cold@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_cold@2x.png'
},
{
id: SmartModeEnum.COOL,
name: '凉爽' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_cool@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_cool@2x.png'
},
{
id: SmartModeEnum.COMFORT,
name: '舒适' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_comfort@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_comfort@2x.png'
},
{
id: SmartModeEnum.WARM,
name: '温暖' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_warm@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_warm@2x.png'
},
{
id: SmartModeEnum.HOT,
name: '偏热' ,
bgImg: '/assets/imgs/device-detail/smart-mode/smart_bg_hot@2x.png',
onOffImg: '/assets/imgs/device-detail/smart-mode/switch_hot@2x.png'
},
])
/** 传参 */
const props = defineProps<{
/** 开关机状态 */
ifRun: boolean;
/** 当前智慧模式 */
mode: number;
}>()
const { ifRun, mode } = toRefs(props);
/** 开关机状态 */
const onOff = ref(ifRun);
/** 开关机图片 */
const onOffImg = ref('');
/** 当前的智慧模式 */
const smartMode = ref(mode);
/** 向父组件传递事件 */
const emit = defineEmits(['changeBg', 'changeSwitch', 'changeSmartMode']);
onMounted(() => {
initSwiper();
// 获取开关机状态图片
getShowImg();
})
/** 初始化swiper */
const initSwiper = () => {
const currentModeIndex = modeList.value.findIndex(item => item.id === smartMode.value);
console.log('smartMode.value', smartMode.value)
console.log('currentModeIndex', currentModeIndex)
mySwiper = new Swiper('.swiper', {
loop: true, // 循环模式选项
slidesPerView: 5, // slide可展示的数量
centeredSlides: true,
observer: true,
observeParents: true,
initialSlide: currentModeIndex, // 初始时展示的位置
on: {
touchStart: () => {
},
touchMove: () => {
},
slideChangeTransitionEnd: () => {
mySwiper && emit("changeSmartMode", modeList.value[mySwiper.realIndex].id);
nextTick(() => {
getShowImg();
})
},
}
})
}
/** 获取展示的背景 */
const getShowImg = () => {
if (onOff.value) {
const smartModeData = modeList.value.find(item => item.id === smartMode.value);
// 获取开关机状态图片
onOffImg.value = smartModeData.onOffImg;
// 向父组件发送事件,展示背景图
emit('changeBg', smartModeData.bgImg);
} else {
// 获取开关机状态图片
onOffImg.value = "/assets/imgs/device-detail/smart-mode/switch_shutdown@2x.png";
// 向父组件发送事件,展示背景图
emit('changeBg', "/assets/imgs/device-detail/smart-mode/smart_bg_shutdown@2x.png");
}
}
/** 开关切换 */
const changeSwitch = () => {
emit('changeSwitch', !onOff.value);
nextTick(() => {
getShowImg();
})
}
</script>
<style lang="scss" scoped>
.smart-wrapper {
width: 100%;
height: 100%;
position: relative;
.swiper-container {
position: relative;
width: 100%;
height: 426px;
.select-wrapper {
position: absolute;
width: 212px;
height: 416px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
img {
width: 100%;
}
}
}
.swiper-slide {
text-align: center;
display: flex;
justify-content: center;
align-items: center;
transition: 300ms;
transform: scale(0.6);
color: rgba($color: #FFF, $alpha: .2);
}
.swiper-slide-active,.swiper-slide-duplicate-active{
transform: scale(1);
color: rgba($color: #FFF, $alpha: .7);
}
.swiper-slide-prev, .swiper-slide-next {
transform: scale(0.8);
color: rgba($color: #FFF, $alpha: .4);
}
.swiper-item {
font-size: 60px;
width: 65px;
text-align: center;
}
.smart-btm {
width: 100%;
position: absolute;
left: 0;
bottom: 70px;
display: flex;
align-items: center;
justify-content: space-between;
z-index: 99;
.illustrate {
margin-left: 91px;
width: 56px;
height: 56px;
img {
width: 100%;
height: 100%;
}
}
.switch-btn-container {
margin-right: 64px;
position: relative;
.switch-btn {
width: 110px;
height: 110px;
border-radius: 50%;
background: url('@/assets/imgs/device-detail/smart-mode/circle-bg@2x.png') no-repeat;
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: center;
img {
width: 56px;
}
}
.btn-text {
position: absolute;
color: #FFF;
font-size: 28px;
width: 100%;
text-align: center;
margin-top: 20px;
}
}
}
}
</style>