用vue写的移动端车牌号输入法
效果图:
(录制了视频演示,然而不会上传.....心塞.....)
本页面所在项目已上传GitHub,github下载地址:https://github.com/dan-Zd/car-vueapp 车牌键盘页面在 README.md有说明
代码部分:
车牌号输入框---html
<div class="content-car-number">
<div class="car-content-title">
<span>车牌号</span>
<label class="ze-checkbox"><input type="checkbox" v-model="checkbox" @change="carTypeChange">
<span class="ze-checkbox-icon" style="width: 20px;height: 20px;color: rgb(76, 216, 100);">
<i style="width: 6px;height: 12px;"></i>
</span>
<span class="ze-checkbox-text">新能源</span>
</label>
</div>
<div class="content-section">
<div class="content-section-flex flex-card">
<div class="content-section-flex flex-card-border">
<button id="font" class="flex-btn" @click="btnClickYue" v-bind:class="{isClick: isYue }">{{areaName}}</button>
<span class="blank-border blank-border-first"></span>
<button id='letter' class="flex-btn" @click="btnClickA" v-bind:class="{isClick: isA}">{{areaLetter}}</button>
<div class="flex-mid"><span></span></div>
<div class="flex-btns">
<button id='numOne' @click="btnClickNum('one')" v-bind:class="{isNumClick: isNumOne }">{{numOne}}</button>
<span class="blank-border"></span>
<button id='numTwo' @click="btnClickNum('two')" v-bind:class="{isNumClick: isNumTwo }">{{numTwo}}</button>
<span class="blank-border"></span>
<button id='numThree' @click="btnClickNum('three')" v-bind:class="{isNumClick: isNumThree }">{{numThree}}</button>
<span class="blank-border"></span>
<button id='numFour' @click="btnClickNum('four')" v-bind:class="{isNumClick: isNumFour }">{{numFour}}</button>
<span class="blank-border"></span>
<button id='numFive' @click="btnClickNum('five')" v-bind:class="{isNumClick: isNumFive }">{{numFive}}</button>
<span class="blank-border" v-if="checkbox"></span>
<button v-if="checkbox" id='numSix' @click="btnClickNum('six')" v-bind:class="{isNumClick: isNumSix }">{{numSix}}</button>
</div>
</div>
</div>
</div>
</div>
键盘—html
<div class="keyboard" v-if="keyboardShow" :class='{animationDown:isDown,animationUp:isUp}'>
<button class="btn-complete" @click="completeClick"><span>完成</span></button>
<div v-if="keyboard == 'txt'">
<div class="keyboard-row" v-for="(item,rows) in carTxt">
<button class="keyboard-row-item" v-for="(i,index) in item.name" @click="btnWordClick(rows,index,i)">{{i}}</button>
</div>
<div class="keyboard-row">
<!-- <div class="keyboard-row-items"> -->
<button class="keyboard-row-item bottom" @click="btnBottomClick('新')">新</button>
<button class="keyboard-row-item bottom" @click="btnBottomClick('临')">临</button>
<button v-for="j in noneBottomtxt" class="none-botton">{{j}}</button>
<div class="keyboard-row-item clear" @click="clearClick">
<img src="../assets/icon_input_delete.png" alt="删除">
</div>
<!-- </div> -->
</div>
</div>
<div v-if="keyboard == 'num'">
<div class="keyboard-row" v-for="(item,rows) in carNum">
<button :disabled="!isSelectl?isDisable && i<10 :isDisable&& rows!=0 " class="keyboard-row-item" v-for="(i,index) in item.name" @click="btnWordClick(rows,index,i)">{{i}}
</button>
</div>
<div class="keyboard-row">
<!-- <div class="keyboard-row-bottom"> -->
<button :disabled="isSelectl" v-for="item in carNumBottom" class="keyboard-row-item bottom" @click="btnBottomNumClick(item)">{{item}}</button>
<button v-for="j in noneBottom" class="none-botton">{{j}}</button>
<div class="keyboard-row-item clear" @click="clearClick">
<img src="../assets/icon_input_delete.png" alt="删除">
</div>
<!-- </div> -->
</div>
</div>
</div>
Css部分:
//车牌输入框
.content-car-number {
padding: 64px 0 0;
.car-content-title {
display: flex;
justify-content: space-between;
padding: 0 32px;
margin-bottom: 16px;
span {
font-size: 34px;
}
.ze-checkbox {
display: flex;
align-items: center;
}
.ze-radio-text {
font-size: 28px;
}
.ze-checkbox-icon {
color: #FFEDB1 !important;
margin-right: 8px;
}
}
.content-section {
.content-section-flex {
display: flex;
justify-content: center;
align-items: center;
font-size: 40px;
margin-bottom: 35px;
.blank-border {
height: 44px;
width: 1px; /*no*/
border-right: 1px solid #ddd; /*no*/
margin-top: 27px;
float: left;
margin-left: -15px;
z-index:;
&.blank-border-first {
margin-top: 0px;
}
}
&.flex-card {
color: #000;
.flex-btn {
width: 98px;
height: 98px;
border: none;
text-align: center;
background: #fff;
font-size: 40px;
color: #000;
}
.flex-btns {
text-align: center;
background: #fff;
width: fit-content;
position: relative;
height: 98px;
button {
width: 98px;
height: 98px;
border: none;
font-size: 40px;
color: #000;
border-radius: 50%;
background: transparent;
float: left;
margin-left: -20px;
z-index:;
position: relative;
&:first-child {
margin-left: 0;
}
}
}
.flex-mid {
margin: 0 0.1rem;
span {
display: block;
width: 10px;
height: 10px;
border-radius: 50%;
background: #ddd;
}
}
.isClick {
border: 1px solid #ffc200; /*no*/
z-index:;
border-radius: 8px;
}
.isNumClick {
border-radius: 8px !important;
border: 1px solid #ffc200 !important; /*no*/
z-index:;
background-color: #fff !important;
}
}
.flex-card-border {
border: 1px solid #ddd; /*no*/
border-radius: 8px;
}
}
}
} //键盘
.keyboard {
width: 100%;
height: 502px;
position: fixed;
bottom: -502px;
background: #eeeeee;
z-index:;
&.animationDown {
animation: slide_dowms 0.3s ease-out;
animation-fill-mode: forwards;
}
&.animationUp {
animation: slide_ups 0.3s ease-out;
animation-fill-mode: forwards;
}
.btn-complete {
height: 72px;
text-align: right;
color: #ffc200;
font-size: 30px;
width: 100%;
background: #fff;
border: none;
border-top: 1px solid #eee;
margin-bottom: 30px;
span {
margin-right: 30px;
}
}
.keyboard-row {
margin-top: 20px;
display: flex;
justify-content: space-between;
padding: 0 8px;
color: #333;
&:first-child {
margin-top: 0;
}
.keyboard-row-items {
display: flex;
justify-content: left;
}
.keyboard-row-bottom {
display: flex;
justify-content: space-between;
}
.keyboard-row-item {
width: 66px;
height: 80px;
background: #fff;
font-size: 34px;
text-align: center;
border: 1px solid #ccc; /*no*/
border-radius: 10px;
color: #333;
&.bottom {
height: 80px;
width: 66px;
line-height: 80px;
background: #fff;
color: #333;
/*margin-right: 0.08rem;*/
}
&.clear {
width: 140px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 62px;
}
}
}
.none-botton {
border: none;
height: 80px;
width: 66px;
visibility: hidden;
}
}
button {
&:active {
background: #f4f4f4 !important;
color: #999 !important;
}
}
}
//键盘滑动
@keyframes slide_ups {
from {
bottom: -502px;
}
to {
bottom: 0px;
}
}
@keyframes slide_dowms {
from {
bottom: 0px;
}
to {
bottom: -502px;
}
}
javascript部分
data () { //有一些别的数据,实在懒得一一挑出来了
return {
toastTxt: '',
isToastShow: false,
isStr: '20px',
isEnd: '300px',
ispickerDateShow: '-400px',
dateTitle: '开始',
beginTimeVal: '',
overTimeVal: '',
isFeeHourClick: true,
checkbox: false,
isDown: false,
isUp: false,
selected: null,
isSelectx: false,
isSelectl: false,
key: '1',
areaName: '',
areaLetter: '',
numOne: '',
numTwo: '',
numThree: '',
numFour: '',
numFive: '',
numSix: '',
isYue: false,
keyboardShow: false,
keyboard: false,
isA: false,
isNumOne: false,
isNumTwo: false,
isNumThree: false,
isNumFour: false,
isNumFive: false,
isNumSix: false,
isDisable: false,
carTxt: [
{ name: ['粤', '京', '冀', '沪', '津', '晋', '蒙', '辽', '吉', '黑'] },
{ name: ['苏', '浙', '皖', '闽', '赣', '鲁', '豫', '鄂', '湘', '桂'] },
{ name: ['琼', '渝', '川', '贵', '云', '藏', '陕', '甘', '青', '宁'] }
],
carNumBottom: ['W', 'X', 'Y', 'Z'],
noneBottom: ['', '', '', ''],
noneBottomtxt: ['', '', '', '', '', ''],
carNum: [
{ name: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] },
{ name: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K'] },
{ name: ['L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V'] }
],
addedCarNum: ''
}
},
watch: {
checkbox: function (val, oldval) { //监听是否为新能源
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
const vm = this
if (!val) {
// 切换到普通车牌
if (vm.numFour) {
vm.isNumFive = true
vm.key = 7
}
} else {
// 切换到新能源车牌
if (vm.numFive) {
vm.isNumSix = true
vm.key = 8
}
}
},
numFive: function (val) { //监听是否为普通车牌最后一位
if (!this.checkbox && val) {
this.isUp = false
this.isDown = true
this.keyboardShow = false
this.isNumFive = false
}
},
numSix: function (val) { //监听是否为新能源车牌最后一位
if (this.checkbox && val) {
this.isUp = false
this.isDown = true
this.keyboardShow = false
this.isNumSix = false
}
}
},
//methods
methods: {
// 车牌类型切换
carTypeChange (val) {
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
if (!val) {
// 切换到普通车牌
if (this.numFour) {
this.isNumFive = true
this.key = 7
}
} else {
// 切换到新能源车牌
if (this.numFive) {
this.isNumSix = true
this.key = 8
}
}
},
// 车牌号第一位输入框选择
btnClickYue () {
this.isYue = true
this.isA = false
this.isUp = true
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
this.keyboardShow = true
this.keyboard = 'txt'
this.key = 1
},
// 键盘选择显示
btnWordClick (rows, index, i) {
this.selected = i
if (this.key === 1) {
if (this.areaName === '临') {
this.areaLetter = ''
this.numOne = ''
this.numTwo = ''
this.numThree = ''
this.numFour = ''
this.numFive = ''
this.numSix = ''
}
this.areaName = i
this.isSelectl = false
document.getElementById('letter').click()
} else if (this.key === 2) {
this.areaLetter = i
document.getElementById('numOne').click()
} else if (this.key === 3) {
this.numOne = i
document.getElementById('numTwo').click()
} else if (this.key === 4) {
this.numTwo = i
document.getElementById('numThree').click()
} else if (this.key === 5) {
this.numThree = i
document.getElementById('numFour').click()
} else if (this.key === 6) {
this.numFour = i
document.getElementById('numFive').click()
} else if (this.key === 7) {
this.numFive = i
if (this.checkbox) {
document.getElementById('numSix').click()
}
} else if (this.key === 8) {
this.numSix = i
}
if (this.key === 7 || this.key === 8) {
this.carNumBottom = ['W', 'X', 'Y', 'Z', '港', '澳', '学']
this.noneBottom = ['']
} else if (this.key === 3 || this.key === 4 || this.key === 5 || this.key === 6) {
this.carNumBottom = ['W', 'X', 'Y', 'Z']
this.noneBottom = ['', '', '', '']
}
},
// 车牌第一位选择‘临’,’新‘后的键盘显示
btnBottomClick (val) {
if (val === '新') {
if (this.areaName === '临') {
this.areaLetter = ''
this.numOne = ''
this.numTwo = ''
this.numThree = ''
this.numFour = ''
this.numFive = ''
this.numSix = ''
}
this.areaName = '新'
this.isSelectx = true
this.isSelectl = false
document.getElementById('letter').click()
} else if (val === '临') {
this.areaName = '临'
this.isSelectl = true
this.isSelectx = false
this.isDisable = true
this.areaLetter = ''
this.numOne = ''
this.numTwo = ''
this.numThree = ''
this.numFour = ''
this.numFive = ''
this.numSix = ''
document.getElementById('letter').click('isLin')
}
},
// 键盘最后一行字母点击事件
btnBottomNumClick (i) {
this.selected = i
if (this.key === 2) {
this.areaLetter = i
document.getElementById('numOne').click()
} else if (this.key === 3) {
this.numOne = i
document.getElementById('numTwo').click()
} else if (this.key === 4) {
this.numTwo = i
document.getElementById('numThree').click()
} else if (this.key === 5) {
this.numThree = i
document.getElementById('numFour').click()
} else if (this.key === 6) {
this.numFour = i
document.getElementById('numFive').click()
} else if (this.key === 7) {
this.numFive = i
if (this.checkbox) {
document.getElementById('numSix').click()
}
} else if (this.key === 8) {
this.numSix = i
}
},
// 车牌号第二位输入框选择
btnClickA () {
this.isDisable = true
this.isA = true
this.isYue = false
this.isUp = true
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
this.keyboardShow = true
this.keyboard = 'num'
this.key = 2
},
// 车牌号后五位或六位输入框选择
btnClickNum (name) {
if (this.isSelectl) {
this.isDisable = true
} else {
this.isDisable = false
}
this.keyboard = 'num'
this.keyboardShow = true
this.isYue = false
this.isA = false
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
this.isUp = true
if (name === 'one') {
this.isNumOne = true
this.key = 3
} else if (name === 'two') {
this.isNumTwo = true
this.key = 4
} else if (name === 'three') {
this.isNumThree = true
this.key = 5
} else if (name === 'four') {
this.isNumFour = true
this.key = 6
} else if (name === 'five') {
this.isNumFive = true
this.key = 7
} else if (name === 'six') {
this.isNumSix = true
this.key = 8
}
if (name === 'five' || name === 'six') {
this.carNumBottom = ['W', 'X', 'Y', 'Z', '港', '澳', '学']
this.noneBottom = ['']
} else {
this.carNumBottom = ['W', 'X', 'Y', 'Z']
this.noneBottom = ['', '', '', '']
}
},
// 键盘点击‘完成’
completeClick () {
this.isYue = false
this.isA = false
this.isNumOne = false
this.isNumTwo = false
this.isNumThree = false
this.isNumFour = false
this.isNumFive = false
this.isNumSix = false
this.isUp = false
this.isDown = true
this.keyboardShow = false
},
// 键盘点击‘删除图标’
clearClick () {
if (this.key === 1) {
this.areaName = ''
} else if (this.key === 2) {
document.getElementById('font').click()
this.areaLetter = ''
} else if (this.key === 3) {
document.getElementById('letter').click()
this.numOne = ''
} else if (this.key === 4) {
document.getElementById('numOne').click()
this.numTwo = ''
} else if (this.key === 5) {
document.getElementById('numTwo').click()
this.numThree = ''
} else if (this.key === 6) {
document.getElementById('numThree').click()
this.numFour = ''
} else if (this.key === 7) {
document.getElementById('numFour').click()
this.numFive = ''
} else if (this.key === 8) {
document.getElementById('numFive').click()
this.numSix = ''
}
},
addCar () {
var myApp = new Framework7()
var num
var str = document.getElementById('picker-str-date').value
var end = document.getElementById('picker-end-date').value
var bt = new Date(str.replace(/\-/g, '\/'))
var et = new Date(end.replace(/\-/g, '\/'))
if (!this.checkbox) {
num = this.areaName + this.areaLetter + this.numOne + this.numTwo + this.numThree + this.numFour + this.numFive
} else if (this.checkbox) {
num = this.areaName + this.areaLetter + this.numOne + this.numTwo + this.numThree + this.numFour + this.numFive + this.numSix
}
if (num === '') {
this.toastMessage('请输入车牌', 1000)
} else if (!this.checkbox && (this.areaName === '' || this.areaLetter === '' || this.numOne === '' || this.numTwo === '' || this.numThree === '' || this.numFour === '' || this.numFive === '')) {
this.toastMessage('请输入完整车牌', 1000)
} else if (this.checkbox && (this.areaName === '' || this.areaLetter === '' || this.numOne === '' || this.numTwo === '' || this.numThree === '' || this.numFour === '' || this.numFive === '' || this.numSix === '')) {
this.toastMessage('请输入完整车牌', 1000)
} else if (str !== '' && end !== '' && bt >= et) {
this.toastMessage('开始时间必须早于结束时间', 1000)
} else {
// const data = {
// vehiclenum: num
// }
// this.$http.post(ADD_VEHICLE, data).then(res => {
// if (res.data.ret === 0) {
// this.addedCarNum = num
// this.$router.push({name: 'AddSuccess', params: {addedCarNum: this.addedCarNum}})
// } else {
// this.$dialog.toast({mes:res.data.message,timeout:1200})
// }
// })
}
}
}
用vue写的移动端车牌号输入法的更多相关文章
- vue实战 - 车牌号校验和银行校验
在看这篇文章之前,我建议大伙可以去把项目demo拉到本地看看.如果觉得写得不好,可以一起提提issues,一起维护.或者大伙有刚需,可以留言,后期会不断完善. 使用方法: git clone http ...
- APICloud AVM框架 封装车牌号输入键盘组件
AVM(Application-View-Model)前端组件化开发模式基于标准Web Components组件化思想,提供包含虚拟DOM和Runtime的编程框架avm.js以及多端统一编译工具,完 ...
- Android中手机号、车牌号正则表达式
手机号 手机号的号段说明转载自:国内手机号码的正则表达式|蜗牛的积累 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130.131.132.134.135.136.137.138.139. ...
- 基于TensorFlow的车牌号识别系统
简介 过去几周我一直在涉足深度学习领域,尤其是卷积神经网络模型.最近,谷歌围绕街景多位数字识别技术发布了一篇不错的paper.该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统.然后,作者阐述 ...
- 【代码笔记】iOS-验证手机号,邮箱,车牌号是否合法
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- 按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。 创建第
package com.hanqi.test; public class jidongche { private String chepaihao;//车牌号 private int speed;// ...
- 车牌号对应归属地及城市JSON带简码
车牌号对应归属地及城市JSON带简码 car_city.json [ { "code": "冀A", "city": "石家庄&q ...
- (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。
package a; public class Jidongche { private String chepaihao; private int chesu; private double zaiz ...
- python的车牌号的检测
自己总结一下,从网上找到的关于车牌号的识别的一些博文.https://www.jianshu.com/p/fcfbd3131b84 https://www.cnblogs.com/do-hardwor ...
随机推荐
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
()post http://04101334.iteye.com/blog/637695/ ()get function serializeElement(element) { var method ...
- Android开发pool解析xml
xml在开发中的作用不可小觑,很多时候我们都要用到这种文件,所以学习它的解析方式很是必要. 我们都知道java中xml的解析有:dom,SAX,但是Android下我们使用pool解析,是更为方便,而 ...
- BAPI 关闭和删除PR
当PR在SAP里面已不再使用时,可使用批量使用以下两个BAPI进行处理: BAPI_REQUISITION_DELETE,进行删除处理, (速度快) BAPI_PR_CHANGE,进行关闭,但不删除( ...
- ARM WFI和WFE指令【转】
本文转载至:http://www.wowotech.net/armv8a_arch/wfe_wfi.html 1. 前言 蜗蜗很早以前就知道有WFI和WFE这两个指令存在,但一直似懂非懂.最近准备研究 ...
- UVALive3989 Ladies' Choice —— 稳定婚姻问题 Gale - Shapely算法
题目链接:https://vjudge.net/problem/UVALive-3989 题解: 题意:有n个男生和n个女生.每个女生对男神都有个好感度排行,同时每个男生对每个女生也有一个好感度排行. ...
- HDU2819 Swap —— 二分图最大匹配
题目链接:https://vjudge.net/problem/HDU-2819 Swap Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- OpenMediaVault 搭建git,ssh无法连接问题
/************************************************************************* * OpenMediaVault 搭建git,ss ...
- 使用Django.core.cache操作Memcached导致性能不稳定的分析过程
使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...
- 洛谷 P1072 Hankson 的趣味题 —— 质因数分解
题目:https://www.luogu.org/problemnew/show/P1072 满足条件的数 x 一定是 a1 的倍数,b1 的因数,a0/a1 与 x/a1 互质,b1/b0 与 b1 ...
- 【转】浏览器中输入url后发生了什么
原文地址:http://www.jianshu.com/p/c1dfc6caa520 在学习前端的过程中经常看到这样一个问题:当你在浏览器中输入url后发生了什么?下面是个人学习过程中的总结,供个人复 ...