CSS3 transition介紹

来源:https://www.cnblogs.com/manshufeier/archive/2018/07/12/9298411.html
-Advertisement-
Play Games

transition從效果上看是一種平滑過渡的動畫,本質上是線上性時間內將屬性從開始值過渡到結束值。例如獲得焦點,點擊滑鼠等動作導致CSS屬性值的變化是瞬間完成的,感覺有點生硬。用transition可以指定在某時間段內將屬性值平滑過渡,增強用戶體驗。 4個子屬性 transition-proper ...


transition從效果上看是一種平滑過渡的動畫,本質上是線上性時間內將屬性從開始值過渡到結束值。例如獲得焦點,點擊滑鼠等動作導致CSS屬性值的變化是瞬間完成的,感覺有點生硬。用transition可以指定在某時間段內將屬性值平滑過渡,增強用戶體驗。

  • 4個子屬性
  • transition-property
  • transition-duration
  • transition-timing-function
  • transition-delay
  • 觸發過渡的方式
  • transitionend事件
  • 隱式過渡
  • 開關過渡和永久過渡
  • auto過渡

4個子屬性

transition有4個子屬性:transition-property,transition-duration,transition-timing-function,transition-delay

transition-property指定需要過渡的CSS屬性。並不是所有屬性都能過渡的,只有能數字量化的CSS屬性才能過渡。

哪些屬於能數字量化的CSS屬性呢?例如:

顏色系,如color,background-color,border-color,outline-color

數字系,實在太多了,如width,height,top,right,bottom,left,zoom,opacity,line-height,background-position,word-spacing,font-weight,vertical-align,outline-outset,z-index等。

01系,如visibility(0表示隱藏,1表示顯示)

還有更多如漸變,陰影等分類請參照W3C的Animation of property types,不一一列舉了。

W3C上還有可過渡屬性一覽表Properties from CSS。通常只要能設數字(包括%百分比)的屬性都能過渡。

除了單個指定屬性外,transition-property還能設為all,表示所有屬性都將獲得過渡效果。

transition-duration過渡需要的時間,單位可指定s秒,也可指定ms毫秒。預設值是0,表示立刻變化。

如果設置了多個過渡屬性,但每個屬性的過渡時間都一樣,你沒必要為transition-duration設多個值,只有設一個即可,該值會應用到所有過渡屬性上。

transition-timing-function過渡函數,有lineareaseease-inease-outease-in-outcubic-bezier(n,n,n,n)steps

其實它們都是貝賽爾曲線。如下

  看貝賽爾曲線就知道了,linear是勻速過渡,ease是先快再慢的節奏,ease-in是加速衝刺的節奏,ease-out是減速到停止的節奏,ease-in-out是先加速後減速的節奏。

 

現在動畫的精度越來越高,如果預定義好的這些函數滿足不了你的需求,可以通過cubic-bezier(n,n,n,n)自定義平滑曲線。

從上面的圖形中觀察到,貝塞爾曲線有4個點,左下為起始點P0坐標固定為(0,0),右上為終點P3坐標固定為(1,1),中間有兩點P1和P2的坐標就是cubic-bezier(n,n,n,n)的參數。

通過4條連起來的直線,生成平滑的曲線。一圖勝千言:

   
   
   
    如果要憑腦子空寫出貝賽爾函數的代碼,可能比較困難。好在不用你自己去計算,可以到工具網站(如貝賽爾立方)上自動生成想要效果的代碼。 你也可以在該站點上,體驗一把lineareaseease-inease-outease-in-out間的差異。

 

steps可以把過渡階段分割成等價的幾步。什麼意思呢?一圖勝千言:

  steps函數有兩個參數,第一個參數是分割的數量,第二個參數可選,是關鍵字startend,不設的話預設是end。 因此steps(4, start)等價於step-start(4)steps(4, end)等價於step-end(4)。例如steps(4, end)並非像貝塞爾曲線那樣平滑過渡, 相當於將過渡過程從頭至尾分成4步,在每一步瞬間完成過渡。最上面的例子中已經有所展示,很容易理解

 

transition-delay延遲開始過渡的時間,預設值是0,表示不延遲,立即開始過渡動作。單位是s秒或ms毫秒。

w3cschool上沒說的是,該屬性還能設負時間,意思是讓過渡動作從該時間點開始啟動,之前的過渡動作不顯示。

你可以單獨指定這4個子屬性,也可以像background等屬性一樣,合併在transition屬性里指定。

