微信小程序自定义键盘

2023-11-05

 效果图

 功能

  • 如果输入.直接补0.
  • 如果是09 直接是9
  • 如果是000那就有一个0
  • 不能大于6位
  • 小数点不能大于两位仅能出现一次
  • 还有不输入是禁止支付的
  • 不能小于0.01
  • 失去焦点隐藏面板
  • 光标问题有点小bug 望大佬指点

完整代码

wxml

<view class="page_box" catchtap="hindKeyboard">
    <view class="input_view" catchtap="hindKeyboard">
        <text class="title">收款金额:</text>
        <view class="input_box" catchtap="showKeyboard">
            <text class="input_label">¥</text>
            <view class="content" wx:if="{{content.length}}">
                <view wx:for="{{content}}" wx:key="index" data-str-index="{{index + 1}}" catchtap="getStrPosition">
                    <view class="number-block">
                        {{item}}
                        <!-- 光标 -->
                        <view class="cursor cursor-insert" wx:if="{{cursorIndex === index + 1}}"></view>
                    </view>
                </view>
            </view>
            <view class="cursor" wx:if="{{!cursorIndex}}"></view>
            <text class="default-content" wx:if="{{!content.length}}">{{defaultContent}}</text>
        </view>
    </view>
    <!-- 键盘 -->
    <view class="keyboard {{keyShow&&'hind_box'}}">
        <view class="key-box">
            <view class="number-box clearfix">
                <view wx:for="{{KeyboardKeys}}" wx:key="*this" data-keys="{{item}}" class="key {{ index === 9 ? 'key-zero' : ''}}" hover-class="number-box-hover" catchtap="keyTap">
                    {{item}}
                </view>
            </view>
            <view class="btn-box">
                <!-- TODO: 需要替换成删除icon -->
                <view class="key" hover-class="number-box-hover" data-keys="<" catchtap="keyTap">
                    X
                </view>
                <view class="key pay_btn {{payMoney ? '' : 'pay-btn-display'}}" hover-class="pay-btn-hover" catchtap="handlePay">
                    付款
                </view>
            </view>
        </view>
    </view>
</view>

wxss

page {
    background: #f3f7f7;
    height: 100%;
}

.page_box {
    width: 100%;
    height: 100%;
    background: #f3f7f7;
    overflow: hidden;
}

.input_view {
    width: 700rpx;
    height: 500rpx;
    background: #fff;
    margin: 25rpx auto;
    border-radius: 10rpx;
    padding: 40rpx;
    box-sizing: border-box;
}

.title {
    display: block;
    line-height: 90rpx;
    font-size: 30rpx;
    color: #aaa;
}

.input_box {
    display: flex;
    align-items: center;
    padding: 20rpx 0;
    height: 90rpx;
    border-bottom: 1px solid #efefef;
}

.input_label {
    font-size: 35rpx;
    font-weight: bold;
    margin-right: 5rpx;
}

.content {
    display: flex;
    font-size: 80rpx;
    line-height: 90rpx;
    font-weight: 700;
}

.number-block {
    position: relative;
}

/* 光标 */
.cursor-insert {
    position: absolute;
    top: 0rpx;
    right: -1rpx;
}

.cursor {
    width: 2rpx;
    height: 90rpx;
    background: #666;
    border-radius: 6rpx;
    animation: twinkling 0.9s infinite;
}

@-webkit-keyframes twinkling {
    0% {
        background: #fff;
    }

    100% {
        background: #666;
    }
}

.default-content {
    color: #999;
    font-size: 38rpx;
    font-weight: 600;
}

/* 键盘 */
.keyboard {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 999;
    height: 0;
    background: #f7f7f7;
    transition: height 0.3s;
}

.hind_box {
    height: 456rpx;
}

.key-box {
    display: flex;
    padding-left: 16rpx;
    padding-bottom: 16rpx;
    padding-bottom: calc(16rpx + constant(safe-area-inset-bottom));
    padding-bottom: calc(16rpx + env(safe-area-inset-bottom));
}

