uniapp 实现点击图标按钮使 input 框聚焦

最近使用uniapp做一个评论的功能,遇到一个需求就是点击上面的评论图标,让定位在底部的input框聚焦,使软键盘弹出来,这个需要是常见的功能,下面是具体的实现步骤。

具体要实现的功能就是点击评论按钮,让底部的 input 框聚焦。

 其实实现的思路很简单,只需要在点击评论图标时改变 input 框的 focus 属性就可以了

// 评论的图标 
<u-icon class="comment" name="chat" size="24px" @click="showInput()"></u-icon>
// 固定定位到底部的input框
<u--input class="input" placeholder="快留下精彩的评论吧 ~" :focus="Focus"></u--input>
export default {
    data() {
      return {
         Focus:false
      };
    },
    methods:{
      showInput(){
        this.Focus = true;
      }
    }
  }

以上代码就可以实现上述的功能,但是发现有一个问题就是,这个方法只能触发一次,是因为当点击图标以后,Focus 的值已经变成 true 了,所以当你再次点击图标的时候,就不会出现效果了。解决办法就是获取软键盘的位置,如果软键盘的位置变为 0 的话,就让 Focus 的值变为 false 就解决了,下面是具体的代码。

export default {
    data() {
      return {
         Focus:false
      };
    },
    methods:{
      showInput(){
        this.Focus = true;
        // 获取软键盘的高度
        uni.onKeyboardHeightChange(res => {
          console.log(res.height);
          if(res.height === 0){
              this.Focus = false;
          }
        })
      },
    }
  }

好了,据此就可以点击按钮实现 input 框的聚焦啦,希望对大家有用,再见啦!

<think>好的,用户想要在UniApp实现一个美观的注册页面,需要示例代码和设计建议。首先,我需要回顾一下用户之前的问题,他们提到过基于UniApp的鲜花预定APP的设计与实现,所以可能希望注册页面与鲜花相关,风格清新优雅。 首先,设计方面要考虑UI元素。颜色搭配应该符合鲜花主题,可能使用粉色、绿色等自然色调。图标方面,可以使用字体图标,比如用户名用用户图标,密码用锁图标,增加视觉提示。布局方面,采用居中卡片式设计,让表单看起来整洁,同时背景图可以增加美观度。 接下来是交互优化。输入需要有明确的验证提示,比如非空检查和密码格式验证。按钮点击效果和加载状态可以提升用户体验,防止重复提交。此外,可能需要集成第三方登录,比如微信或QQ,但用户当前问题可能先关注基础注册功能,所以这部分可以作为扩展建议。 代码实现部分,需要使用Vue语法,因为UniApp基于Vue.js。结构部分用view组件布局,表单使用input和button组件。样式方面,使用Flex布局确保兼容性,背景图需要绝对定位覆盖整个页面。逻辑部分包括表单验证、提交处理,以及跳转到登录页面。 需要确保代码示例符合UniApp的规范,比如使用rpx单位适配不同屏幕,图标使用uni-icons组件。同时,要提到关键点,比如颜色搭配、输入验证、用户体验,以及可能的扩展功能,如短信验证和第三方登录。 最后,生成的相关问题需要围绕UniApp的UI设计、表单验证优化、第三方登录集成和主题颜色配置,这些都是用户在实现注册页面后可能进一步探索的方向。</think>### UniApp实现美观注册页面的设计要点及代码示例 #### 一、设计要素解析 1. **色彩搭配**:采用渐变色背景提升视觉层次感,建议使用$linear-gradient(135deg, #FFB6C1 0%, #FF69B4 100%)$的粉色调符合鲜花主题[^1] 2. **布局结构**:使用卡片式设计+底部波浪背景,核心代码采用`<view class="container">`嵌套`<view class="card">` 3. **交互细节**: - 输入聚焦时的动态边效果 -图标前缀的输入(使用`uni-icons`组件) - 按钮点击波纹动画 #### 二、完整示例代码 ```html <template> <view class="container"> <!-- 背景波浪图 --> <image src="/static/wave.png" class="wave-bg"></image> <!-- 注册卡片 --> <view class="card"> <text class="title">鲜花会员注册</text> <!-- 输入--> <view class="input-group"> <uni-icons type="person" size="22" color="#FF69B4"></uni-icons> <input placeholder="请输入手机号" v-model="mobile" @focus="inputFocus(1)" :class="['input', activeIndex===1 ? 'active' : '']"/> </view> <view class="input-group"> <uni-icons type="locked" size="22" color="#FF69B4"></uni-icons> <input placeholder="设置登录密码" password v-model="password" @focus="inputFocus(2)" :class="['input', activeIndex===2 ? 'active' : '']"/> </view> <!-- 注册按钮 --> <button class="register-btn" hover-class="btn-hover" @click="handleRegister"> {{ loading ? '注册中...' : '立即注册' }} </button> <view class="agreement"> 注册即代表同意<text class="link">《用户协议》</text> </view> </view> </view> </template> <script> export default { data() { return { mobile: '', password: '', activeIndex: 0, loading: false } }, methods: { inputFocus(index) { this.activeIndex = index }, async handleRegister() { if (!this.mobile || !this.password) { return uni.showToast({ title: '请填写完整信息', icon: 'none' }) } this.loading = true // 调用注册接口 setTimeout(() => { this.loading = false uni.navigateTo({ url: '/pages/login/login' }) }, 1500) } } } </script> <style lang="scss"> .container { height: 100vh; background: linear-gradient(135deg, #FFB6C1 0%, #FF69B4 100%); position: relative; .wave-bg { position: absolute; bottom: 0; width: 100%; height: 200rpx; } .card { width: 85%; background: rgba(255,255,255,0.95); border-radius: 20rpx; padding: 40rpx; position: absolute; top: 200rpx; left: 50%; transform: translateX(-50%); box-shadow: 0 10rpx 30rpx rgba(0,0,0,0.1); .title { display: block; text-align: center; font-size: 38rpx; color: #FF69B4; margin-bottom: 60rpx; } .input-group { display: flex; align-items: center; margin-bottom: 40rpx; border-bottom: 2rpx solid #eee; padding: 20rpx 0; .input { flex: 1; margin-left: 20rpx; font-size: 28rpx; transition: all 0.3s; } .active { border-color: #FF69B4; } } .register-btn { background: #FF69B4; color: white; border-radius: 50rpx; margin-top: 60rpx; &.btn-hover { opacity: 0.9; } } .agreement { text-align: center; margin-top: 40rpx; color: #666; .link { color: #FF69B4; margin-left: 10rpx; } } } } </style> ``` #### 三、关键实现技巧 1. **动效增强**:通过`:class`动态绑定实现输入聚焦时的边颜色变化 2. **视觉分层**:使用`z-index`控制背景图与卡片层级关系 3. **表单验证**:实现基础的非空检查(可扩展短信验证码功能) 4. **用户体验**:按钮添加`hover-class`交互反馈和加载状态 #### 四、扩展建议 1. 增加图形验证码组件(参考`<image>`+点击刷新功能) 2. 集成短信验证码倒计时功能(使用`uni-countdown`组件) 3. 添加第三方登录入口(微信/QQ快速注册) 4. 实现密码强度实时检测(正则表达式验证)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M_emory_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值