CSS - 過渡 - transtions

介紹

實驗中的功能壤蚜。 可動畫屬性列表

是一個 CSS 模塊什湘,定義了如何創(chuàng)建一個平滑地變換 CSS 屬性值的方法许布。它不僅允許創(chuàng)建變換方法合愈,同時也允許通過定時函數(shù)來控制變換方法。

比如,將一個元素的顏色從白色改為黑色,通常這個改變是立即生效的雇逞,使用 CSS transitions 后該元素的顏色將逐漸從白色變?yōu)楹谏凑找欢ǖ那€速率變化茁裙。這個過程可以自定義喝峦。

隱式過渡

通常將兩個狀態(tài)之間的過渡稱為隱式過渡(implicit transitions),因為開始與結(jié)束之間的狀態(tài)由瀏覽器決定呜达。

?
?

屬性

  • transition:簡寫屬性谣蠢。包含如下屬性:

    • transition-delay:指定延遲,即屬性開始變化時與過渡開始發(fā)生時之間的時長查近。

    • transition-duration:指定過渡的時長眉踱。或者為所有屬性指定一個值霜威,或者指定多個值谈喳,為每個屬性指定不同的時長。

    • transition-property:指定哪個或哪些 CSS 屬性用于過渡戈泼。只有指定的屬性才會在過渡中發(fā)生動畫婿禽,其它屬性仍如通常那樣瞬間變化。

    • transition-timing-function:指定一個函數(shù)大猛,定義屬性值怎么變化扭倾。

?
?

屬性 transition

過渡/動畫 都可以為一個元素在不同狀態(tài)之間切換的時候定義不同的過渡效果。比如在不同的偽元素之間切換挽绩,像是 :hover膛壹,:active或者通過 JavaScript 實現(xiàn)的狀態(tài)變化。

transition屬性可以被指定為一個或多個 CSS 屬性的過渡效果,多個屬性之間用逗號進行分隔模聋。

語法:
transition = 
  <single-transition>#  

<single-transition> = 
  [ none | <single-transition-property> ]  ||
  <time>                                   ||
  <easing-function>                        ||
  <time>                                   

<single-transition-property> = 
  all             |
  <custom-ident>  

<easing-function> = 
  linear                          |
  <linear-easing-function>        |
  <cubic-bezier-easing-function>  |
  <step-easing-function>          

<linear-easing-function> = 
  linear( <linear-stop-list> )  

<cubic-bezier-easing-function> = 
  ease                                                |
  ease-in                                             |
  ease-out                                            |
  ease-in-out                                         |
  cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )  

<step-easing-function> = 
  step-start                                |
  step-end                                  |
  steps( <integer> [, <step-position> ]? )  

<linear-stop-list> = 
  [ <linear-stop> ]#  

<step-position> = 
  jump-start  |
  jump-end    |
  jump-none   |
  jump-both   |
  start       |
  end         

<linear-stop> = 
  <number>               &&
  <linear-stop-length>?  

<linear-stop-length> = 
  <percentage>{1,2}  
語法示例:
/* Apply to 1 property */
/* property name | duration */
transition: margin-right 4s;

/* property name | duration | delay */
transition: margin-right 4s 1s;

/* property name | duration | timing function */
transition: margin-right 4s ease-in-out;

/* property name | duration | timing function | delay */
transition: margin-right 4s ease-in-out 1s;

/* Apply to 2 properties */
transition: margin-right 4s, color 1s;

/* Apply to all changed properties */
transition: all 0.5s ease-out;

/* Global values */
transition: inherit;
transition: initial;
transition: unset;
  • 零或一個值肩民,表示轉(zhuǎn)換應(yīng)適用的屬性。這可能是以下任何一種:

    • 關(guān)鍵字none
    • 關(guān)鍵字all
    • 命名 CSS 屬性的 <custom-ident>链方。
  • 零或一個 <single-transition-timing-function> 值表示要使用的過渡函數(shù)持痰。

  • 零,一或兩個 <time>值祟蚀。
    當有一個值時工窍,第一個值被分配給 transition-duration
    當有兩個值時暂题,第一個值被分配給 transition-duration,第二個值被分配給transition-delay究珊。

