主頁 > 企業開發 > 探秘神奇的運動路徑影片 Motion Path

探秘神奇的運動路徑影片 Motion Path

2021-04-29 09:06:25 企業開發

CSS 中有一個非常有意思的模塊 -- CSS Motion Path Module Level 1,翻譯過來也就是運動路徑,本文將對 motion path 一探究竟,通過本文,你可以了解到:

  • 什么是 CSS motion path
  • 使用 CSS motion path 制作簡單路徑影片
  • 使用 CSS motion path 制作復雜路徑影片

什么是 CSS Motion Path 運動路徑?

什么是 CSS Motion Path 運動路徑?利用這個規范規定的屬性,我們可以控制元素按照特定的路徑進行位置變換的影片,并且,這個路徑可以是非常復雜的一條路徑,

在進一步介紹 CSS Motion Path 之前,我們先看看使用傳統的 CSS 的能力,我們如何實作路徑影片,

CSS 傳統方式實作直線路徑影片

在之前,我們希望將一個物體從 A 點直線運動到 B 點,通常而言可以使用 transform: translate()top | left | bottom | right 或者 是 margin 之類的可以改變物體位置的屬性,

簡單的一個 Demo:

<div>
div {
    width: 60px;
    height: 60px;
    background: #000;
    animation: move infinite 1s alternate linear;
}
@keyframes move {
    100% {
        transform: translate(100px, 100px);
    }
}

對于簡單的從 A 點直線運動到 B 點的效果如下:

CSS 傳統方式實作曲線路徑影片

當然,CSS 也可以實作一些簡單的曲線路徑影片的,如果我們希望從 A 點運動到 B 點走的不是一條直線,而是一條曲線,該怎么做呢?

對于一些簡單的圓弧曲線路徑,還是可以借助一些巧妙的辦法實作的,看看下面這個例子,

這次,我們使用了兩個元素,子元素是希望被曲線運動的小球,但是實際上我們是通過設定了父元素的 transform-origin,讓父元素進行了一個 transform: rotate() 的運動帶動了子元素的小球:

<div >
    <div ></div>
</div>
.g-container {
    position: relative;
    width: 10vmin;
    height: 70vmin;
    transform-origin: center 0;
    animation: rotate 1.5s infinite alternate;
}
.g-ball {
    position: absolute;
    width: 10vmin;
    height: 10vmin;
    border-radius: 50%;
    background: radial-gradient(circle, #fff, #000);
    bottom: 0;
    left: 0;
}
@keyframes rotate {
    100% {
        transform: rotate(90deg);
    }
}

為了方便理解,在運動的程序中,我讓父元素的輪廓顯現出來:

這樣,我們算是勉強得到了一個非直線路徑運動影片,它的實際運動軌跡是一條曲線,

然而,這基本上是之前 CSS 能做到的極限了,使用純 CSS 的方法,沒辦法實作更復雜的路徑影片,譬如下面這樣一條路徑影片:

直到現在,我們有了一種更為強大的專門做這個事情的規范,也就是本文的主角 -- CSS Motion Path

CSS Motion Path 實作直線路徑影片

CSS Motion Path 規范主要包含以下幾個屬性:

  • offset-path:接收一個 SVG 路徑(與 SVG 的path、CSS 中的 clip-path 類似),指定運動的幾何路徑
  • offset-distance:控制當前元素基于 offset-path 運動的距離
  • offset-position:指定 offset-path 的初始位置
  • offset-anchor:定義沿 offset-path 定位的元素的錨點, 這個也算好理解,運動的元素可能不是一個點,那么就需要指定元素中的哪個點附著在路徑上進行運動
  • offset-rotate:定義沿 offset-path 定位時元素的方向,說人話就是運動程序中元素的角度朝向

下面,我們使用 Motion Path 實作一個簡單的直線位移影片,

<div>
div {
    width: 60px;
    height: 60px;
    background: linear-gradient(#fc0, #f0c);
    offset-path: path("M 0 0 L 100 100");
    offset-rotate: 0deg;
    animation: move 2000ms infinite alternate ease-in-out;
}
@keyframes move {
    0% {
        offset-distance: 0%;
    }
    100% {
        offset-distance: 100%;
    }
}

offset-path 接收一個 SVG 的 path 路徑,這里我們的路徑內容是一條自定義路徑 path("M 0 0 L 100 100"),翻譯過來就是從 0 0 點運動到 100px 100px 點,

offset-path 接收一個 SVG 路徑,指定運動的幾何路徑,與 SVG 的path、CSS 中的 clip-path 類似,對于這個 SVG Path 還不太了解的可以戳這里先了解下 SVG 路徑內容:SVG 路徑

我們會得到如下結果:

通過控制元素的 offset-distance0% 變化到 100% 進行元素的路徑影片,

當然,上述的影片是最基本的,我可以充分利用 path 的特性,增加多個中間關鍵幀,稍微改造下上述代碼:

div {
    // 只改變運動路徑,其他保持一致
    offset-path: path("M 0 0 L 100 0 L 200 0 L 300 100 L 400 0 L 500 100 L 600 0 L 700 100 L 800 0");
    animation: move 2000ms infinite alternate linear;
}
@keyframes move {
    0% {
        offset-distance: 0%;
    }
    100% {
        offset-distance: 100%;
    }
}

這里最主要還是運用了 path 中的 L 指令,得到了如下圖這樣一條直線路徑:

image

最終的效果如下,與利用 transform: translate() 添加多個關鍵幀類似:

完整的 Demo 你可以戳這里:CodePen Demo -- CSS Motion Path Demo

CSS Motion Path 實作曲線路徑影片

上面的運動軌跡都是由直線構成,下面我們看看如何使用 CSS Motion Path 實作曲線路徑影片,

其實原理還是一模一樣,只需要在 offset-path: path() 中添加曲線相關的路徑即可,

在 SVG 的 Path 中,我們取其中一種繪制曲線的方法 -- 貝塞爾曲線,譬如下述這條 path,其中的 path 為 d="M 10 80 C 80 10, 130 10, 190 80 S 300 150, 360 80"

<svg width="400" height="160" xmlns="http://www.w3.org/2000/svg">
  <path d="M 10 80 C 80 10, 130 10, 190 80 S 300 150, 360 80" stroke="black" fill="transparent"/>
</svg>

對應這樣一條連續的貝塞爾曲線:

將對應的路徑應用在 offset-path: path 中:

<div>
div:nth-child(2) {
    width: 40px;
    height: 40px;
    background: linear-gradient(#fc0, #f0c);
    offset-path: path('M 10 80 C 80 10, 130 10, 190 80 S 300 150, 360 80');
}
@keyframes move {
    0% {
        offset-distance: 0%;
    }
    100% {
        offset-distance: 100%;
    }
}

可以得到如下運動效果:

可以看到,元素是沿著貝塞爾曲線的路徑進行運動的,并且,由于這次沒有限制死 offset-rotate,元素的朝向也是跟隨路徑的朝向一直變化的,(可以聯想成開車的時候,車頭一直跟隨道路會進行變化的,帶動整個車身的角度變化)

完整的 Demo 你可以戳這里:CodePen Demo -- CSS Motion Path Demo

理解 offset-anchor 運動錨點

OK,那么接下來,我們再看看 offset-anchor 如何理解,

還是上述的 DEMO,我們把小正方形替換成一個三角形,并且把運動的曲線給畫到頁面上,像是這樣:

其中,三角形是通過 clip-path 實作的:

    width: 40px;
    height: 40px;
    clip-path: polygon(0 0, 100% 50%, 0 100%);
    background: linear-gradient(#fc0, #f0c);

通常而言,沿著曲線運動的是物體的中心點(類比 transform-origin),在這里,我們可以通過 offset-anchor 改變運動的錨點,譬如,我們希望三角形的最下方沿著曲線運動:

.ball {
    width: 40px;
    height: 40px;
    clip-path: polygon(0 0, 100% 50%, 0 100%);
    offset-path: path('M 10 80 C 80 10, 130 10, 190 80 S 300 150, 360 80');
    offset-anchor: 0 100%;
    background: linear-gradient(#fc0, #f0c);
    animation: move 3000ms infinite alternate linear;
}
@keyframes move {
    0% {
        offset-distance: 0%;
    }
    100% {
        offset-distance: 100%;
    }
}

經過實測,Can i use 上寫著 offset-anchor 屬性的兼容性在為 Chrome 79+、Firefox 72+,但是實際只有 Firefox 支持,Chrome 下暫時無法生效~

完整的 Demo 你可以戳這里:CodePen Demo -- CSS Motion Path offset-anthor Demo

運用 Motion Path 制作影片效果

OK,上面我們基本把原理給過了一遍,下面我們就看看,運用 Motion Path,可以在實踐中如何運用,

利用 Motion Path 制作按鈕效果

利用運動路徑,我們可以制作一些簡單的按鈕點擊效果,在之前,我在 CodePen 上見到過這樣一種按鈕點擊效果:

其原理是運用了 background-radial 去生成每一個小圓點,通過控制 background-position 控制小圓點的位移,詳細的 Demo 代碼你可以戳這里:

CodePen Demo -- Bubbly button (Design by Gal Shir)

但是小圓點的運動路徑基本上都是直線,運用本文的 Motion Path,我們也可以實作一些類似的效果,核心代碼如下,HTML 這里我們使用了 Pug 模板,CSS 使用了 SASS

.btn
  -for(var i=0; i<60; i++)
    span.dot
.btn {
  position: relative;
  padding: 1.5rem 4.5rem;
}
.btn .dot {
  position: absolute;
  width: 4px;
  height: 4px;
  
  @for $i from 1 through $count { 
    &:nth-child(#{$i}) {
        top: 50%;
        left: 50%;
        transform: translate3d(-50%, -50%, 0) rotate(#{360 / $count * $i}deg);
      }
  }
  
  &::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 4px;
    height: 4px;
    border-radius: 50%;
    offset-path: path("M0 1c7.1 0 10.7 2 14.3 4s7.1 4 14.3 4 10.7-2 14.3-4 7.2-4 14.3-4 10.7 2 14.3 4 7.1 4 14.3 4 10.7-2 14.3-4 7.1-4 14.3-4 10.7 2 14.3 4 7.1 4 14.3 4 10.7-2 14.3-4 7.1-4 14.3-4 10.7 2 14.3 4 7.1 4 14.3 4");
    offset-distance: 0;
  }
}

.btn.is-animating:active .dot:nth-child(4n+1)::before {
  animation: dot var(--animation-time) var(--animation-timging-function);
}
.btn.is-animating:active .dot:nth-child(4n+2)::before {
  border: 1px solid var(--color-primary);
  background: transparent;
  animation: dot var(--animation-time) var(--animation-timging-function) 0.1s;
}
.btn.is-animating:active .dot:nth-child(4n+3)::before {
  animation: dot var(--animation-time) var(--animation-timging-function) 0.2s;
}
.btn.is-animating:active .dot:nth-child(4n)::before {
  border: 1px solid var(--color-primary);
  background: transparent;
  animation: dot var(--animation-time) var(--animation-timging-function) 0.3s;
}

@keyframes dot {
  0% {
    offset-distance: 0%;
    opacity: 1;
  }
  90% {
    offset-distance: 60%;
    opacity: .5;
  }
  100% {
    offset-distance: 100%;
    opacity: 0;
  }
}

別看代碼多有一點點復雜,但是不難理解,本質就是給每個子元素小點點設定同樣的 offset-path: path(),給不同分組下的子元素設定不同的旋轉角度,并且利用了影片延遲 animation-delay 設定了 4 組同時出發的影片,

這里我們的軌跡 path 不是直線,效果如下:

完整的代碼你可以戳這里:

CodePen Demo -- Button Animation with CSS Offset Paths

利用 Motion-Path 繪制地圖路徑尋路影片

這個也是非常實用的,現在我們可以完全利用 CSS Motion-Path 實作地圖上的尋路影片:

該 Demo 源自 Ahmad Emran,完整的代碼你可以戳這里:

CodePen Demo -- CodePen Home Animation with offset-path | Only Using CSS & HTML

利用 Motion-Path 繪制路徑影片

又或者,我們利用 Path 能繪制任意路徑的特性,實作各種我們想要的路徑,譬如加入購物車的拋物線,或者各類運動軌跡,都不在話下,這里再提供一個 Demo:

CodePen Demo -- CSS Motion Path offset-path animation

Can i Use - Motion-Path

來看看 Motion-Path 目前的兼容性如何?截止至 2021-04-27,

Can i Use - Motion-Path:

目前而言,除去 IE 瀏覽器,就等待 Safari 何時能夠兼容了,具體是否使用,還需要根據目標群體瀏覽器使用情況進行取舍,

最后

好了,本文到此結束,介紹了運動路徑影片 Motion Path,并且利用它實作了一些以往無法簡單實作的路徑影片效果,希望對你有幫助 ??

更多精彩 CSS 技術文章匯總在我的 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏,

如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/281174.html

標籤:其他

上一篇:React Hook用法詳解(6個常見hook)

下一篇:「HTML+CSS」--自定義加載影片【021】

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more