css實(shí)現(xiàn)彈出菜單動畫(微信小程序)

1.實(shí)現(xiàn)效果

菜單.gif

2.實(shí)現(xiàn)原理

  • 定義一個(gè)菜單列表,圖標(biāo),名稱枫攀,跳轉(zhuǎn)路由
menuList: [
  {
      name: '菜單一',
      src: 'https://i.postimg.cc/Bn1XpkSn/susu.jpg',
      url: ''
    },
    {
      name: '菜單二',
      src: 'https://i.postimg.cc/Gm7KjGmN/111.jpg',
      url: ''
    },
    {
      name: '菜單三',
      src: 'https://i.postimg.cc/Bv28vfkg/222.webp',
      url: ''
    },
    {
      name: '菜單四',
      src: 'https://i.postimg.cc/65STLQNc/333.webp',
      url: ''
    },
  ]
  • wx:for數(shù)組括饶,為每一項(xiàng)設(shè)置內(nèi)聯(lián)樣式,當(dāng)菜單大于等同于4個(gè)時(shí)候来涨,每個(gè)菜單寬度25%图焰,超過100%,換行展示蹦掐,反之寬度為100/數(shù)組的長度技羔,居中顯示,動畫逐次延遲0.1s卧抗。如下圖所示藤滥。
style="width:{{menuList.length>=4?'25':100/menuList.length}}%;animation-delay: {{(index+1)*0.1}}s"
在這里插入圖片描述

在這里插入圖片描述
  • 設(shè)置彈出動畫
@keyframes menuAwave {
  0% {
    opacity: 0;
    transform: translateY(100%)
  }

  60% {
    transform: translateY(-10%);
  }

  80% {
    transform: translateY(10%);
  }

  100% {
    opacity: 1;
    transform: translateY(0%)
  }
}
  • 為mask背景層設(shè)置動畫,transform: scale設(shè)置縮放大小社裆。

3.實(shí)現(xiàn)代碼

<view class="maskBg {{mask_animation}}" catchtouchmove="preventdefault"></view>
<view class='menu-container' catchtouchmove="preventdefault" hidden='{{isShow}}'>
  <view class='menu'>
    <view class='menu-list'>
      <view data-url="{{item.url}}" catchtap="toDetail" class='menu-item' wx:for='{{menuList}}' wx:key="menuList" style="width:{{menuList.length>=4?'25':100/menuList.length}}%;animation-delay: {{(index+1)*0.1}}s">
        <image mode='aspectFill' src='{{item.src}}' class="menu-icon"></image>
        <text class='menu-name'>{{item.name}}</text>
      </view>
    </view>
  </view>
</view>
<view class="btn">
  <view catchtap="click" class="btn-main {{btn_animation}}">+</view>
</view>
/* pages/effects/popMenu2/index.wxss */
.maskBg {
  height: 48px;
  width: 48px;
  background-color: #ddacac;
  opacity: 0.85;
  z-index: 1000;
  border-radius: 750rpx;
  transform: scale(0);
  position: fixed;
  bottom: 0;
  left: 50%;
  margin-left: -24px;
}
.maskOpen {
  animation: maskOpenAin 0.3s both;
}

.maskClose {
  animation: maskCloseAin 0.4s both;
}

@keyframes maskOpenAin {
  0% {
    transform: scale(0);
  }

  75% {
    transform: scale(24);
  }

  100% {
    transform: scale(48);
  }
}

@keyframes maskCloseAin {
  0% {
    transform: scale(48);
  }

  25% {
    transform: scale(24);
  }

  100% {
    transform: scale(0);
  }
}

.btn {
  width: 100%;
  height: 48px;
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  z-index: 1005;
  bottom: calc(10rpx + env(safe-area-inset-bottom));
}

.btn-main {
  border-radius: 50%;
  z-index: 1005;
  height: 48px;
  font-size: 28px;
  width: 48px;
  line-height: 48px;
  text-align: center;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  color: #fff;
  background: pink;
}

.menuOpen {
  animation: menuOpenAni 0.3s both;
}

.menuClose {
  animation: menuCloseAni 0.3s both;
}