.number-box {
    flex: 3;
}

.number-box .key {
    float: left;
    margin: 16rpx 16rpx 0 0;
    width: calc(100% / 3 - 16rpx);
    height: 90rpx;
    border-radius: 10rpx;
    line-height: 90rpx;
    text-align: center;
    font-size: 40rpx;
    font-weight: bold;
    background-color: #fff;
}

.number-box .key.key-zero {
    width: calc((100% / 3) * 2 - 16rpx);
}

.keyboard .number-box-hover {
    /* 临时定义颜色 */
    background-color: #e1e1e1 !important;
}

.btn-box {
    flex: 1;
}

.btn-box .key {
    margin: 16rpx 16rpx 0 0;
    height: 90rpx;
    border-radius: 10rpx;
    line-height: 90rpx;
    text-align: center;
    font-size: 40rpx;
    font-weight: bold;
    background-color: #fff;
}

.btn-box .pay_btn {
    height: 298rpx;
    line-height: 298rpx;
    font-weight: normal;
    background-color: #1AAD19;
    color: #fff;
    font-size: 32rpx;
}

.btn-box .pay_btn.pay-btn-display {
    background-color: #9ED99D !important;
}

.btn-box .pay_btn.pay-btn-hover {
    background-color: #179B16;
}

js

// pages/inputs/inputs.js
Page({
  data: {
    content: [], // 输入的金额
    payMoney: '', // 支付金额
    defaultContent: '请输入', // 默认内容
    KeyboardKeys: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.'],
    keyShow: true,  // 是否展示键盘
    cursorIndex: '', // 插入光标位置
  },
  //点击界面键盘消失
  hindKeyboard() {
    this.setData({ keyShow: false });
  },
  //点击输入框,键盘显示
  showKeyboard() {
    this.setData({ keyShow: true });
  },
  // 获取插入光标位置
  getStrPosition(e) {
    let { strIndex } = e.currentTarget.dataset
    this.setData({ cursorIndex: strIndex })
  },
  keyTap(e) {
    let { keys } = e.currentTarget.dataset,
      content = this.data.content.join(''),   // 转为字符串
      strLen = content.length,
      { cursorIndex } = this.data
    switch (keys) {
      case '.':
        if (content.indexOf('.') === -1) {   // 已有一个点的情况下
          content.length < 1 ? content = '0.' : content += '.'
        }
        break
      case '<':
        if (cursorIndex > 0 && cursorIndex !== strLen) {
          // 从插入光标开始删除元素
          this.data.content.splice(cursorIndex - 1, 1)
          content = this.data.content.join('')
        } else {
          content = content.substr(0, content.length - 1)
        }
        if (!strLen || cursorIndex === strLen) {    // 插入光标位置重置
          this.setData({ cursorIndex: '' })
        }
        // 删除点 组件中可以用Observer监听删除点和删除0的情况
        if (content[0] === '0' && content[1] !== '.') {
          content = content.substr(1, content.length - 1)
        }
        if (content[0] === '.') {
          content = '0' + content
        }
        break
      default:
        let spotIndex = content.indexOf('.')          //小数点的位置
        if (content[0] === '0' && content[1] !== '.') {
          content = content.substr(1, content.length - 1)
        }
        if ((spotIndex === -1 || strLen - spotIndex !== 3)) {  //小数点后只保留两位
          content += keys
        }
        break

    }

    if (content <= 100000) {
      this.setData(
        {
          content: content.split(''),// 转为数组
          payMoney: content // 支付金额
        }
      )
    } else {
      wx.showToast({
        title: '支付金额不能大于100000',
        icon: 'none',
        duration: 1500,
      })
    }
  },
  handlePay() {
    const { payMoney } = this.data
    if (payMoney === '') return
    if (payMoney < '0.01') {
      wx.showToast({
        title: '支付金额不能小于0.01',
        icon: 'none',
        duration: 1500,
      })
      return
    }
    console.log(Number(payMoney), '付款')
  }


})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序自定义键盘 的相关文章

  • Java使用POI操作Excel合并单元格

    合并单元格的方法 指定 4 个参数 起始行 结束行 起始列 结束列 然后这个区域将被合并 CellRangeAddress region new CellRangeAddress startRow endRow startCol endCo
  • 某站webpack打包JS逆向,keyCipher、keySM2Cipher参数分析

    文章目录 前言 一 抓包分析 二 参数解析 1 加密定位 2 参数分析 三 响应解密 1 加密定位 总结 前言 今天来水一篇文章 某站webpack打包类型 登录 数据解密参数keyCipher keySM2Cipher 本文章仅供学习研究
  • 11. 实战:bs4法抓取网页图片并保存到本地文件夹

    前言 我们通过前面几节的学习已经了解到bs4模块对于我们抓取网页的方便之处 也通过一个实例实践了抓取某网站菜价 本节我们以某图片网为例 链接放评论区 实现抓取唯美壁纸栏目的内容并保存到本地文件夹 目标 思路 1 获取所有子页面链接地址 2
  • 数据库系统之函数依赖

    Functional Dependencies 什么是函数依赖 如何发现关系表中的函数依赖关系 函数依赖关系与对象的类 功能依赖与关联 函数依赖性的派生 阿姆斯特朗公理 Armstrong axioms 其他的推理规则 References
  • python如何学习(三)

    最近开始整理python的资料 博主建立了一个qq群 希望给大家提供一个交流的同平台 78486745 一 第一个Python程序 HelloWorld python的第一个程序也从hello world开始吧 usr bin env py
  • linux ipv6内核编译,linux ipv6内核设置

    linux ipv6内核设置 进入 proc sys net ipv6 conf all forwarding Type BOOLEAN 在两个接口之间进行global IPv6 forwarding 数据包转发 IPv6 当中您不能单独控
  • 使用 tf-idf 提取关键词

    tf idf 的简要介绍 tf term frequency 某个关键词在整篇文档中出现的频率 idf inverse document frequency 逆文档频率 某个词在所有文档中出现的频率 tf 公式 t f i j n i j