?
?

屬性 transition-property

實驗中的功能

語法:
transition-property = 
  none                           |
  <single-transition-property>#  

<single-transition-property> = 
  all             |
  <custom-ident>  
  • none:沒有過渡動畫薪者。

  • all:所有可被動畫的屬性都表現(xiàn)出過渡動畫。

  • IDENT:屬性名稱剿涮。由小寫字母 a 到 z言津,數(shù)字 0 到 9,下劃線(_)和破折號(-)取试。第一個非破折號字符不能是數(shù)字悬槽。同時,不能以兩個破折號開頭瞬浓。

?
?

屬性 transition-duration

實驗中的功能初婆,可以指定多個時長,每個時長會被應(yīng)用到由 transition-property 指定的對應(yīng)屬性上猿棉。如果指定的時長個數(shù)小于屬性個數(shù)磅叛,那么時長列表會重復。如果時長列表更長萨赁,那么該列表會被裁減弊琴。兩種情況下,屬性列表都保持不變杖爽。

語法:
transition-duration = 
  <time [0s,∞]>#  
  • <time>:表示過渡屬性從舊的值轉(zhuǎn)變到新的值所需要的時間敲董。如果時長是 0s ,表示不會呈現(xiàn)過渡動畫慰安,屬性會瞬間完成轉(zhuǎn)變腋寨。不接受負值。

?
?

屬性 transition-timing-function

實驗中的功能

語法:
transition-timing-function = 
  <easing-function>#  

<easing-function> = 
  linear                          |
  <linear-easing-function>        |
  <cubic-bezier-easing-function>  |
  <step-easing-function>          

<linear-easing-function> = 
  linear( <linear-stop-list> )  

<cubic-bezier-easing-function> = 
  ease                                                |
  ease-in                                             |
  ease-out                                            |
  ease-in-out                                         |
  cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )  

<step-easing-function> = 
  step-start                                |
  step-end                                  |
  steps( <integer> [, <step-position> ]? )  

<linear-stop-list> = 
  [ <linear-stop> ]#  

<step-position> = 
  jump-start  |
  jump-end    |
  jump-none   |
  jump-both   |
  start       |
  end         

<linear-stop> = 
  <number>               &&
  <linear-stop-length>?  

<linear-stop-length> = 
  <percentage>{1,2}  

?
?

屬性 transition-delay

實驗中的功能

語法:
transition-duration = 
  <time [0s,∞]>#  
  • <time>:表明動畫效果屬性生效之前需要等待的時間化焕。

?
?

應(yīng)用

示例1:顏色的變化
CSS
.d2{
    display: flex;
    flex-flow: row; 
    width: 300px;
    justify-content: space-evenly;
}
.trans,
.trans1{
    width: 100px;
    height: 100px;
    background-color: green;
}
.trans1{
    transition: background-color 2s ease-in;
}
.trans:hover{
    animation: 2s "ani1" 1 ease-in  alternate;
}
.trans1:hover{
    background-color: red;
}

@keyframes ani1 {
    from{
        background-color: green;
    }
    100%{
        background-color: red;
    }
}

效果:
示例2:顏色精置、大小的變化
CSS
.d2{
    display: flex;
    flex-flow: row; 
    width: 300px;
    justify-content: space-evenly;
}
.trans,
.trans1{
    width: 100px;
    height: 100px;
    background-color: green;
}
.trans1{
    transition: background-color 2s ease-in, width 2s ease, height 2s ease;
}
.trans:hover{
    animation: 2s "ani1" 2 ease-in  alternate;
}
.trans1:hover{
    background-color: red;
    width: 150px;
    height: 150px;
}

@keyframes ani1 {
    from{
        width: 100px;
        height: 100px;
        background-color: green;
    }
    100%{
        width: 150px;
        height: 150px;
        background-color: red;
    }
}

