6 changed files with 624 additions and 8 deletions
-
282agentApp/components/cu-keyboard/cu-keyboard.vue
-
41agentApp/components/cu-keyboard/exmple.vue
-
279agentApp/components/uni-transition/uni-transition.vue
-
6agentApp/manifest.json
-
1agentApp/pages/allpages/index.vue
-
23agentApp/pages/payment/payment.vue
@ -0,0 +1,282 @@ |
|||
<template> |
|||
<view class="key-container" @click="hide" v-show="showMask"> |
|||
<uni-transition :modeClass="['slide-bottom']" :show="show" |
|||
:styles="{height:'100vh'}" |
|||
:duration="duration"> |
|||
<view class="key-content" @click.stop> |
|||
<slot></slot> |
|||
<view class="key-box block flex"> |
|||
<view class="key-left"> |
|||
<view class="key-top flex flex-wrap"> |
|||
<view class="btn-box" v-for="(item,index) in numArr" :key="index"> |
|||
<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown(item)">{{item}}</button> |
|||
</view> |
|||
</view> |
|||
<view class="key-bottom"> |
|||
<view class="btn-zero"> |
|||
<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown('0')">0</button> |
|||
</view> |
|||
<view class="btn-point"> |
|||
<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="keydown('.')">.</button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="key-right"> |
|||
<view class="del"> |
|||
<button hover-class="active" class="cu-btn key-btn text-black text-xl" @click.stop="del"> |
|||
<text class="zm iconbackspace text-xl"></text> |
|||
</button> |
|||
</view> |
|||
<view class="confirm"> |
|||
<button hover-class="active" :style="[confirmStyle]" class="cu-btn" @click.stop="confirm"> |
|||
<text class="confirm-text">{{confirmText}}</text> |
|||
</button> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
</uni-transition> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
/** |
|||
* 付款组件 |
|||
* @property {Number} duration - 弹出动画时长,默认为300 |
|||
* @event {Function} change - 数字改变触发,参数为数字 |
|||
* @event {Function} confirm - 付款时触发,参数为数字 |
|||
* @event {Function} hide - 关闭键盘触发,参数为空 |
|||
*/ |
|||
// 使用方法,查看同级目录exmple |
|||
import uniTransition from '../uni-transition/uni-transition.vue' |
|||
export default{ |
|||
components:{ |
|||
uniTransition |
|||
}, |
|||
props:{ |
|||
duration:{ |
|||
type:Number,//弹出动画时常 |
|||
default:300 |
|||
}, |
|||
confirmText:{ |
|||
type:String, |
|||
default:'付款' |
|||
}, |
|||
confirmStyle:{ |
|||
type:Object, |
|||
default:()=>{ |
|||
return{ |
|||
backgroundColor:'#57BE6D' |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
data(){ |
|||
return{ |
|||
value:'',//输出的值 |
|||
show:false,//显示键盘 |
|||
showMask:false,//遮罩层 |
|||
numArr:[1,2,3,4,5,6,7,8,9] |
|||
} |
|||
}, |
|||
|
|||
watch:{ |
|||
value(newval,oldval){ |
|||
this.$emit("change",newval); |
|||
} |
|||
}, |
|||
methods:{ |
|||
close(){ |
|||
this.show = false; |
|||
setTimeout(()=>{ |
|||
this.showMask = false; |
|||
},this.duration) |
|||
}, |
|||
open(){ |
|||
this.value = ''; |
|||
this.show = true; |
|||
this.showMask = true; |
|||
}, |
|||
del(){ |
|||
if(this.value.length){ |
|||
this.value = this.value.slice(0,this.value.length-1); |
|||
} |
|||
}, |
|||
keydown(e){ |
|||
switch(e){ |
|||
case '.': |
|||
// 当输入为点的时候,如果第一次输入点,则补零 |
|||
if(!this.value.length){ |
|||
this.value = '0.'; |
|||
}else{ |
|||
if(this.value.indexOf('.')>-1){ |
|||
// 如果已经有点,则无效 |
|||
}else{ |
|||
this.value = this.value+''+e; |
|||
} |
|||
} |
|||
break; |
|||
case '0': |
|||
if(this.value.length === 0){ |
|||
this.value = this.value+''+e; |
|||
} |
|||
if(Number(this.value) === 0 && this.value.indexOf('.')== -1){ |
|||
// 当输入为零的时候,如果value转换成数字为零,且没有点则无效 |
|||
}else{ |
|||
this.value = this.value+''+e; |
|||
} |
|||
break; |
|||
default: |
|||
this.value = this.value+''+e; |
|||
break; |
|||
} |
|||
}, |
|||
hide(){ |
|||
this.$emit('hide'); |
|||
this.close(); |
|||
}, |
|||
confirm(){ |
|||
this.$emit('confirm',this.value); |
|||
this.close(); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
@font-face { |
|||
font-family: 'zm'; /* project id 2442084 */ |
|||
src: url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.eot'); |
|||
src: url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.eot?#iefix') format('embedded-opentype'), |
|||
url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.woff2') format('woff2'), |
|||
url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.woff') format('woff'), |
|||
url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.ttf') format('truetype'), |
|||
url('https://at.alicdn.com/t/font_2442084_o72ps3802ih.svg#zm') format('svg'); |
|||
} |
|||
|
|||
.zm { |
|||
font-family: "zm" !important; |
|||
font-size: 16px; |
|||
font-style: normal; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
} |
|||
|
|||
.iconbackspace:before { |
|||
content: "\ef11"; |
|||
} |
|||
|
|||
.flex{ |
|||
display: flex; |
|||
} |
|||
.flex-wrap{ |
|||
flex-wrap: wrap; |
|||
} |
|||
.cu-btn { |
|||
position: relative; |
|||
border: 0rpx; |
|||
display: inline-flex; |
|||
align-items: center; |
|||
justify-content: center; |
|||
box-sizing: border-box; |
|||
padding: 0 30rpx; |
|||
font-size: 28rpx; |
|||
height: 64rpx; |
|||
line-height: 1; |
|||
text-align: center; |
|||
text-decoration: none; |
|||
overflow: visible; |
|||
margin-left: initial; |
|||
transform: translate(0rpx, 0rpx); |
|||
margin-right: initial; |
|||
} |
|||
|
|||
.cu-btn::after { |
|||
display: none; |
|||
} |
|||
.text-xl{ |
|||
font-size:36rpx; |
|||
font-weight: bold; |
|||
font-family: 'microsoft-yahei'; |
|||
} |
|||
.text-black{ |
|||
color:#333; |
|||
} |
|||
.active{ |
|||
background-color: #ddd !important; |
|||
transform: translate(2rpx,2rpx); |
|||
} |
|||
.key-container{ |
|||
position: fixed; |
|||
bottom: 0; |
|||
top:0; |
|||
left:0; |
|||
right:0; |
|||
.key-content{ |
|||
position: absolute; |
|||
bottom: 0; |
|||
width: 100vw; |
|||
background-color: #F7F7F7; |
|||
} |
|||
} |
|||
.key-box{ |
|||
width: 100%; |
|||
box-sizing: border-box; |
|||
padding:10rpx 10rpx 0; |
|||
.key-left{ |
|||
width: 75%; |
|||
} |
|||
.key-right{ |
|||
width: 25%; |
|||
display: flex; |
|||
flex-direction: column; |
|||
} |
|||
.key-bottom{ |
|||
width: 100%; |
|||
display: flex; |
|||
} |
|||
} |
|||
.del{ |
|||
width: 100%; |
|||
} |
|||
.btn-box{ |
|||
width: 33.33%; |
|||
padding:0 10rpx 10rpx 0; |
|||
box-sizing: border-box; |
|||
} |
|||
.btn-zero{ |
|||
width: 66.66%; |
|||
padding:0 10rpx 10rpx 0; |
|||
box-sizing: border-box; |
|||
} |
|||
.btn-point{ |
|||
width: 33.33%; |
|||
padding:0 10rpx 10rpx 0; |
|||
box-sizing: border-box; |
|||
} |
|||
.key-right{ |
|||
flex-shrink: 0; |
|||
} |
|||
.key-btn{ |
|||
background-color: #fff; |
|||
width: 100%; |
|||
height: 90rpx; |
|||
} |
|||
|
|||
.confirm{ |
|||
width: 100%; |
|||
flex:1; |
|||
padding: 10rpx 0 10rpx 0; |
|||
box-sizing: border-box; |
|||
button{ |
|||
width: 100%; |
|||
height: 100%; |
|||
.confirm-text{ |
|||
color:#fff; |
|||
display: block; |
|||
font-size: 32rpx; |
|||
} |
|||
} |
|||
} |
|||
|
|||
</style> |
|||
@ -0,0 +1,41 @@ |
|||
<template> |
|||
<view class="container"> |
|||
<button type="default" @click="open">打开键盘</button> |
|||
{{value}} |
|||
<cu-keyboard ref="cukeyboard" @change="change" @confirm="confirm" @hide="hide"></cu-keyboard> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
value:'' |
|||
} |
|||
}, |
|||
mounted() { |
|||
|
|||
}, |
|||
methods: { |
|||
change(e){ |
|||
this.value = e; |
|||
console.log("数字改变",e); |
|||
}, |
|||
open(){ |
|||
console.log("打开键盘"); |
|||
this.$refs.cukeyboard.open(); |
|||
}, |
|||
confirm(e){ |
|||
console.log("付款",e); |
|||
}, |
|||
hide(){ |
|||
console.log("关闭键盘") |
|||
} |
|||
|
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
|
|||
</style> |
|||
@ -0,0 +1,279 @@ |
|||
<template> |
|||
<view v-if="isShow" ref="ani" class="uni-transition" :class="[ani.in]" :style="'transform:' +transform+';'+stylesObject" |
|||
@click="change"> |
|||
<slot></slot> |
|||
</view> |
|||
</template> |
|||
|
|||
<script> |
|||
// #ifdef APP-NVUE |
|||
const animation = uni.requireNativePlugin('animation'); |
|||
// #endif |
|||
/** |
|||
* Transition 过渡动画 |
|||
* @description 简单过渡动画组件 |
|||
* @tutorial https://ext.dcloud.net.cn/plugin?id=985 |
|||
* @property {Boolean} show = [false|true] 控制组件显示或隐藏 |
|||
* @property {Array} modeClass = [fade|slide-top|slide-right|slide-bottom|slide-left|zoom-in|zoom-out] 过渡动画类型 |
|||
* @value fade 渐隐渐出过渡 |
|||
* @value slide-top 由上至下过渡 |
|||
* @value slide-right 由右至左过渡 |
|||
* @value slide-bottom 由下至上过渡 |
|||
* @value slide-left 由左至右过渡 |
|||
* @value zoom-in 由小到大过渡 |
|||
* @value zoom-out 由大到小过渡 |
|||
* @property {Number} duration 过渡动画持续时间 |
|||
* @property {Object} styles 组件样式,同 css 样式,注意带’-‘连接符的属性需要使用小驼峰写法如:`backgroundColor:red` |
|||
*/ |
|||
export default { |
|||
name: 'uniTransition', |
|||
props: { |
|||
show: { |
|||
type: Boolean, |
|||
default: false |
|||
}, |
|||
modeClass: { |
|||
type: Array, |
|||
default () { |
|||
return [] |
|||
} |
|||
}, |
|||
duration: { |
|||
type: Number, |
|||
default: 300 |
|||
}, |
|||
styles: { |
|||
type: Object, |
|||
default () { |
|||
return {} |
|||
} |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
isShow: false, |
|||
transform: '', |
|||
ani: { in: '', |
|||
active: '' |
|||
} |
|||
}; |
|||
}, |
|||
watch: { |
|||
show: { |
|||
handler(newVal) { |
|||
if (newVal) { |
|||
this.open() |
|||
} else { |
|||
this.close() |
|||
} |
|||
}, |
|||
immediate: true |
|||
} |
|||
}, |
|||
computed: { |
|||
stylesObject() { |
|||
let styles = { |
|||
...this.styles, |
|||
'transition-duration': this.duration / 1000 + 's' |
|||
} |
|||
let transfrom = '' |
|||
for (let i in styles) { |
|||
let line = this.toLine(i) |
|||
transfrom += line + ':' + styles[i] + ';' |
|||
} |
|||
return transfrom |
|||
} |
|||
}, |
|||
created() { |
|||
// this.timer = null |
|||
// this.nextTick = (time = 50) => new Promise(resolve => { |
|||
// clearTimeout(this.timer) |
|||
// this.timer = setTimeout(resolve, time) |
|||
// return this.timer |
|||
// }); |
|||
}, |
|||
methods: { |
|||
change() { |
|||
this.$emit('click', { |
|||
detail: this.isShow |
|||
}) |
|||
}, |
|||
open() { |
|||
clearTimeout(this.timer) |
|||
this.isShow = true |
|||
this.transform = '' |
|||
this.ani.in = '' |
|||
for (let i in this.getTranfrom(false)) { |
|||
if (i === 'opacity') { |
|||
this.ani.in = 'fade-in' |
|||
} else { |
|||
this.transform += `${this.getTranfrom(false)[i]} ` |
|||
} |
|||
} |
|||
this.$nextTick(() => { |
|||
setTimeout(() => { |
|||
this._animation(true) |
|||
}, 50) |
|||
}) |
|||
|
|||
}, |
|||
close(type) { |
|||
clearTimeout(this.timer) |
|||
this._animation(false) |
|||
}, |
|||
_animation(type) { |
|||
let styles = this.getTranfrom(type) |
|||
// #ifdef APP-NVUE |
|||
if(!this.$refs['ani']) return |
|||
animation.transition(this.$refs['ani'].ref, { |
|||
styles, |
|||
duration: this.duration, //ms |
|||
timingFunction: 'ease', |
|||
needLayout: false, |
|||
delay: 0 //ms |
|||
}, () => { |
|||
if (!type) { |
|||
this.isShow = false |
|||
} |
|||
this.$emit('change', { |
|||
detail: this.isShow |
|||
}) |
|||
}) |
|||
// #endif |
|||
// #ifndef APP-NVUE |
|||
this.transform = '' |
|||
for (let i in styles) { |
|||
if (i === 'opacity') { |
|||
this.ani.in = `fade-${type?'out':'in'}` |
|||
} else { |
|||
this.transform += `${styles[i]} ` |
|||
} |
|||
} |
|||
this.timer = setTimeout(() => { |
|||
if (!type) { |
|||
this.isShow = false |
|||
} |
|||
this.$emit('change', { |
|||
detail: this.isShow |
|||
}) |
|||
|
|||
}, this.duration) |
|||
// #endif |
|||
|
|||
}, |
|||
getTranfrom(type) { |
|||
let styles = { |
|||
transform: '' |
|||
} |
|||
this.modeClass.forEach((mode) => { |
|||
switch (mode) { |
|||
case 'fade': |
|||
styles.opacity = type ? 1 : 0 |
|||
break; |
|||
case 'slide-top': |
|||
styles.transform += `translateY(${type?'0':'-100%'}) ` |
|||
break; |
|||
case 'slide-right': |
|||
styles.transform += `translateX(${type?'0':'100%'}) ` |
|||
break; |
|||
case 'slide-bottom': |
|||
styles.transform += `translateY(${type?'0':'100%'}) ` |
|||
break; |
|||
case 'slide-left': |
|||
styles.transform += `translateX(${type?'0':'-100%'}) ` |
|||
break; |
|||
case 'zoom-in': |
|||
styles.transform += `scale(${type?1:0.8}) ` |
|||
break; |
|||
case 'zoom-out': |
|||
styles.transform += `scale(${type?1:1.2}) ` |
|||
break; |
|||
} |
|||
}) |
|||
return styles |
|||
}, |
|||
_modeClassArr(type) { |
|||
let mode = this.modeClass |
|||
if (typeof(mode) !== "string") { |
|||
let modestr = '' |
|||
mode.forEach((item) => { |
|||
modestr += (item + '-' + type + ',') |
|||
}) |
|||
return modestr.substr(0, modestr.length - 1) |
|||
} else { |
|||
return mode + '-' + type |
|||
} |
|||
}, |
|||
// getEl(el) { |
|||
// console.log(el || el.ref || null); |
|||
// return el || el.ref || null |
|||
// }, |
|||
toLine(name) { |
|||
return name.replace(/([A-Z])/g, "-$1").toLowerCase(); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
.uni-transition { |
|||
transition-timing-function: ease; |
|||
transition-duration: 0.3s; |
|||
transition-property: transform, opacity; |
|||
} |
|||
|
|||
.fade-in { |
|||
opacity: 0; |
|||
} |
|||
|
|||
.fade-active { |
|||
opacity: 1; |
|||
} |
|||
|
|||
.slide-top-in { |
|||
/* transition-property: transform, opacity; */ |
|||
transform: translateY(-100%); |
|||
} |
|||
|
|||
.slide-top-active { |
|||
transform: translateY(0); |
|||
/* opacity: 1; */ |
|||
} |
|||
|
|||
.slide-right-in { |
|||
transform: translateX(100%); |
|||
} |
|||
|
|||
.slide-right-active { |
|||
transform: translateX(0); |
|||
} |
|||
|
|||
.slide-bottom-in { |
|||
transform: translateY(100%); |
|||
} |
|||
|
|||
.slide-bottom-active { |
|||
transform: translateY(0); |
|||
} |
|||
|
|||
.slide-left-in { |
|||
transform: translateX(-100%); |
|||
} |
|||
|
|||
.slide-left-active { |
|||
transform: translateX(0); |
|||
opacity: 1; |
|||
} |
|||
|
|||
.zoom-in-in { |
|||
transform: scale(0.8); |
|||
} |
|||
|
|||
.zoom-out-active { |
|||
transform: scale(1); |
|||
} |
|||
|
|||
.zoom-out-in { |
|||
transform: scale(1.2); |
|||
} |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue