1 changed files with 284 additions and 0 deletions
@ -0,0 +1,284 @@ |
|||
<!-- 弹窗组件小龙开发所有 --> |
|||
<template> |
|||
<view> |
|||
<!-- 模态框 --> |
|||
<view @tap="Modal" :class="{ mask: model }"></view> |
|||
<!-- 弹窗主体 --> |
|||
<view |
|||
:style="{ height: barHidth + 'rpx' }" |
|||
class="active" |
|||
:class="{ add: model }" |
|||
> |
|||
<view class="title-model">{{ title }} <text @tap="close">x</text></view> |
|||
<view class="cont" :style="{ height: barHidth - 80 + 'rpx' }"> |
|||
<!-- 天 --> |
|||
<scroll-view class="day" :scroll-y="true"> |
|||
<view |
|||
:class="index === isIndex ? 'active_copy' : ''" |
|||
v-for="(item, index) in content" |
|||
:key="item.id" |
|||
@tap="dataCallback(index, item)" |
|||
>{{ item.timezh }}</view |
|||
> |
|||
</scroll-view> |
|||
|
|||
<!-- 时 --> |
|||
<scroll-view class="content-model" :scroll-y="true" :scroll-top="scrollTop"> |
|||
<view |
|||
class="appoint" |
|||
:class="index === Indexes ? 'longActive' : ''" |
|||
@tap="timeCallback(index, item)" |
|||
v-for="(item, index) in Days" |
|||
:key="index" |
|||
>{{ item.timestr |
|||
}}<text :class="index === Indexes ? 'cuIcon-check' : ''"></text |
|||
></view> |
|||
</scroll-view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
props: { |
|||
//弹窗组件标题 |
|||
title: { |
|||
type: String, |
|||
default: "请传入title", |
|||
}, |
|||
//弹窗组件数据 |
|||
content: { |
|||
type: Array, |
|||
// 默认测试数据 |
|||
default: () => [ |
|||
{ |
|||
timezh: "今天 (周三)", |
|||
timeformatter: "8-10", |
|||
id: 108, |
|||
timelist: [ |
|||
{ |
|||
timestr: "立即送达", |
|||
}, |
|||
{ |
|||
timestr: "15:35", |
|||
}, |
|||
{ |
|||
timestr: "16:05", |
|||
}, |
|||
], |
|||
}, |
|||
], |
|||
}, |
|||
//弹窗 窗口高度 |
|||
barHidth: { |
|||
type: Number, |
|||
default: 400, |
|||
}, |
|||
//点击模态框是否能关闭弹窗 |
|||
dodge: { |
|||
type: Boolean, |
|||
default: false, |
|||
}, |
|||
}, |
|||
data() { |
|||
return { |
|||
scrollTop: 0, |
|||
isIndex: 0, |
|||
Indexes: 0, |
|||
Days: [], |
|||
model: false, |
|||
}; |
|||
}, |
|||
|
|||
//初始化数据 |
|||
watch: { |
|||
content: { |
|||
immediate: true, |
|||
handler(newValue, oldValue) { |
|||
this.Days = this.content[0].timelist; |
|||
}, |
|||
}, |
|||
}, |
|||
|
|||
methods: { |
|||
// 关闭窗口 |
|||
close() { |
|||
this.model = false; |
|||
}, |
|||
|
|||
// 打开窗口 |
|||
open() { |
|||
this.model = true; |
|||
}, |
|||
|
|||
// 点击模态框关闭窗口 |
|||
Modal() { |
|||
if (this.dodge) { |
|||
this.close(); |
|||
} |
|||
}, |
|||
|
|||
//时间切换回顶 |
|||
gotop() { |
|||
this.scrollTop = 1; |
|||
this.$nextTick(function () { |
|||
this.scrollTop = 0; |
|||
}); |
|||
}, |
|||
|
|||
//切换日期 |
|||
dataCallback(inedx, item) { |
|||
this.isIndex = inedx; |
|||
this.Days = this.content[inedx].timelist; |
|||
this.Indexes = null; |
|||
this.gotop(); |
|||
this.$emit("dataCallback", item); |
|||
}, |
|||
|
|||
//选择时间 |
|||
timeCallback(inedx, item) { |
|||
this.Indexes = inedx; |
|||
this.modalName = null; |
|||
this.$emit("timeCallback", item); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style scoped> |
|||
.mask { |
|||
position: fixed; |
|||
top: 0; |
|||
left: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
background-color: #000; |
|||
animation: getInto 0.5s 1; |
|||
opacity: 0.5; |
|||
z-index: 999; |
|||
} |
|||
|
|||
@keyframes getInto { |
|||
0% { |
|||
opacity: 0; |
|||
} |
|||
|
|||
100% { |
|||
opacity: 0.5; |
|||
} |
|||
} |
|||
|
|||
.active { |
|||
position: fixed; |
|||
bottom: 0; |
|||
left: 0; |
|||
z-index: 1000; |
|||
width: 100%; |
|||
height: 400rpx; |
|||
border-top-left-radius: 16rpx; |
|||
border-top-right-radius: 16rpx; |
|||
overflow: hidden; |
|||
transform: translateY(100%); |
|||
transition: 0.4s; |
|||
} |
|||
|
|||
.add { |
|||
transform: translateY(0); |
|||
} |
|||
|
|||
.title-model { |
|||
position: relative; |
|||
text-align: center; |
|||
background-color: #fff; |
|||
padding: 20rpx 0; |
|||
border-bottom: 2rpx solid #eee; |
|||
} |
|||
|
|||
.title-model > text { |
|||
position: absolute; |
|||
right: 14rpx; |
|||
width: 46rpx; |
|||
height: 46rpx; |
|||
line-height: 38rpx; |
|||
background-color: #ccc; |
|||
color: #fff; |
|||
border-radius: 50%; |
|||
} |
|||
|
|||
.cont { |
|||
display: flex; |
|||
background-color: #fff; |
|||
overflow-y: scroll; |
|||
} |
|||
|
|||
.day { |
|||
flex: 2; |
|||
background-color: #fff; |
|||
border-right: 2rpx solid #f8f8f8; |
|||
text-align: center; |
|||
border-bottom: 20px solid #fff; |
|||
} |
|||
|
|||
.day view { |
|||
padding: 30rpx 12rpx; |
|||
font-size: 28rpx; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.content-model { |
|||
flex: 4; |
|||
font-size: 28rpx; |
|||
border-bottom: 40rpx solid #fff; |
|||
background-color: #fff; |
|||
} |
|||
|
|||
.appoint { |
|||
text-align: left; |
|||
padding: 30rpx; |
|||
border-bottom: 2rpx solid #f8f8f8; |
|||
} |
|||
|
|||
.appoint text { |
|||
margin-left: 30rpx; |
|||
} |
|||
|
|||
.active_copy { |
|||
position: relative; |
|||
background-color: #d7f7e3; |
|||
color: #27c866; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.active_copy::after { |
|||
content: ""; |
|||
width: 5rpx; |
|||
height: 94rpx; |
|||
background: #27c866; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
} |
|||
|
|||
.longActive { |
|||
position: relative; |
|||
color: #27c866; |
|||
} |
|||
|
|||
.cuIcon-check { |
|||
position: absolute; |
|||
width: 30rpx; |
|||
left: 210rpx; |
|||
height: 16rpx; |
|||
border-bottom: 4rpx solid #27c866; |
|||
border-left: 4rpx solid #27c866; |
|||
transform: rotate(-45deg); |
|||
} |
|||
|
|||
scroll-view ::-webkit-scrollbar { |
|||
display: none; |
|||
width: 0; |
|||
height: 0; |
|||
color: transparent; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue