height #

便捷的高度盒子。

<n-height height="status-nav-32rpx"></n-height>

Props #

Prop name Description Type Values Default
flex 布局方式 string - 'column'
justify justify 主题 -
align align 主题 -
bgType 背景主题 string - ''
border 边框主题 string - ''
radius 圆角主题 string - ''
height 链式高度:status-nav-32rpx string - '0'
boxStyle 外层样式 string - ''

Slots #

Name Description Bindings
default

为什么引入一些高度计算 #

在uniapp开发中,对于nvue-app,我们都是直接使用flex布局来决策子组件的高度。

但是在其他端,在自定义组件下,利用flex布局决策子组件的高度时有问题,尤其是在小程序上。

而且在nvue-app下,复杂的组件,我们也难免会需要直接使用固定的高度。

这个时候,我们难免会用到一些与高度相关的值。比如:屏幕高度、窗口高度、状态栏高度、底部安全区高度等。

正常情况下,我们可以有几个选择:

  • 非nvue-app下,我们可以利用css的calc函数来实现,比如:height:calc(100%-100rpx);但是在nvue-app端,百分比高度是不支持的;
  • 非nvue-app下,我们可以使用css变量--status-bar-height--window-top--window-bottom等。具体为:css变量 (opens new window)
  • 对于安全区的适配,非nvue-app页面可以使用css常量constant(safe-area-inset-bottom)env(safe-area-inset-bottom)等来适配,比如:padding-bottom: constant(safe-area-inset-bottom);padding-bottom: env(safe-area-inset-bottom);。但是nvue-app下不支持。css常量 (opens new window)
  • 直接使用一些高度值来控制某个盒子的高度。比如::style="{height: statusbarHeight+'px'}"

我们这里,为了方便您各端统一使用,减少差异配置,给出了各种可能需要用到的高度。其他方法自己可以灵活选择。

具体代码与可用函数在utils/system.js下。

屏幕高度:getScreenHeight #

  • 屏幕的高度,您可以直接通过getScreenHeight方法获取到;
  • 该高度也会缓存进入app.globalData,它会根据需要获取高度或者拉取缓存;

可用窗口高度:getWindowHeight #

  • 页面可用窗口(内容可见区域(不包含系统自带的状态栏、导航栏和tabbar))的高度,不同的页面可能会不一样;
  • 我们没有主动缓存该高度,用户可以自行缓存:app.globalData.windowHeight = 500
  • 如果您缓存窗口高度,希望您能知道什么时候这个高度是对的/可用的,什么时候需要重新拉取获取窗口高度;
  • getWindowHeight方法默认每次都是重新拉取systemInfo,如果您需要缓存请自行缓存,缓存之后该方法会直接获取缓存;
  • 还提供了getWindowHeightAsync方法来异步获取窗口高度,Promise封装;
getWindowHeightAsync.then(h => {
	// do your logic here
	// h is the window height
}).catch(err => {
	
})

状态栏高度:getStatusBarHeight #

  • 状态栏的高度,也就是安全区的topInset,通过getStatusBarHeight获取;
  • 该高度会缓存进入app.globalData.statusBarHeight

导航栏的高度:getNavBarHeight #

  • 我们默认导航栏高度是44px,如果您需要覆盖该值,请在app.globalData.navBarHeight下设置,比如:app.globalData.navBarHeight = 44
  • 在自定义导航栏的时候,我们需要用到这个高度来进行一些辅助高度决策,比如自定义导航栏下,我们计算剩下的页面窗口的高度;
  • 如果您需要用到这个值,而且它不是44px,请自行在app.globalData下设置navBarHeight
  • 在使用原生导航栏的时候,我们一般不会用到这个值,原生导航栏我们一般使用windowHeight来做决策,这样不需要使用导航栏高度;

tabbar的高度:getTabBarHeight #

  • 默认这个高度是0;
  • tabbar的高度默认不会进行缓存,我们也很难在组件库里面计算得到,而且也不应该由我们计算得到;
  • 不同的小程序tabbar的高度可能是不一样的,所以如果您需要这个实际高度,请根据自己的tabbar的页面实际设计情况进行获取;
  • 自定义的tabbar一般设置为50px高度,nvue-app自带的tabbar默认也是50px高度;
  • 该值只在tabbar页面使用,一般用不到这个值,需要自己先计算得到,然后缓存进入app.globalDatatabBarHeight下,不缓存就是0;

底部安全区的高度:getXBarHeight #

  • 仅仅在iOS下该高度可能不为0;
  • 底部安全区的高度,会自动帮您计算和缓存,可以通过getXBarHeight获取;
  • 会自动缓存到app.globalData下的xBarHeight中;
  • nvue-app下,安全区的高度css变量/常量不可用,所以直接使用高度盒子来替代css变量/常量;

总结 #

其实,我们需要使用的高度,上面都有帮您处理或者告诉您如何处理。总结如下:

  • 屏幕高度是固定的,为您进行了缓存:getScreenHeightapp.globalData.screenHeight
  • 窗口高度是变化的,不会自动缓存,如果您没有手动缓存,每次都会重新获取系统信息,您可以根据实际项目情况缓存:getWindowHeightapp.globalData.windowHeight
  • 状态栏高度是固定的,为您进行了缓存:getStatusBarHeightapp.globalData.statusBarHeight
  • 导航栏高度默认缓存了44pxgetNavBarHeightapp.globalData.navBarHeight。非自定义模式下,一般不需要用到这个高度,自定义导航栏的时候,请设置自己自定义的高度;
  • tabbar的高度默认是0:getTabBarHeightapp.globalData.tabBarHeight。原生情况下一般不需要使用这个高度,自定义情况下,请自行设置合适的值;
  • 底部安全区的高度是固定的,一般是34px或者0,我们为您自动获取:getXBarHeightapp.globalData.xBarHeight

规则与示范 #

一个内容的高度再怎么变化,无非也就是这些单独的高度,或者这些高度的组合。您可以根据自己的页面设计/选择来使用不同的组合来决策高度

我们提供了getHeight方法来辅助计算,对应规则如下:

  • screen:getScreenHeight
  • window:getWindowHeight
  • status:getStatusBarHeight
  • nav:getNavBarHeight
  • tab:getTabBarHeight
  • x:getXBarHeight
  • 支持组合,-相接。比如:status-nav表示状态栏高度 + 导航栏高度
  • 支持符号,!表示减去。比如:screen-!status-!nav表示屏幕高度 - 状态栏高度 - 导航栏高度
  • 里面还内置了一个rpx->px的转换函数:getPx
  • getPx接受一个字符串或者数值,不带单位默认为rpx

screen-!status-!nav-!50px-!x-!120rpx代表:屏幕高度 - 状态栏高度 - 导航栏高度 - 50px - 底部安全区 - 120rpx

x-120rpx代表:底部安全区 + 120rpx

大部分需要灵活设置高度的组件,我们都开放了height变量(一般nvue-app下不开放,直接使用flex布局实现)。

我们还提供了一个n-height组件来配合使用:

<n-height height="status-nav-32rpx"></n-height>