值得一看的小程序 TabBar 創意動(dòng)畫 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

值得一看的小程序 TabBar 創意動(dòng)畫

發表時間:2021-1-6

發布人:葵宇科技

浏覽次數:97

Hi 頭像于八九月(yuè)份進行了 v2 版大改版,其中(zhōng)的交互動(dòng)畫得到了不少(shǎo)好友的稱贊。今天,我就來分享一些關(guān)于小程序 TabBar 創意動(dòng)畫,将從 TabBar 類型、完整的 TabBar 創意動(dòng)畫進行分析。

為何要使用自定義 TabBar 效果呢(ne)? 在頁面的抽屜動(dòng)畫、TabBar 組件、添加圖像素材按鈕的多種要求下(xià),我們隻能選擇使用自定義 TabBar 動(dòng)畫了。

基礎知識

默認 TarBar

Tabbar 在 app.json 中(zhōng)配置,作用範圍為 TabBar 頁,常駐頁面最底部,占據頁面高度 50px,有 iPhone x 全面屏适配。

tabBar: {
  custom: true,
  backgroundColor: '#DEE8FF',
  borderStyle: 'white',
  color: '#95a1af',
  selectedColor: '#2f5aff',
  list: [
    {
      pagePath: 'pages/theme-list/theme-list',
      text: '主題',
      iconPath: 'images/tab-theme-1.png',
      selectedIconPath: 'images/tab-theme-2.png'
    },
  ]
}
複制代碼

下(xià)圖為小溪裡參與維護的 CCtalk 出品的“打卡鴨”小程序。

全局自定義 TarBar

自定義 tabBar可(kě)以讓開發者更加靈活地設置 tabBar 樣式,以滿足更多個(gè)性化的場景。

在自定義 tabBar 模式下(xià)

  • 為了保證低版本兼容以及區分哪些頁面是 tab 頁,tabBar 的相關(guān)配置項需完整聲明,但這些字段不會作用于自定義 tabBar 的渲染。
  • 此時需要開發者提供一個(gè)自定義組件來渲染 tabBar,所有 tabBar 的樣式都由該自定義組件渲染。推薦用 fixed 在底部的 cover-view + cover-image 組件渲染樣式,以保證 tabBar 層級相對較高。
  • 與 tabBar 樣式相關(guān)的接口,如(rú) wx.setTabBarItem 等将失效
  • 每個(gè) tab 頁下(xià)的自定義 tabBar 組件實例是不同的,可(kě)通(tōng)過自定義組件下(xià)的 getTabBar 接口,獲取當前頁面的自定義 tabBar 組件實例。

簡單來說:

  • 使用 CSS fixed 将 Tabbar 固定到底部,需要做 iPhone x 全面屏适配
  • 在切換頁面(onShow)後,設置當前高亮(liàng)的 TabItem

注意:如(rú)需實現 tab 選中(zhōng)态,要在當前頁面下(xià),通(tōng)過 getTabBar 接口獲取組件實例,并調用 setData 更新選中(zhōng)态。

show() {
  if (typeof this.getTabBar === 'function' && this.getTabBar()) {
    this.getTabBar().setData({
      selected: 1
    })
  }
}
複制代碼

以下(xià)為全局自定義 TabBar 的幾篇文(wén)章:

頁面單獨調用自定義 TabBar

每個(gè)頁面調用 TabBar,頁面内控制組件更加靈活。

這種方式可(kě)以視為每個(gè) TabBar 都單獨調用了 TabBar 組件。

<CustomTabBar
  selected={tabBarIndex}
  hideIndex={tabBarIndex === 1 && !isShowShape ? 1 : -1}
/>
複制代碼

動(dòng)畫調研

抽屜動(dòng)畫演示

在移動(dòng)端 UI 中(zhōng)漢堡包菜單配合抽屜式彈出動(dòng)畫是很常見的交互動(dòng)效之一。首先,我們來看幾個(gè)比較經典的動(dòng)畫效果:

氣泡動(dòng)畫參考

氣泡動(dòng)畫的核心點為,幾個(gè)子(zǐ)按鈕按照圓心分布,彈出有先後。

抽屜式動(dòng)畫 抽屜式動(dòng)畫要點為

  • 頁面容器(qì)内有菜單和(hé)頁面主内容兩個(gè)子(zǐ)容器(qì)
  • 帶回彈效果的交互動(dòng)畫會更有趣

codepen.io/tylerfowle/…

通(tōng)過對上面抽屜動(dòng)畫所對應頁面布局進行分析,我們可(kě)以發現,TabBar 組件隻能放在當前頁面中(zhōng),作為“主要頁面内容”模塊被縮小。

底部 TabBar 動(dòng)畫

通(tōng)過對國内常見的幾十款 APP 進行分析,我們可(kě)以得出以下(xià)幾個(gè)特點

  1. 大部分 APP 的 TabBar 的交互動(dòng)畫中(zhōng)除了有類似小程序那樣的幾個(gè)頁面 TabBar 外,都會有“+”号或者“?”的主按鈕
  2. 在 TabBar 上 都會有一些微動(dòng)畫,比如(rú)愛奇藝 APP 上的氣泡動(dòng)畫和(hé)京東 APP 上的圖标轉場動(dòng)畫。
愛奇藝京東
1)氣泡動(dòng)畫
2)粘連動(dòng)畫
Icon 高亮(liàng)動(dòng)畫

 視頻演示:https://v.qq.com/x/page/k3161mu12nw.html

動(dòng)畫試驗

