|
|
<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>
|