当前位置:   article > 正文

uniapp封装自定义头部_uniapp 自定义头部

uniapp 自定义头部

兼容h5和微信小程序自定义头部,动态设置固定定位、定位时是否占位、背景透明度、背景颜色、点击事件、是否包含系统栏、分割线、自定义样式

有更好的建议或需求欢迎指出,谢谢

  1. <template>
  2. <view>
  3. <view v-if="isStatusBar" class="status-bar" :style="'height:'+statusBarHeight+'px'">
  4. <!-- 状态栏背景,设置为不透明 -->
  5. </view>
  6. <view v-if="isFixed && isOccupy" class="top-header" :style="'height:'+topHeight+'px'">
  7. <!-- 头部占位 -->
  8. </view>
  9. <view v-else-if="isStatusBar" class="top-header" :style="'height:'+statusBarHeight+'px'">
  10. <!-- 状态栏占位 -->
  11. </view>
  12. <!-- 头部 -->
  13. <view class="nav-bar flex" :class="{ 'activeIsFixed': isFixed }" :style="getNavBarStyle">
  14. <view class="back flex" v-if="isBack" @click="back" :style="iconWH">
  15. <view class="iconfont icon-31fanhui1"></view>
  16. </view>
  17. <view class="left flex" v-else-if="!onlyCenter" @click="leftClick" :style="iconWH">
  18. <slot name="left"></slot>
  19. </view>
  20. <view class="center flex" :class="isOnlyCenter" :style="'height:'+navbarHeight+'px'">
  21. <slot></slot>
  22. </view>
  23. <view class="right flex" @click="rightClick" v-if="!onlyCenter" :style="iconWH">
  24. <slot name="right"></slot>
  25. </view>
  26. </view>
  27. </view>
  28. </template>
  29. <script>
  30. /**
  31. * NavBar 自定义头部
  32. * @description 头部组件,主要用于头部导航
  33. * @property {Number, String} color 图标和文字颜色
  34. * @property {String} isBack 是否显示返回按钮
  35. * @property {Boolean} isFixed 是否固定顶部
  36. * @property {Boolean} onlyCenter 是否只显示中间部分
  37. * @property {String} bgColor 背景颜色
  38. * @property {Number} opacity 背景透明度
  39. * @property {Boolean} isOccupy 固定时默认占位
  40. * @property {Boolean} isStatusBar 默认包含系统状态栏
  41. * @property {Boolean} isSplitLine 头部分割线
  42. * @property {String} splitLineColor 头部分割线颜色
  43. * @property {Number} splitLineHeight 头部分割线高度
  44. * @property {String} styleSelf 自定义样式
  45. * @event {Function} back 返回
  46. * @event {Function} leftClick 左侧点击事件
  47. * @event {Function} rightClick 右侧点击事件
  48. */
  49. export default {
  50. name: "Header",
  51. data() {
  52. return {
  53. // 状态栏高度
  54. statusBarHeight: 0,
  55. // 状态栏加头部高度
  56. topHeight: 0,
  57. };
  58. },
  59. props: {
  60. // 头部高度
  61. navbarHeight: {
  62. type: [Number, String],
  63. default: 42
  64. },
  65. // 显示返回按钮
  66. isBack: {
  67. type: [Boolean, String],
  68. default: false
  69. },
  70. // 是否固定定位
  71. isFixed: {
  72. type: [Boolean, String],
  73. default: true
  74. },
  75. // 是否只显示中间部分
  76. onlyCenter: {
  77. type: [Boolean, String],
  78. default: false
  79. },
  80. // 背景颜色
  81. bgColor: {
  82. type: String,
  83. default: ""
  84. },
  85. // 背景透明度
  86. opacity: {
  87. type: [Number, String],
  88. default: 1
  89. },
  90. // 固定时默认占位
  91. isOccupy: {
  92. type: [Boolean, String],
  93. default: true
  94. },
  95. // 默认包含系统状态栏
  96. isStatusBar: {
  97. type: [Boolean, String],
  98. default: true
  99. },
  100. // 头部分割线
  101. isSplitLine: {
  102. type: [Boolean, String],
  103. default: true
  104. },
  105. // 头部分割线颜色
  106. splitLineColor: {
  107. type: String,
  108. default: "#CCCCCC"
  109. },
  110. // 头部分割线高度
  111. splitLineHeight: {
  112. type: [Number, String],
  113. default: 1
  114. },
  115. // 字体颜色
  116. color: {
  117. type: String,
  118. default: ""
  119. },
  120. // 自定义样式
  121. styleSelf: {
  122. type: String,
  123. default: () => {
  124. return ""
  125. }
  126. }
  127. },
  128. mounted() {
  129. this.getSystemInfo()
  130. },
  131. computed: {
  132. // 中间部分样式
  133. isOnlyCenter() {
  134. return this.onlyCenter ? 'onlyCenter' : ''
  135. },
  136. // 头部样式
  137. getNavBarStyle() {
  138. let splitLine = this.isSplitLine ?
  139. `border-bottom: ${Number(this.splitLineHeight)}px solid ${this.splitLineColor};` : "";
  140. let top = this.isFixed ? `top:${Number(this.statusBarHeight)}px;` : "";
  141. let bgColor = Number(this.opacity) === 0 ? "" : `background-color:${this.bgColor};`;
  142. return `height:${Number(this.navbarHeight)}px;
  143. line-height:${Number(this.navbarHeight)}px;
  144. background:rgba(255,255,255,${Number(this.opacity)});
  145. color:${this.color};
  146. ${bgColor}${top}${splitLine}${this.styleSelf}`
  147. },
  148. iconWH() {
  149. return `width: ${this.navbarHeight}px;height: ${this.navbarHeight}px;`
  150. }
  151. },
  152. methods: {
  153. // 返回
  154. back() {
  155. uni.navigateBack()
  156. },
  157. rightClick() {
  158. this.$emit("rightClick")
  159. },
  160. leftClick() {
  161. this.$emit("leftClick")
  162. },
  163. //获取状态栏高度
  164. getSystemInfo() {
  165. uni.getSystemInfo({
  166. success: res => {
  167. this.statusBarHeight = res.statusBarHeight
  168. let navbar = this.navbarHeight
  169. // #ifdef MP-WEIXIN
  170. // 胶囊居中
  171. const custom = wx.getMenuButtonBoundingClientRect()
  172. navbar = custom.height + (custom.top - res.statusBarHeight) * 2
  173. // #endif
  174. if (!this.isStatusBar) this.statusBarHeight = 0
  175. this.topHeight = this.statusBarHeight + navbar
  176. }
  177. })
  178. }
  179. }
  180. }
  181. </script>
  182. <style scoped>
  183. .flex {
  184. display: flex;
  185. }
  186. .status-bar {
  187. width: 100vw;
  188. position: fixed;
  189. top: 0;
  190. left: 0;
  191. right: 0;
  192. z-index: 9;
  193. background-color: #ffffff;
  194. opacity: 1
  195. }
  196. .nav-bar {
  197. font-size: 16px;
  198. width: 100vw;
  199. }
  200. .back,
  201. .left,
  202. .right {
  203. align-items: center;
  204. justify-content: center;
  205. }
  206. .center {
  207. flex: 1;
  208. align-items: center;
  209. justify-content: center;
  210. }
  211. .top-header {
  212. position: relative;
  213. top: 0;
  214. width: 100%;
  215. }
  216. .activeIsFixed {
  217. position: fixed;
  218. right: 0;
  219. left: 0;
  220. z-index: 99;
  221. }
  222. .activeBgColor {
  223. border: solid 1px transparent;
  224. background-image: linear-gradient(#ffffff, #ffffff),
  225. linear-gradient(to right, #FF007F 0%, #00A0E9 100%);
  226. border-radius: 25px;
  227. background-clip: content-box, border-box;
  228. background-origin: border-box;
  229. }
  230. .onlyCenter {
  231. margin: 0 10px;
  232. }
  233. </style>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/507705
推荐阅读
相关标签
  

闽ICP备14008679号