Taro实现兼容H5的沉浸式页面

什么是沉浸式页面

以小程序为例

默认情况下小程序页面自带导航栏,页面内容不会覆盖到导航栏上面

将页面属性navigationStyle设置为custom,可以隐藏导航栏,从而实现页面侵入到状态栏的效果。

这就是沉浸式页面

Taro的沉浸式页面

Taro支持编译成小程序和web页面,小程序沉浸式页面上面已提及,那web页面呢?

web页面是渲染在webview里面的,因此webview是否有导航栏,能否覆盖到状态栏上面,是宿主环境控制的,大部分情况下,浏览器都是自带导航栏,因此web页面其实是做不了沉浸式页面的。

因此,我们只需要做好小程序页面的沉浸式设计,并且保证web页面正常展示即可。

沉浸式页面的问题

小程序沉浸式页面只需要一行代码

ts 复制代码
definePageConfig({
  navigationStyle: 'custom'
})

我们看看小程序和web页面展示效果

小程序页面

web页面

可以看到,web和小程序都没有导航栏,并且小程序页面还覆盖到了状态栏上面。

所以,需要解决的问题是实现自定义导航栏,并且预留出状态栏高度。

实现

  • 我们可以实现固定布局的导航栏,如果是小程序的话,导航栏顶部还要预留状态栏高度的内边距。
  • 由于导航栏是固定布局,页面顶部还需要预留一部分高度等于导航栏的空间,避免页面被导航栏覆盖。我实现的方式是在导航栏组件内预留一个正常布局的元素,高度等于导航栏,这样在在页面中引入导航栏即可,不用再额外改页面样式。

获取状态栏高度

通过Taro.getWindowInfo可以获取状态栏高度statusBarHeight

导航栏组件

tsx 复制代码
export default function ImmersionNavigation(props: {
  navigationHeight?: number
  backgroundColor?: string
  children: any
}) {
  const statusBarHeight = isH5 ? 0 : Taro.getWindowInfo()?.statusBarHeight ?? 0
  const navigationHeight = props.navigationHeight || 50
  // 若状态栏文字颜色为白色,需要设置背景颜色
  const backgroundColor = props.backgroundColor || 'white'
  // 沉浸式导航栏高度=状态栏高度+导航栏高度
  const height = statusBarHeight + navigationHeight
  const children = props.children
  const mainStyles: CSSProperties = {
    height: height + 'px',
    backgroundColor,
    paddingTop: statusBarHeight + 'px',
    boxSizing: 'border-box',
    position: 'fixed',
    top: '0px',
    left: '0px',
    right: '0px',
    display: 'flex',
    alignItems: 'center'
  }
  return (
    <>
      {/* 固定布局吸顶,嵌入自定义的子元素作为标题 */}
      <View style={mainStyles}>{children}</View>
      {/* 静态布局,放在文档中撑起沉浸式页面顶部高度 */}
      <View style={{ height: height + 'px' }}></View>
    </>
  )
}

页面组件

tsx 复制代码
import { View } from '@fower/taro'
import ImmersionNavigation from '@/components/ImmersionNavigation'

definePageConfig({
  navigationBarTitleText: '首页',
  navigationStyle: 'custom', // 自定义导航栏
  navigationBarTextStyle: 'black' // 导航栏文字颜色为黑色
})

export default function Index() {
  return (
    <View>
      <ImmersionNavigation>
        <View style={{ marginLeft: 'auto', marginRight: 'auto' }}>首页</View>
      </ImmersionNavigation>
    </View>
  )
}

看看效果

小程序页面

web页面

End

相关推荐
GISer_Jing6 分钟前
Taro+React跨端开发实战指南
react.js·arcgis·taro
玉木成琳1 天前
Taro + React + @nutui/nutui-react-taro 时间选择器重写
前端·react.js·taro
Danny_FD2 天前
使用Taro实现微信小程序仪表盘:使用canvas实现仪表盘(有仪表盘背景,也可以用于Web等)
前端·taro·canvas
具***76 天前
探索谷歌最新时间序列预测模型 TSMixer
taro
一只一只妖10 天前
Taro+Vue3+TS+Vite 小程序开发底座搭建流程
vue.js·小程序·taro
Light6015 天前
用一个 Vue 中间件统一 UniApp 与 Taro:契约驱动的双栈方案
vue.js·uni-app·uniapp·taro·vue中间件·跨端适配·契约驱动
禁止摆烂_才浅20 天前
Taro 小程序页面返回传参完整示例
react.js·微信小程序·taro
S***q1921 个月前
JavaScriptWebSocket案例
51单片机·3dsmax·taro
凹润之之之1 个月前
使用canvas处理图片,实现放大缩小增加标注功能
taro·canvas
aiguangyuan1 个月前
Taro 开发快速入门手册
taro·前端开发·移动端开发