但合併時要註意,因為有transition-duration和transition-delay都是時間,瀏覽器會根據先後順序,將第一個時間認作為transition-duration,第二個時間認作為transition-delay。

是分開或者合併指定並無標準答案。分開指定可能代碼易讀性高一點。

但當頁面需要適應各瀏覽器時,每個都要加上-ms-,-moz-等首碼,代碼會變的很多,合併在一起代碼稍微少點。

另外也可以同時指定多個過渡效果,例如transition: background 1s linear 2s, border-radius 2s ease-in 3s;

觸發過渡的方式

常見的就是偽類觸發:hover,:focus,:active,:checked等。還有例如@media媒體查詢,根據設備大小,橫屏豎屏切換時觸發。

還有如click,keydown等JS事件觸發。頁面載入也能觸發就不一一列舉了。總之過渡的本質是在時間段內平滑過渡屬性值,與怎麼觸發沒有關係。

transitionend事件

transition既然涉及時間,自然就有事件。參照MDN有transitionend事件,顧名思義就是過渡結束時觸發該事件。但該事件比較坑。例如過渡padding時,代碼如下:

#tempDiv {
    padding: 1px;
    transition-property: padding;
    transition-duration: 1s;
}
#tempDiv:hover {
    padding: 5px;
}
function showMessage() {
    console.log('finished');    //過渡結束時觸發列印log
}
var element = document.getElementById("tempDiv");
element.addEventListener("transitionend", showMessage, false);

你可以代碼貼到瀏覽器里試試,結果出現4條log。

因為過渡屬性指定的是padding,所以在padding-top,padding-right,padding-bottom,padding-left過渡結束時均觸發了transitionend事件。因此log被列印了4次。

如果上述CSS中將transition-property: padding;改為all,同樣會觸發4次。

除非你改成transition-property: padding-top;這樣才能只觸發一次,但現實中只過渡一邊的場景非常少,通常都是4邊同時過渡,

因此例如padding,margin,border之類的屬性,用transitionend事件會有多次捕捉的情況發生。

隱式過渡

transition過渡時有時會出現一些比較曖昧的情形,比如設成em的屬性,如你所知em是根據font-size來計算的。

類似還有rem,vh,vw等都是根據另一個屬性的值來計算得到它的值。

舉個例子padding:2em;,如果font-size被改變了,此時padding的“書面值”不變,仍舊是2em,但“實際值”將會發生變化並觸發transition過渡。這被稱作“隱式過渡”。

多數瀏覽器會實現隱式過渡,但傳聞IE很特別,具體有多特別我也沒試過。沒試過就輕信傳聞好像很不嚴謹,但根據IE過往的口碑,我寧可信其有…前端工程師都懂的。

開關過渡和永久過渡

開關過渡,顧名思義就是觸發源的事件結束後會恢復到原始狀態。永久過渡就是過渡後不恢復到原始狀態。

上面的例子都是開關過渡,當滑鼠hover事件結束後,圖片恢複原始尺寸。但永久過渡的話,滑鼠hover事件結束後,圖片仍舊保持放大後的尺寸。

//開關過渡
.transition { 
    transition: all 1s ease-in-out;
}
.transition:hover {
    transform: scale(1.5);
}
//永久過渡
.forever { 
    transition: all 1s ease-in-out 999999s;
}
.forever:hover { 
    transform: scale(1.5);
    transition: all 1s ease-in-out;
}

因為回到原始尺寸的transition-duration被設成了一個很大的時間,999999s差不多有12天,理論上你頁面開12天就能看到關閉過渡的效果,但現實等於永久過渡。該技巧無需任何JS腳本。

auto過渡

通常我們屬性過渡時,都是定值到定值的過渡,例如width:100px過渡到200px。但要過渡到width:auto就不行了。

就算你指定transition: width 1s linear;會發現根本不會有1秒的平滑的過渡效果,而是瞬間完成過渡。

.div1 {
    background-color: red;
    width: 100px;
    height: 50px;
}
#box1:hover {
    width: auto;
    transition: width 1s linear;
}
<div id="box1" class="div1"></div>

如果想要過渡效果,必須將auto轉換為固定值。那麼問題來了,如何轉換呢?

需要靠JS,通過getComputedStyle獲取auto後的固定值後,通過style設置該值,然後再觸發CSS的過渡效果。

window.onload = function(){
    var box = document.getElementById("box2"),
        originWidth = box.clientWidth,
        width2AutoLater = null,
        width2OriginLater = null;

    var width2Auto = function(element, time) {
        if (typeof window.getComputedStyle == "undefined") return;
        
        var width = window.getComputedStyle(element).width;
        element.style.width = "auto";
        var targetWidth = window.getComputedStyle(element).width;
        element.style.width = width;
        setTimeout(function() {
            element.style.transition = "width "+ time +"ms linear";
            element.style.width = targetWidth;
        }, 10);
    };

    var width2Origin = function(element, time) {
        setTimeout(function() {
            element.style.transition = "width 0s linear";
            element.style.width = originWidth + "px";
        }, 10);
    };

    function callLater(func, paramA, paramB){  
       return function(){  
            func.call(this, paramA, paramB);  
        };  
    }  

    width2AutoLater = callLater(width2Auto, box, 1000);
    width2OriginLater = callLater(width2Origin, box, 1000);

    box.addEventListener("mouseenter", width2AutoLater);
    box.addEventListener("mouseleave", width2OriginLater);
}
<div id="box2" class="div1"></div>

代碼耐心看看應該能看明白。無CSS,全靠JS實現過渡效果。

思路:給div註冊了mouseenter和mouseleave事件來模擬hover效果。

mouseenter綁定width2Auto函數,函數里臨時將div的width設為auto後,用getComputedStyle得到寬度值,將該寬度值和transition設進該div的style里。

mouseleave綁定width2Origin函數,函數里將div的width改回初始值。

因為註冊事件的函數addEventListener的第二個參數是回調函數名,不能給回調函數傳參數。

因此,使用閉包的特性,定義了callLater中間函數,函數里通過call調用上述兩個函數。

 





您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在網路載入緩慢或者刷新的時候總會有那麼一瞬間出現vue的模板代碼,實在很影響美觀,對於我這種有強迫症的人來說實在是忍無可忍,後來經過查找資料,終於發現瞭解決方法,可以使用vue現成的指令來解決這個問題:v-cloak 首先在css中加入: 然後需要在元素加上: 這樣,v-cloak所在元素下的變數在 ...
  • HTML介紹 Web服務本質 瀏覽器發請求 --> HTTP協議 --> 服務端接收請求 --> 服務端返迴響應 --> 服務端把HTML文件內容發給瀏覽器 --> 瀏覽器渲染頁面 HTML是什麼? 超文本標記語言(Hypertext Markup Language, HTML)是一種用於創建網頁的 ...
  • 一個div同時設置background-color和background-image的話,color是處於img層下方的,無法實現遮罩效果,所以需要再創建一個div作為其子div,然後設置子div的背景顏色,介紹兩種方法: 第一種,代碼如下: 第二種,通過after偽元素設置,代碼如下: 借鑒文章出 ...
  • 我通常上網使用兩個瀏覽器,safari用於一般上網;Chrome安裝SwitchyOmega插件,在不同的代理中切換,來保證某些網站的上網速度。 但是這種方式到了手機上就有點懵,幾乎所有的iPhone瀏覽器都不支持代理的自動切換和設置,所以只能選一個相對相容性比較好的網路方式一直用下去。很不爽利。。 ...
  • 一、對象 1.字面量創建對象 2.數據描述和存取描述設置 3.get和set 4.數據描述和存取描述檢查 二、prototype 1.prototype釋義 2.prototype與__proto__ 3.prototype之共用性 4.prototype之繼承性 三、類 1.類的封裝 1.混合的構 ...
  • 技術交流群:821039247 安裝node config模塊 在config文件夾下麵創建 文件,這是環境配置的預設的文件,如果沒有別的配置,則為預設這裡配置。如果要設置自己的環境配置文件,可以直接新建 ,如dev環境 即可,然後在 裡面配置相關啟動設置,載入對應環境文件即可。 在 裡面編輯如下內 ...
  • 因為是新入門antd-pro這個的小白,所以在mock數據和伺服器數據切換這裡搞了將近2天才弄好,配置如下,供各位初學者參考,如有錯誤的地方,請大神指出~叩謝!! 下麵開始乾貨: 1、.roadhogrc.mock.js這個文件沒有任何修改。 2、.webpackrc.js 文件中添加proxy,如 ...
  • 微信展示列表效果藉助於 wx:for 簡單寫一個列表(wxml文件中): 對應的數據源(js文件中): 寫一個點擊監聽: 效果: 以上、可以實現列表的item點擊效果,但是無法到點擊的item對應的數據源數據 解決方法: 給有點擊事件的組件添加一個 data-any 屬性 any可以是任意數據類型。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...