動(dòng)畫 1——粘連菜單

下(xià)方動(dòng)畫基于 CSS filter 濾鏡與 SVG 高斯模糊實現,在 web 端上沒有問(wèn)題,但在真機上小程序上不支持。


動(dòng)畫 2——SVG 路(lù)徑

既然黏連動(dòng)畫在小程序上無法實現,我就嘗試換成了 SVG 路(lù)徑來實現動(dòng)畫。 那為何不使用 CSS 圓角矩形呢(ne)?因為圓弧與直線的連接處要做“過渡”效果的。

效果源碼: codepen.io/ainalem/pen…

Hi 頭像動(dòng)畫簡述

視頻演示:https://v.qq.com/x/page/c3161x3vo8v.html

Tab 頁切換動(dòng)畫

(具體效果情況請看上面的視頻)

Tab 頁切換有兩種實現思路(lù):

  • 分為多個(gè)有頁面實體的 Tab 頁
    • 在頁面切換後,需要重新産生 TabBar 組件實例
    • 切換動(dòng)畫不夠理想,但頁面邏輯完全獨立
  • 在一個(gè)實體頁面内
    • 用 Tabs 組件包含多個(gè) Tab 子(zǐ)頁面(組件)
    • 幾個(gè)組件的邏輯相對獨立,切換動(dòng)畫會更好

特别說明,Hi 頭像的 TabBar并非使用 fixed 布局,而是用了頁面 100% 高度配合 flex 布局,具體可(kě)以看 face.xiaoxili.com。

// 示意源碼
import Taro from '@tarojs/taro'
import { View, Image } from '@tarojs/components'
import { isIphoneSafeArea } from 'utils/common'
import './styles.styl'

const IS_IPHONEX = isIphoneSafeArea()

export default class CustomTabBar extends Taro.Component {
  ...

  static defaultProps = {
    selected: -1,
    hideIndex: -1
  }

  constructor(props) {
    super(props)
    this.state = {
      list: [
        {
          pagePath: '/pages/theme-list/theme-list',
          text: '主題',
          iconPath:  Taro.getEnv() === 'WEB' ? require('../../images/tab-theme-1.png') : '../../images/tab-theme-1.png',
          selectedIconPath:  Taro.getEnv() === 'WEB' ? require('../../images/tab-theme-2.png') : '../../images/tab-theme-2.png',
        }
      ]
    }
  }

  switchTab = (e) => {
    const data = http://www.wxapp-union.com/e.currentTarget.dataset
    const url = data.path
    Taro.switchTab({ url })
  }
  render() {
    const { selected, hideIndex } = this.props
    const { list } = this.state
    return (
      <View className={`tab-bar ${IS_IPHONEX ? 'bottom-safe-area' : ''} ${hideIndex === selected ? 'tab-bar-hide' : ''}`}>
        {
          list.map((item, index) => {
            const { pagePath, selectedIconPath, iconPath, text } = item
            return (
              <View key={text} hoverClass='tab-bar-item-hover' className={`tab-bar-item ${selected === index ? 'tab-item-active' : ''}`} data-path={pagePath} data-index={index} onClick={this.switchTab}>
                <Image className="tab-bar-image" src={'' + (selected === index ? selectedIconPath : iconPath)}></Image>
                <View className="tab-bar-text">{text}</View>
              </View>
            )
          })
        }
      </View>
    )
  }
}
複制代碼

TabBar 源碼地址:https://github.com/hi-our/hi-face/tree/master/taro/src/components/custom-tab-bar

按鈕彈出動(dòng)畫

(具體效果情況請看上面的視頻)

在 v2 版 Hi 頭像裡,添加頭像素材的按鈕是在 TabBar 組件中(zhōng)“加号”中(zhōng)彈出,其中(zhōng)關(guān)鍵點為“同心圓布局”和(hé)“動(dòng)畫延遲”。

視頻地址:https://v.qq.com/x/page/z3161kzeiwx.html

同圓心布局是按照圓心進行布局的,比計算 X 軸 和(hé) Y 軸的偏移量更方便更準确 transform: rotate(-60deg) translateY(-85px) rotate(60deg); 動(dòng)畫延遲,多個(gè)按鈕菜單項所對應的動(dòng)畫在執行時需要加上動(dòng)畫延遲 transition-delay: 0.1s;

按鈕菜單源碼:https://github.com/hi-our/hi-face/blob/master/taro/src/pages/avatar-edit/components/menu-choose/index.js

抽屜式動(dòng)畫

在抽屜式動(dòng)畫中(zhōng),抽屜菜單和(hé)頁面容器(qì)的動(dòng)畫參數是核心,可(kě)以有一點回彈效果

.menu-main {
  transition: 0.35s cubic-bezier(.75,.26,.02,1.01) transform;
}

.page-container {
  transition: 0.35s cubic-bezier(.75,.26,.02,1.01) transform, 0.35s cubic-bezier(0.68, -0.55, 0.265, 1.55) border-radius;
}
複制代碼

下(xià)圖為 “cubic-bezier”的參數效果,具體細節可(kě)以訪問(wèn) cubic-bezier.com/#.68,-0.04,…

.menu-item:nth-child(1) {
    transition-delay: 0.1s;
    transform: rotate(-60deg) translateY(-85px) rotate(60deg);
}
.menu-item:nth-child(2) {
    transition-delay: 0.18s;
    transform: rotate(-20deg) translateY(-85px) rotate(20deg);
}
複制代碼



相關(guān)案例查看更多