欢迎光临
我们一直在努力

九八云百度小程序教程:tabs 标签栏

  • tabs 标签栏
    • 属性说明
    • 示例
      • 代码示例 1:默认样式
      • 代码示例 2:可横滑展示
      • 代码示例 3:自定义样式
      • 代码示例 4:显示徽标
      • 代码示例 5:跳转寻址
      • 代码示例 6:可寻址标签栏用法
    • Bug & Tip

    tabs 标签栏

    基础库 3.100.4 版本开始支持。

    解释:标签栏,用于让用户在不同的视图中进行切换。标签栏组件的使用需要通过 tabs 和 tab-item 组件配合实现。设计文档详见标签栏。

    建议开发者尽量使用可寻址标签栏组件实现页面主标签栏功能。可寻址标签栏组件在标签栏 tab 切换时,该页面的 uri 参数会同步变化;反之,跳转某页面 uri 时,指定标签栏绑定的参数值也会打开该值对应的 tab 页。由于这种绑定关系的存在,相比于普通标签栏,可寻址标签栏更利于搜索引擎收录。例如:主页的多频道切换。

    属性说明

    属性名 类型 默认值 必填 说明 最低版本
    tabs-background-color String ‘#fff’ tabs 背景色,必须填写十六进制颜色 3.100.4
    低版本请做兼容性处理
    tabs-active-text-color String ‘#000’ tabs 激活 tab-item 文字颜色 3.100.4
    低版本请做兼容性处理
    tabs-inactive-text-color String ‘#666’ tabs 非激活 tab-item 文字颜色 3.100.4
    低版本请做兼容性处理
    tabs-underline-color String ‘#333’ tabs 激活 tab-item 下划线颜色 3.100.4
    低版本请做兼容性处理
    active-name String 仅用于普通标签栏组件,当前激活 tab-item 的对应的 name 值,须搭配 bindtabchange 一起使用。 3.100.4
    低版本请做兼容性处理
    url-query-name String 仅用于可寻址标签栏组件,当前 tab 所改变的 url query 中参数 key,需要通过 tabs 修改页面 url 的时候设置。 3.100.4
    低版本请做兼容性处理
    max-tab-item-amount Number 5 当前 tabs 视图中最多容纳的 tab-item 数量,低于此数量均分排列,超出此数量划屏。默认五个,开发者可根据业务需求调整 3.100.4
    低版本请做兼容性处理
    bindtabchange EventHandle tab 被点击的回调,可以在 e.detail.name 中取到当前点击的 tab-item 对应的 name 值 3.100.4
    低版本请做兼容性处理

    示例

    跳转编辑工具

    在开发者工具中打开

    在 WEB IDE 中打开

    扫码体验

    代码示例

    请使用百度APP扫码

    代码示例 1:默认样式

    • SWAN
    • JS
    
     
    1. <view class="wrap">
    2. <view class="card-area">
    3. <view class="top-description border-bottom">默认样式</view>
    4. <tabs
    5. class="border-bottom"
    6. active-name="{{activeNameOne}}"
    7. bindtabchange="tabsOne">
    8. <tab-item s-for="tab in tabs" name="{{tab.name}}" label="{{tab.label}}" />
    9. </tabs>
    10. <view class="intro">
    11. <view>标签{{content}}内容展示区</view>
    12. </view>
    13. </view>
    14. </view>
    
     
    1. Page({
    2. data: {
    3. tabs: [{
    4. name: '一',
    5. label: '标签一'
    6. }, {
    7. name: '二',
    8. label: '标签二'
    9. }, {
    10. name: '三',
    11. label: '标签三'
    12. }],
    13. content: '一',
    14. activeNameOne: '一'
    15. },
    16. tabsOne(e) {
    17. this.setData({
    18. content: e.detail.name,
    19. activeNameOne: e.detail.name
    20. })
    21. }
    22. });

    设计指南

    普通标签栏中子项(tab-item)的数量 2-5 个为宜。内容文字(label)应简洁易懂,长度不大于 4 个汉字为宜。

    错误

    只有 1 个子项时请不要使用 tabs

    错误

    内容过长出现折行不美观,影响阅读体验

    代码示例 2:可横滑展示

    • SWAN
    • JS
    
     
    1. <view class="wrap">
    2. <view class="card-area">
    3. <view class="top-description border-bottom">
    4. <view>可横滑显示</view>
    5. <view>max-tab-item-amount="5"</view>
    6. </view>
    7. <tabs
    8. class="border-bottom"
    9. active-name="{{activeNameTwo}}"
    10. max-tab-item-amount="5"
    11. bindtabchange="tabsTwo">
    12. <tab-item s-for="tab in tabsTwo" name="{{tab.name}}" label="{{tab.label}}" />
    13. </tabs>
    14. <view class="intro">
    15. <view>标签{{contentTwo}}内容展示区</view>
    16. </view>
    17. </view>
    18. </view>
    
     
    1. Page({
    2. data: {
    3. tabsTwo: [{
    4. name: '一',
    5. label: '标签一'
    6. }, {
    7. name: '二',
    8. label: '标签二'
    9. }, {
    10. name: '三',
    11. label: '标签三'
    12. }, {
    13. name: '四',
    14. label: '标签四'
    15. }, {
    16. name: '五',
    17. label: '标签五'
    18. }, {
    19. name: '六',
    20. label: '标签六'
    21. }, {
    22. name: '七',
    23. label: '标签七'
    24. }],
    25. contentTwo: '一',
    26. activeNameTwo: '一'
    27. },
    28. tabsTwo(e) {
    29. this.setData({
    30. contentTwo: e.detail.name,
    31. activeNameTwo: e.detail.name
    32. })
    33. }
    34. });

    代码示例 3:自定义样式

    • SWAN
    • JS
    
     
    1. <view class="wrap">
    2. <view class="card-area">
    3. <view class="top-description border-bottom">
    4. <view>自定义样式</view>
    5. </view>
    6. <tabs
    7. class="border-bottom"
    8. tabs-background-color="#3388ff"
    9. tabs-underline-color="#fff"
    10. tabs-inactive-text-color="#fff"
    11. tabs-active-text-color="#fff"
    12. bindtabchange="tabsThree"
    13. active-name="{{activeNameThree}}">
    14. <tab-item s-for="tab in tabsThree" name="{{tab.name}}" label="{{tab.label}}" />
    15. </tabs>
    16. <view class="intro">
    17. <view>标签{{contentThree}}内容展示区</view>
    18. </view>
    19. </view>
    20. </view>
    
     
    1. Page({
    2. data: {
    3. tabsThree: [{
    4. name: '一',
    5. label: '标签一',
    6. }, {
    7. name: '二',
    8. label: '标签二',
    9. }, {
    10. name: '三',
    11. label: '标签三'
    12. }],
    13. contentThree: '一',
    14. activeNameThree: '一'
    15. },
    16. tabsThree(e) {
    17. this.setData({
    18. contentThree: e.detail.name,
    19. activeNameThree: e.detail.name
    20. })
    21. }
    22. });

    设计指南

    自定义样式时需使用合适的颜色明确区分子项(tab-item)的选中态和非选中态,并且为标签栏设计适当的背景色(tabs-background-color),保证其内容显示清晰。

    错误

    选中态和非选中态的内容颜色无区分或颜色过多,均会影响阅读效率

    错误

    背景与内容的配色不协调,过多使用高饱和度或颜色过于相近,均会降低阅读舒适度

    代码示例 4:显示徽标

    • SWAN
    • JS
    
     
    1. <view class="wrap">
    2. <view class="card-area">
    3. <view class="top-description border-bottom">
    4. <view>显示徽标</view>
    5. </view>
    6. <tabs
    7. class="border-bottom"
    8. bindtabchange="tabsFour"
    9. active-name="{{activeNameFour}}">
    10. <tab-item
    11. s-for="tab in tabsFour"
    12. badge-type="{{tab.badgeType}}"
    13. badge-text="{{tab.badgeText}}"
    14. name="{{tab.name}}"
    15. label="{{tab.label}}" />
    16. </tabs>
    17. <view class="intro">
    18. <view>标签{{contentFour}}内容展示区</view>
    19. </view>
    20. </view>
    21. </view>
    
     
    1. Page({
    2. data: {
    3. tabsFour: [{
    4. name: '一',
    5. label: '标签一',
    6. badgeType: 'text',
    7. badgeText: '99+'
    8. }, {
    9. name: '二',
    10. label: '标签二',
    11. badgeType: 'dot'
    12. }, {
    13. name: '三',
    14. label: '标签三'
    15. }],
    16. contentFour: '一',
    17. activeNameFour: '一'
    18. },
    19. tabsFour(e) {
    20. this.setData({
    21. contentFour: e.detail.name,
    22. activeNameFour: e.detail.name
    23. })
    24. }
    25. });

    设计指南

    为徽标设置合理的消失机制,例如点击对应子项时徽标消失。不建议同时使用多种徽标,以及徽标长期不消失干扰用户。

    正确

    徽标长度控制在 3 个字符内体验最佳

    错误

    同时使用多种徽标且长期不消失,影响使用

    代码示例 5:跳转寻址

    • 旧页面:

    • SWAN

    • JS
    
     
    1. <view class="wrap">
    2. <view class="card-area">
    3. <view class="top-description border-bottom">
    4. <view>支持寻址</view>
    5. </view>
    6. <button type="primary" bind:tap="enterNewTabsPage">进入页面并定位到标签二</button>
    7. </view>
    8. </view>
    
     
    1. Page({
    2. data: {
    3. tabsFour: [{
    4. name: '一',
    5. label: '标签一',
    6. badgeType: 'text',
    7. badgeText: '99+'
    8. }, {
    9. name: '二',
    10. label: '标签二',
    11. badgeType: 'dot'
    12. }, {
    13. name: '三',
    14. label: '标签三'
    15. }],
    16. contentFour: '一'
    17. },
    18. enterNewTabsPage() {
    19. swan.navigateTo({
    20. url: "/newTabs/newTabs?position=二"
    21. });
    22. }
    23. });
    • 新页面:

    • SWAN

    • JS
    
     
    1. <tabs url-query-name="position" class="border-bottom">
    2. <tab-item s-for="tab in tabs" name="{{tab.name}}" label="{{tab.label}}" />
    3. </tabs>
    
     
    1. Page({
    2. data: {
    3. tabs: [{
    4. name: '一',
    5. label: '标签一'
    6. }, {
    7. name: '二',
    8. label: '标签二'
    9. }, {
    10. name: '三',
    11. label: '标签三'
    12. }],
    13. content: '一'
    14. },
    15. onLoad(query) {
    16. swan.setURLQuery(query);
    17. this.setData({
    18. content: query.position
    19. });
    20. },
    21. onURLQueryChange({newURLQuery, oldURLQuery}) {
    22. console.log(oldURLQuery, newURLQuery);
    23. this.setData({
    24. content: `${newURLQuery.position}`
    25. });
    26. }
    27. });

    代码示例 6:可寻址标签栏用法

    • SWAN
    • JS
    
     
    1. <!-- 指定 url-query-name 后,通过修改url来控制当前选中的tab,无需指定 active-name -->
    2. <!-- 虽然 bindtabchange 依旧会生效,但是直接使用 onURLQueryChange 是更好的做法 -->
    3. <tabs url-query-name="city">
    4. <tab-item s-for="tab in tabs" name="{{tab.name}}" label="{{tab.label}}" />
    5. </tabs>
    6. <!-- 查看页面uri变化 -->
    7. <view class="wrap">{{content}}</view>
    
     
    1. Page({
    2. data: {
    3. tabs: [{
    4. name: 'guangzhou',
    5. label: '广州'
    6. }, {
    7. name: 'shenzhen',
    8. label: '深圳'
    9. }, {
    10. name: 'xiamen',
    11. label: '厦门'
    12. }, {
    13. name: 'haerbin',
    14. label: '哈尔滨'
    15. }],
    16. content: 'beijing'
    17. },
    18. // 监听函数,点击切换 tabs 组件或者调用 swan.setURLQuery 时,url 发生变化自动触发
    19. onURLQueryChange({newURLQuery, oldURLQuery}) {
    20. console.log(newURLQuery, oldURLQuery)
    21. this.setData({
    22. content: `${oldURLQuery.city || 'beijing'} To ${newURLQuery.city}`
    23. })
    24. // 此时tab切换,刷新tabs下方视图数据
    25. }
    26. });

    active-name 和 url-query-name 不要搭配在一起使用:

    1. 如果开发者需要的只是一个普通的顶部标签栏组件,可以通过 active-name 配合 bindtabchange 来控制当前选中 tab-item ;
    2. 如果开发者需要的是可以修改页面 url 的顶部标签栏组件,只需指定 url-query-name,无需设置 active-name 。

    相关链接:onURLQueryChange

    Bug & Tip

    • Bug:页面中有多个 tab 组件时,已知徽标会错位,css 里全局设置*{box-sizing: content-box;}做兼容。

    未经允许不得转载:九八云安全 » 九八云百度小程序教程:tabs 标签栏