带输入框的页面在进行布局的时候需要注意的几个点

带输入框的页面在平时开发的时候经常会碰到,最常见的比如登录,注册等页面。今天就拿一个基本的登录页面来讲下在给这类页面做布局的时候需要注意的几个问题。

1,靠近底部或者固定在底部的元素不要使用 fixed,absolute 等定位方式

如果使用了 fixed ,absolute 等方式将元素固定在底部,在 Android 中,当键盘弹起时,你会发现固定在底部的元素跟着键盘一起被顶上去了,顶上去了不说,还很有可能会出现挡住输入框的情况,

2,当有元素要固定在底部,又有剩余空间需要分配时,应该怎么布局

上面第一条说了,不要使用 fixed,absolute ,那么当出现这种情况时应该怎么布局,首先想到的肯定是 flex,在这里使用 flex 也有一点需要注意,

上图中的红框部分就是需要动态分配高度的剩余空间,在使用 flex 布局的时候,千万不要给红框部分设置 flex:1,如果是给红框部分设置 flex:1,在 Android 中当键盘弹起时,你会发现整个页面都挤在一起了,整个页面布局全部变形(根据手机屏幕高度变形情况有所不同)。

针对这种情况的解决方案就是,不要单独给剩余空间设置 flex:1,正确的做法是将底部固定元素之上的所有元素包在一个 div 中,给这个 div 设置 flex:1,这样既达到了布局目的,也不会出现布局被挤变形的问题。

3,带有 input 的元素不要使用 fixed 定位

这一条看起来跟第一条差不多,其实不然,第一条是针对于页面上部分有 input,底部有吸底元素的情况,而这一条说的是在任何情况下都尽量不要给带有 input 的元素使用 fixed 定位,特别是靠近页面底部的元素。

有过移动端 H5 开发经验的人可能都知道,在 ios 中,fixed 定位会有问题,特别是当带有 input 的元素使用 fixed 时,再特别的就是这个元素还要固定在底部时。

这是 ios 本身的问题,这么多年,ios 系统一直在更新,然而不支持 fixed 的问题还是一直存在,真不知道 ios 的那帮开发人员到底在干啥。

这个问题至今都没有一个算是完美和通用的解决方案,我们能够做的就是在平时的开发中注意,加以规避,如果能够说服产品和设计师让他们针对这个问题修改设计那就再好不过了,皆大欢喜。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 React Native 中,当键盘弹出时,会遮挡住输入框,这是一个常见的问题。你可以通过以下几种方式来解决: 1. 使用 KeyboardAvoidingView 组件 React Native 提供了 KeyboardAvoidingView 组件,可以自动调整页面布局,以避免键盘遮挡输入框。你可以将输入框放在 KeyboardAvoidingView 组件中,然后设置 behavior 属性来控制布局的调整方式。例如: ``` import { KeyboardAvoidingView, TextInput } from 'react-native'; <KeyboardAvoidingView behavior={'padding'} style={{ flex: 1 }}> <TextInput style={{ height: 40, borderColor: 'gray', borderWidth: 1 }} /> </KeyboardAvoidingView> ``` 2. 使用 ScrollView 组件 如果页面上有多个输入框,你可以将它们放在一个 ScrollView 组件中,并在键盘弹出时滚动到当前输入框的位置上。你可以使用 scrollTo 方法来实现这个功能。例如: ``` import { ScrollView, TextInput } from 'react-native'; class MyComponent extends React.Component { constructor(props) { super(props); this.state = { inputHeight: 40, }; this.scrollView = React.createRef(); this.textInput = React.createRef(); } componentDidMount() { this.keyboardDidShowListener = Keyboard.addListener( 'keyboardDidShow', this.keyboardDidShow ); this.keyboardDidHideListener = Keyboard.addListener( 'keyboardDidHide', this.keyboardDidHide ); } componentWillUnmount() { this.keyboardDidShowListener.remove(); this.keyboardDidHideListener.remove(); } keyboardDidShow = (event) => { const keyboardHeight = event.endCoordinates.height; const scrollResponder = this.scrollView.current.getScrollResponder(); const inputHandle = ReactNative.findNodeHandle(this.textInput.current); const inputPosition = this.state.inputHeight + 10; scrollResponder.scrollResponderScrollNativeHandleToKeyboard( inputHandle, inputPosition, true ); }; keyboardDidHide = () => { const scrollResponder = this.scrollView.current.getScrollResponder(); scrollResponder.scrollResponderScrollTo({ x: 0, y: 0, animated: true, }); }; render() { return ( <ScrollView ref={this.scrollView} keyboardDismissMode="interactive" contentContainerStyle={{ flexGrow: 1 }} > <TextInput ref={this.textInput} style={{ height: this.state.inputHeight }} onFocus={() => this.setState({ inputHeight: 100 })} onBlur={() => this.setState({ inputHeight: 40 })} /> <TextInput ref={this.textInput} style={{ height: this.state.inputHeight }} onFocus={() => this.setState({ inputHeight: 100 })} onBlur={() => this.setState({ inputHeight: 40 })} /> </ScrollView> ); } } ``` 在上面的例子中,我们使用 ScrollView 组件包裹了两个 TextInput 组件,并且在 KeyboardDidShow 和 KeyboardDidHide 事件中,调用了 ScrollView 组件的 scrollTo 方法来滚动到当前输入框的位置上。 以上是两种比较常用的解决方法,你可以根据具体的场景选择适合自己的方式来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值