效果:
示例3:與JS一起使用
CSS:
p {
  padding-left: 60px;
}
.foo{
    position: absolute;
    top: 0;
    left: 0;
}
#foo1 {
    border-radius: 50px;
    width: 50px;
    height: 50px;
    background: #c00;
    
    transition:  all 1s;
}
#foo2 {
    border-radius: 30px;
    width: 30px;
    height: 30px;
    background: green;
}
JS:
<script>
    var f1 = document.getElementById('foo1');
    var f2 = document.getElementById('foo2');
    document.addEventListener('click', function(ev){
        f1.style.left = (ev.clientX-25)+'px';
        f1.style.top = (ev.clientY-25)+'px';
        
        f2.style.left = (ev.clientX-25)+'px';
        f2.style.top = (ev.clientY-25)+'px';
    },false);
</script>
HTML:
<p>隨便點擊某處來移動球</p>
<div id="foo1" class="foo"></div>
<div id="foo2" class="foo"></div>

效果:

?
?

檢測過渡是否完成

當過渡完成時觸發(fā)一個事件,在符合標準的瀏覽器下锣杂,這個事件是transitionend脂倦,在 WebKit 下是webkitTransitionEnd番宁。

transitionend 事件提供兩個屬性:

  • propertyName:字符串,指示已完成過渡的屬性赖阻。

  • elapsedTime:浮點數(shù)蝶押,指示當觸發(fā)這個事件時過渡已運行的時間(秒)。這個值不受 transition-delay火欧。

可以用 element.addEventListener() 方法來監(jiān)聽這個事件:

示例:
CSS:
.trans1{
    transition: background-color 2s ease-in;
}
JS:
var el = document.getElementById("tra1");
el.addEventListener("transitionend",listener);
el.addEventListener("transitionstart",listener);
el.addEventListener("transitionrun",listener);
el.addEventListener("transitioncancel",listener);

var ul = document.getElementById("ul");

function listener(event){
    var li = document.createElement("li");
    switch (event.type){
        case "transitionstart":
            li.innerHTML = "時間:" + event.elapsedTime + ", 屬性:" + event.propertyName + "開始了";
            break;
        case "transitionend":
            li.innerHTML = "時間:" + event.elapsedTime + ", 屬性:" + event.propertyName + "結(jié)束了";
            break;
        case "transitionrun":
            li.innerHTML = "時間:" + event.elapsedTime + ", 屬性:" + event.propertyName + "正在運行,";
            break;
        case "transitioncancel":
            li.innerHTML ="時間:" +  event.elapsedTime + ", 屬性:" + event.propertyName + "取消了,";
            break;
        default:
            break;
    }
    ul.appendChild(li);
}

完整的過渡效果:

不完整的過渡效果:

?
?

transition-propertytransition-duration不一致

示例:
div {
  transition-property: opacity, left, top, height;
  transition-duration: 3s, 5s;
}

div {
  transition-property: opacity, left;
  transition-duration: 3s, 5s, 2s, 1s;
}

等價:

div {
  transition-property: opacity, left, top, height;
  transition-duration: 3s, 5s, 3s, 5s;
}

div {
  transition-property: opacity, left;
  transition-duration: 3s, 5s;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棋电,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子苇侵,更是在濱河造成了極大的恐慌赶盔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榆浓,死亡現(xiàn)場離奇詭異于未,居然都是意外死亡,警方通過查閱死者的電腦和手機陡鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門烘浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍鲸,你說我怎么就攤上這事闷叉。” “怎么了脊阴?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵握侧,是天一觀的道長。 經(jīng)常有香客問我嘿期,道長藕咏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任秽五,我火速辦了婚禮孽查,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坦喘。我一直安慰自己盲再,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布瓣铣。 她就那樣靜靜地躺著答朋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠笑。 梳的紋絲不亂的頭發(fā)上梦碗,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼洪规。 笑死印屁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的斩例。 我是一名探鬼主播雄人,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼念赶!你這毒婦竟也來了础钠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叉谜,失蹤者是張志新(化名)和其女友劉穎旗吁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體停局,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡很钓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翻具。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履怯。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡回还,死狀恐怖裆泳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠硕,我是刑警寧澤工禾,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站蝗柔,受9級特大地震影響闻葵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜癣丧,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一槽畔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胁编,春花似錦厢钧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至市框,卻和暖如春霞扬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工喻圃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萤彩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓级及,卻偏偏與公主長得像乒疏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饮焦,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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