随机推荐

  • [C++11] nullptr 和 NULL

    在工作中 避免产生 野指针 最有效的方法 是以下两点 1 在定义指针的同时完成初始化操作 即便该指针的指向尚未明确 也要将其初始化为空指针 2 在delete释放该指针后 对该指针赋值为空指针 C 11 新增关键字 nullptr 专门用来
  • jmeter之接口数据与数据库数据检验!

    前言 本文讲解使用jmeter测试接口 然后与数据库里面的数据进行校验对比 本节使用一个新增数据的接口 新增一条数据 然后在数据库里面进行查询 是否能够查询到此条数据 一 接口环境搭建 1 1 新建一个http请求 写好请求的内容 我的大概
  • JavaEE 笔记03:基于Vue,SpringBoot的前后端分离的简单作业管理系统

    基于Vue SpringBoot的前后端分离的简单作业管理系统 目录 基于Vue SpringBoot的前后端分离的简单作业管理系统 前言 环境 开发环境 部署环境 功能展示 登录与注册 学生 学生首页 学生查看作业列表 学生提交作业 学生
  • Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本

    前言 Puppeteer已经听说过很多次了 也见过一些与之相关的文章 但是一直没怎么研究过 现在来简单学习一下 简介 Puppeteer 是一个 Node 库 它提供了一个高级 API 来通过 DevTools 协议控制 Chromium
  • 前端学习——html

    1 页面标签包含在里 其中有头和躯干 一 head里的常用标签设置 meta标签的设置 在网页中 meta标签最常用的设置是用来设置字符集
  • 静态和动态类型编程语言的区别

    静态和动态是针对变量的数据类型而言的 区别如下 1 使用静态类型语言编写的代码中 要声明变量的数据类型 而且不同数据类型的变量不允许直接赋值 它的数据类型是编译期间进行检查的 2 静态类型语言在使用变量之前 需要为它们分配好内存 3 静态类
  • python画折线图两种写法

    import matplotlib pyplot as plt from openpyxl import load workbook 这个是从Excel表格中导入数据 为了让中文不显示成乱码 plt rcParams font sans s
  • java中锁的面试题

    1 synchronized锁 悲观锁 同步锁 synchronized关键字 表示 同步 的 它可以对 多行代码 进行 同步 将多行代码当成是一个完整的整体 一个线程如果进入到这个代码块中 会全部执行完毕 执行结束后 其它线程才会执行 这
  • Linux学习整理-网络命令集

    目录 前提 1 机器IP地址查询 1 1 ifconfig 1 1 1 安装包 1 1 2 执行命令 1 1 3 拓展 ifconfig的其它用法 1 1 4 常用的属性说明 1 2 ip addr 1 2 1 查看IP地址 1 2 2 其
  • 【实战】区块链技术如何应用于金融领域?

    信任是金融业的基础 为维护信任 金融业的发展催生了大量的中介机构 包括托管机构 第三方支付平台 公证人 银行等 然而 中介机构处理信息依赖人工 且交易信息往往需要经过多道中介的传递 这使得信息出错率高 且效率低下 同时 人们也通常认为权威机
  • Python进阶系列:(八)python反射

    文章目录 前言 一 反射 总结 前言 Python系列文章主要是记录自己学习成果及知识输出整合 提供一个温故而知新的场所 一 反射 1 什么是反射 把字符串映射到实例的变量或实例的方法 只通过字符串调用类中的变量或方法 反射的本质 核心 利
  • 20230830—图形设计

    include app h include
  • C++(函数重载和函数模板)

    重载和模板 一 函数重载 1 函数重载定义 2 判断函数重载的规则 2 名字粉碎 名字修饰 3 C 编译时函数名修饰约定规则 4 C 函数是重载 二 函数模板 一 函数重载 1 函数重载定义 在C 中可以为两个或两个以上的函数提供相同的函数
  • 十三、断路器-Hystrix 的隔离策略

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net dengqiang123456 article details 75935122 说明 1 Hystrix 通过舱壁模式来隔离限制依赖的并发量和阻塞
  • 探索创意之旅:打造个人网页的精彩奇遇

    在茫茫的网络世界里 我找到了一个属于自己的小天地 那里不仅有我独特的创意 还有我内心深处的声音 我的个人网页是一段关于探索创意之旅的故事 让我带你一窥我在这个奇妙旅程中的所见所闻 声明 这个网页是使用React18 x写的 由于我平常都是使
  • MATLAB 画常见二次曲面汇总

    一 螺旋线 1 静态螺旋线 a 0 0 1 20 pi h plot3 a cos a a sin a 2 a b linewidth 2 axis 50 50 50 50 0 150 grid on set h erasemode non
  • netbeans的UI代码重新打开可视化视图

    netbeans重新打开可视化视图 视图 gt 编辑器 gt 设计
  • AJAX同步和异步

    1 AJAX 简介 1 1同步和异步 一 同步与异步 1 同步 顺序执行 优点 静态预判结果可控 缺点 耗时任务阻塞执行 2 异步 乱序执行 优点 不会阻塞代码 体验好 缺点 顺序不可控 以银行排队办业务为例 1 同步 默认排队叫号 依次办
  • [LeetCode] 01矩阵中最大矩形 Maximal Rectangle

    相关问题1 LeetCode Find max subsquare whose border values are all 1 相关问题2 LeetCode 01矩阵中最大正方形 Maximal Square Given a 2D bina
  • 微信小程序自定义键盘

    效果图 功能 如果输入 直接补0 如果是09 直接是9 如果是000那就有一个0 不能大于6位 小数点不能大于两位仅能出现一次 还有不输入是禁止支付的 不能小于0 01 失去焦点隐藏面板 光标问题有点小bug 望大佬指点 完整代码 wxml