利用css transition屬性實現一個帶動畫顯隱的微信小程序部件

我們先來看效果圖

像這樣的一個帶過渡效果的小部件在我們實際開發中的應用幾率還是比較大的,但是在開發微信小程序的過程中可能有的小伙伴發現transition這個屬性它不好使(下面說明)所以我們這個時候會考慮去使用微信官方提供的wx.createAnimation? API來創建動畫。

接下來我帶各位小伙伴如何讓 transition 屬性在這種需求中好使起來,下面上代碼

page({data: {show:false//用于顯示或隱藏控件
    },chanMask:function(){var isShow = this.data.show ? false : true;//如果顯示就隱藏,隱藏就顯示this.setData({show:isShow})}
})
/*index.wxss*/
/*顯示前*/
.mask-con{
transition: 1s; 
position: fixed;
width: 100%;
height: 300rpx;
left: 0;
bottom: -300rpx;text-align: center;
line-height: 300rpx;
box-shadow: 0 1px 10px #aaa;
}
/*顯示后*/
.mask-con-show{
bottom: 0;
}
<!--index.wxml-->
<view class="container">
<button bindtap="chanMask">點我</button>
<view class="mask-con {{show ? 'mask-con-show' : ''}}">
<view class="close" bindtap="chanMask">X</view>
慢慢飛起
</view>
</view>

?

在以上代碼中我們首先在data中定義了一個show變量用于mask-con控件的顯示狀態,在chanMask函數中交替的改變這個變量,然后將chanMask函數綁定給button和close控件的點擊事件上,最后我們根據show來決定是否給mask-con(我們的動畫控件)添加一個class: mask-con-show那么到這里我們已經實現了一個帶過渡的顯隱小部件,但是對于某些需求這還是太勉強了,比如下圖的情況:

現在很多的APP或小程序都是以這種方式來close彈窗控件,那個X用戶點的不過癮,看到這里聰明的小伙伴可能會想到再另外添加一個陰影控件在mask-con的下層并綁定上我們的chanMask函數,這樣的話陰影控件和我們的mask-con就可能不是在一個整體上了,不夠直觀,又比如說領導要讓這個陰影它有一個顯示顏色慢慢加深,隱藏慢慢減淡的效果,為了應對這種情況,我們把代碼調整如下:

page({data: {show:false//用于顯示或隱藏mask控件
    },chanMask:function(){var isShow = this.data.show ? false : true;//如果顯示就隱藏,隱藏就顯示this.setData({show:isShow})}
})

?

/*index.wxss*/.mask-shadow{
width: 100%;
height: 100%;opacity: 0;
transition: 1s;
}
.mask-shadow-on{
opacity: 0.3;
}
.mask-con{
position: absolute;
width: 100%;
height: 300rpx;
left: 0;
bottom: -300rpx;transition: 1s;
text-align: center;
line-height: 300rpx;
box-shadow: 0 1px 10px #aaa;
}
.mask-con-show{
bottom: 0;
}

?

<!--index.wxml-->
<view class="container">
<button bindtap="chanMask">點我</button>
<view class="mask {{show ? 'show' : 'hide'}}">
<view class="mask-shadow {{show ? 'mask-shadow-on' : ''}}"></view>
<view class="mask-con {{show ? 'mask-con-show' : ''}}">
<view class="close" bindtap="chanMask">X</view>
慢慢飛起
</view>
</view>
</view>

在這里我們設置了兩個樣式類名mask-shadow-on和mask-con-show來定義陰影以及主要控件mask-con動畫后的效果(具體代碼根據自己的需求決定),看起來一切都OK,沒有任何問題,那么先運行一波,艾瑪,神馬情況?陰影和我們的mask-con直接懟了出來毫無過渡效果,那這是何原因影響我們程序的效果呢,經過一番考量博主發現在display為none的情況之下我們的transition屬性可能會失效,那到這里有的小伙伴可能會問 “博主,那個不對啊,我們明明已經將mask的display設置成block怎么還有這種問題呢”

是這樣的,我們的mask控件它顯示需要那么一點時間才能完全顯示出來,但是呢我們的變量show設置成true之后,我們的陰影控件和主要控件也會馬上添加上了動畫后樣式類名,這個時間它比mask顯示所需的時間要快,所以我們的機器它認為mask還是處于display為none的情況

打個比方說:mask是這一整塊的老大,這個老大都還沒表演完事,你們這些做小弟就已經出來搶風頭了,你讓當老大的面子往哪放,不行我得把你們這些搶我風頭的都給干掉,看你們還得瑟。這個老大的人狠話不多,你搶了他風頭不行,你想不表演他(用戶體驗)也不高興,而且他表演完了還不跟你說,那這個老大這么難伺候該怎么辦呢?有的小伙伴已經感覺到迷茫了嗎,那還在等什么,趕快拿起你手中的電話撥打求助熱線。。。。。啊呸,扯遠了

其實決解的方法很簡單,沒錯答案就是 setTimeout()函數,來,我們把代碼再改一遍:

page({data: {show:false,//用于顯示或隱藏mask控件runAM:false//用于動畫執行的根據
    },chanMask:function(){var isShow = this.data.show ? false : true;//如果顯示就隱藏,隱藏就顯示var delay  = isShow ? 30 : 1000;//第一個時間是博主測出來控件顯示所需的時間,第二個是動畫所需的時間if(isShow){this.setData({show:isShow});}else{this.setData({runAM:isShow})}setTimeout(function(){if(isShow){this.setData({runAM:isShow});}else{this.setData({show:isShow});}}, delay);}
})

?

<!--index.wxml-->
<view class="container">
<button bindtap="chanMask">點我</button>
<view class="mask {{show ? 'show' : 'hide'}}" bindtap="chanMask">
<view class="mask-shadow {{runAM ? 'mask-shadow-on' : ''}}"></view>
<view class="mask-con {{runAM ? 'mask-con-show' : ''}}">
<view class="close" bindtap="chanMask">X</view>
慢慢飛起
</view>
</view>
</view>

在以上代碼中,我們給data新添加了一個變量runAM用于動畫何時開始執行的憑證,再在chanMask函數定義了一個用于設置延時的變量delay 代碼可能有點繞博主在此粗暴的解釋一下

程序的整個過程都是根據isShow這個變量來走的,

當isShow為true時也就是說我們要打開mask控件了,所以我們先把mask控件顯示出來,然后在延時30毫秒后去為要執行動畫的控件添加上樣式類名

當isShow為false時我們先把動畫控件的類名去掉(去掉后會執行動畫回到原本的形態),然后在延時1000毫秒(動畫所需的時間)后讓mask隱藏

關于delay的第一個值的設定時博主自己測出來的,如果各位小伙伴還擔心控件沒顯示的話可以設成50毫秒或100毫秒都無所這0.1秒的時間差對用戶體驗的影響并不大,如過你設了1秒都沒反應,我只能說換手機吧

最后你會發現在整個過程中博主都只調用一個函數進行顯示或隱藏,并沒有為關閉新建函數處理,這種寫法逼格滿滿有木有

此方法同樣適用于H5

新人第一次寫博客有點啰嗦了,望見諒

GitHub連接?https://github.com/1441327053/frontEnd-WXapp/tree/master/widget-transition

?

本文轉載于:猿2048?https://www.mk2048.com/blog/blog.php?id=2ciccab&title=利用css transition屬性實現一個帶動畫顯隱的微信小程序部件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370372.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言學生管理系統鏈表(dev vs2012下可以運行)

struct student { char name[10]; char sex[5]; long int num;//學號 int xuhao; int age; float score[3]; float averange; char DJ;//存放等級哦 struct student *next;};//定義結構體變量保存 名字 性別 年齡 成績] 結構體聲明int n;//存放學生人數int man;//存放統計的男生…

python 東哥 with open_python 連接redis cluster

#!/usr/bin/env python# encoding: utf-8#author: 東哥加油!#file: clear_pool.py#time: 2018/8/28 17:06from rediscluster import StrictRedisClusterimport datetimeimport sysdef redis_cluster():redis_nodes [{host:192.168.15.6,port:6379},{host:192.168.15.7,port:63…

go gcc

http://www.cnblogs.com/zkweb/p/7880099.html轉載于:https://www.cnblogs.com/thrillerz/p/7958446.html

抽象工廠設計模式解釋

抽象工廠設計模式是工廠設計模式的另一種形式。 這種模式可以被視為“超級工廠”或“工廠工廠”。 抽象工廠設計模式&#xff08;屬于“四人幫”的一部分&#xff09;屬于“創新設計模式”類別&#xff0c;它提供了一種封裝一組具有公共鏈接的工廠的方法&#xff0c;而無需突出…

app賬號退不出去_最新!多交的稅可以退,同學,你今天退稅了嗎?

4.3 號 更新。1、有知友留言&#xff0c;已經收到退稅了。2、部分地區陸續開放申報了&#xff0c;建議大家不要著急。3、大家耐心一點&#xff0c;該是你的就是你的&#xff0c;退稅這個事多退少補&#xff0c;建議大家在白天上班時間去APP上看看&#xff0c;畢竟相關公務人員也…

【BZOJ2004】[Hnoi2010]Bus 公交線路 狀壓+矩陣乘法

【BZOJ2004】[Hnoi2010]Bus 公交線路 Description 小Z所在的城市有N個公交車站&#xff0c;排列在一條長(N-1)km的直線上&#xff0c;從左到右依次編號為1到N&#xff0c;相鄰公交車站間的距離均為1km。 作為公交車線路的規劃者&#xff0c;小Z調查了市民的需求&#xff0c;決定…

課時77.序選擇器(掌握)

CSS3中新增的選擇器最具代表性的就是序選擇器。 1.同級別的第幾個 1. :first-child 選中同級別中的第一個標簽 注意點&#xff1a;不區分類型 但是我們這里有一個注意點&#xff0c;如果我們在第一個p之前加一個h1&#xff0c;則第一個p就不變紅了&#xff0c;因為我們…

Gulp——文件壓縮和文件指紋

先看下文件指紋添加成功發布后的“成果”。 首先介紹下gulp的文件壓縮&#xff08;壓縮css和js&#xff09; &#xff08;下面介紹的代碼移步這里&#xff09; 我的文件目錄如下&#xff1a; &#xff08;標紅部分是生成的處理后的文件&#xff09; 如何使用gulp&#xff0c;請…

java afconsole_Java ——基礎語法

package myhello; //本類所在的包的路徑import af.util.AfMath;//導入對應的類import java.util.Random;//導入隨機數的類public classHelloWorld{public static voidmain(String[] args){int a 8;inti;int total 0;int score 80;System.out.println(a > 8);//空語句 只有…

Java 7:使用NIO.2進行文件過濾-第2部分

大家好。 這是使用NIO.2系列進行文件過濾的第2部分。 對于那些尚未閱讀第1部分的人 &#xff0c;這里有個回顧。 NIO.2是自Java 7起JDK中包含的用于I / O操作的新API。使用此新API&#xff0c;您可以執行與java.io相同的操作&#xff0c;以及許多出色的功能&#xff0c;例如&a…

js for 循環 添加tr td 算法

StringBuffer sbnew StringBuffer(); int n 5; sb.append("<tr>"); List<MenuBean> chs mb.getChildren(); for(int j 0; chs ! null && j < chs.size(); j){ MenuBean _mb2 chs.get(j); if (i % n 0)//被n整除&#xff0c;即有了n列之后…

1034. 二哥的金鏈

Description 一個陽光明媚的周末&#xff0c;二哥出去游山玩水&#xff0c;然而粗心的二哥在路上把錢包弄丟了。傍晚時分二哥來到了一家小旅店&#xff0c;他翻便全身的口袋也沒翻著多少錢&#xff0c;而他身上唯一值錢的就是一條漂亮的金鏈。這條金鏈散發著奇異的光澤&#xf…

課時76.兄弟選擇器(掌握)

我們先來明確一點&#xff0c;什么是兄弟&#xff1f; 比如&#xff0c;head和body是兄弟&#xff0c;必須是同級關系&#xff0c;如果是嵌套關系&#xff0c;兒子&#xff0c;孫子則不可以。 1.相鄰兄弟選擇器 CSS2 作用&#xff1a;給指定選擇器后面緊跟的那個選擇器選中的…

java中不能定義為變量名稱_Java,“變量名”不能解析為變量

我使用Java使用Eclipse&#xff0c;出現此錯誤&#xff1a;"Variable name" cannot be resolved to a variable.使用此Java程序&#xff1a;public class SalCal {private int hoursWorked;public SalCal(String name, int hours, double hoursRate) {nameEmployee …

24v開關電源維修技巧_康佳LED液晶彩電KPS+L1900C301電源板原理與維修

康佳液晶彩電采用的KPSL1900C3-01型電源板&#xff0c;編號為34007728&#xff0c;版本號為35015686集成電路采用FAN7530FSGM300FSFR1700組合方案&#xff0c;輸出5.1VSB/4A、24V/4A、12V/4A電壓。應用于康佳LED47IS988PD、LED42M11PD、LED46MS92DC、LED42IS988PDE、LED42X5000…

zookeeper集群 新手安裝指南

Zookeeper集群的角色&#xff1a; Leader 和 follower &#xff08;Observer&#xff09;zk集群最好配成奇數個節點只要集群中有半數以上節點存活&#xff0c;集群就能提供服務本事例采用版本:zookeeper-3.4.5 虛擬機:zk1 zk2 zk3/****************************************…

Google Guava并發– ListenableFuture

在上一篇文章中&#xff0c;我介紹了使用番石榴庫中com.google.common.util.concurrent包中的Monitor類。 在本文中&#xff0c;我將繼續介紹Guava并發實用程序&#xff0c;并討論ListenableFuture接口。 ListenableFuture通過添加接受完成偵聽器的方法&#xff0c;從java.util…

課時71.后代選擇器(掌握)

1.什么是后代選擇器&#xff1f; 作用&#xff1a;找到指定標簽的所有后代標簽&#xff0c;設置屬性。 首先你要明確什么是后代&#xff1f; 你的兒子&#xff0c;孫子&#xff0c;重孫子等&#xff0c;只要有你的血脈的&#xff0c;都是你的后代。 我們先來舉個例子 我們想…

java小球碰撞界面設計_JavaScript實現小球碰撞特效

JavaScript實現小球碰撞特效。類似自由落體運動。實現原理非常簡單&#xff0c;就是動態的改變每個元素的坐標。使用radius屬性將圖片圓角化。使用left&#xff0c;top屬性動態的改變小球的位置。碰撞反彈球&#xff0c;當碰撞到容器的邊緣后&#xff0c;進行反彈&#xff0c;反…

es6常用基礎合集

es6常用基礎合集 在實際開發中&#xff0c;ES6已經非常普及了。掌握ES6的知識變成了一種必須。盡管我們在使用時仍然需要經過babel編譯。 ES6徹底改變了前端的編碼風格&#xff0c;可以說對于前端的影響非常巨大。值得高興的是&#xff0c;如果你熟悉ES5&#xff0c;學習ES6并不…