@keyframes menuOpenAni {
  0% {
    transform: rotate(0deg);
    color: #fff;
    background: pink;
  }

  100% {
    transform: rotate(45deg);
    color: #000;
    background: #fff;
  }
}

@keyframes menuCloseAni {
  0% {
    transform: rotate(45deg);
    color: #000;
    background: #fff;
  }

  100% {
    transform: rotate(-0deg);
    color: #fff;
    background: pink;
  }
}

.menu-container {
  position: fixed;
  width: 100%;
  z-index: 1002;
  bottom: 0rpx;
}

.menu {
  padding-bottom: calc(48px + 40rpx + env(safe-area-inset-bottom));
}

.menu-list {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  width: 100%;
  padding-bottom: 15rpx;
}

.menu-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  animation: menuAwave 0.45s linear both;
}

.menu-icon {
  width: 110rpx;
  height: 110rpx;
  margin-bottom: 15rpx;
  border-radius: 100%;
}

.menu-name {
  color: #333;
  font-size: 25rpx;
  font-weight: bold;
  margin-bottom: 10rpx;
}

@keyframes menuAwave {
  0% {
    opacity: 0;
    transform: translateY(100%)
  }

  60% {
    transform: translateY(-10%);
  }

  80% {
    transform: translateY(10%);
  }

  100% {
    opacity: 1;
    transform: translateY(0%)
  }
}
Page({

  data: {
    isShow: true,
    menuList: [
      {
        name: '菜單一',
        src: 'https://i.postimg.cc/Bn1XpkSn/susu.jpg',
        url: ''
      },
      {
        name: '菜單二',
        src: 'https://i.postimg.cc/Gm7KjGmN/111.jpg',
        url: ''
      },
      {
        name: '菜單三',
        src: 'https://i.postimg.cc/Bv28vfkg/222.webp',
        url: ''
      },
      {
        name: '菜單四',
        src: 'https://i.postimg.cc/65STLQNc/333.webp',
        url: ''
      },
      {
        name: '菜單5',
        src: 'https://i.postimg.cc/65STLQNc/333.webp',
        url: ''
      },
    ],
    mask_animation: "",
    btn_animation: ""
  },
  ...

})

4.完整代碼拙绊,關(guān)注公眾號 蘇蘇的bug,更多小程序demo泳秀,盡在蘇蘇的碼云如果對你有幫助标沪,歡迎你的star+訂閱!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗜傅,一起剝皮案震驚了整個(gè)濱河市金句,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吕嘀,老刑警劉巖违寞,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偶房,居然都是意外死亡趁曼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門蝴悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彰阴,“玉大人,你說我怎么就攤上這事拍冠∧蛘猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵庆杜,是天一觀的道長射众。 經(jīng)常有香客問我,道長晃财,這世上最難降的妖魔是什么叨橱? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任典蜕,我火速辦了婚禮,結(jié)果婚禮上罗洗,老公的妹妹穿的比我還像新娘愉舔。我一直安慰自己,他們只是感情好伙菜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布轩缤。 她就那樣靜靜地躺著,像睡著了一般贩绕。 火紅的嫁衣襯著肌膚如雪火的。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天淑倾,我揣著相機(jī)與錄音馏鹤,去河邊找鬼。 笑死娇哆,一個(gè)胖子當(dāng)著我的面吹牛湃累,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碍讨,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼脱茉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了垄开?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤税肪,失蹤者是張志新(化名)和其女友劉穎溉躲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體益兄,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锻梳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了净捅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疑枯。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔六,靈堂內(nèi)的尸體忽然破棺而出荆永,到底是詐尸還是另有隱情,我是刑警寧澤国章,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布具钥,位于F島的核電站,受9級特大地震影響液兽,放射性物質(zhì)發(fā)生泄漏骂删。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宁玫。 院中可真熱鬧粗恢,春花似錦、人聲如沸欧瘪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恋追。三九已至凭迹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苦囱,已是汗流浹背嗅绸。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撕彤,地道東北人鱼鸠。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像羹铅,于是被迫代替她去往敵國和親蚀狰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容