Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 韩国一级做a爰片性色毛片,国产精品免费久久,国产精品福利一区二区久久

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          大型項目的CSS

          大型項目的CSS

          ss是前端領域的一個難纏戶,一提到css,沒有人會說難,也沒有人愿意承認自己不會寫,甚至在面試的過程中css相關的內容都很少提及,足以說明大家對css的不重視。你真的會寫css嗎?

          關于css有兩類問題值得我們重視:樣式和工程。樣式問題指的是具體的效果實現,能否實現某個效果,同一個效果有多種實現方式,如何抉擇;工程問題是如何在大型項目中寫出可維護性、可讀的css。

          在各種論壇中經常看到關于css是否是一門編程語言的爭論。在我看來,最好用對待編程語言的態度來看待css,不要忽視css,否則,在項目后期,你會發現,你的css越來越混亂,important會越來越多,不同位置的類名互相沖突覆蓋,改一個類的樣式,要檢查整個項目的頁面是否受到影響,項目內部的css共享完全依賴拷貝……從這個角度來說,你敢說css不是編程語言?它完全有了像編程語言一樣能把你搞得焦頭爛額的能力。而這一切都來源于你在一開始對她的忽視與不屑。出來混,總要還的啊!

          css的問題

          盲目的定義基礎樣式

          在項目開始之初,拿到UI設計稿,信心滿滿地開始定義css的全局基礎樣式,謝天謝地,css對這一點支持得很徹底,一處定義,所有頁面都可以引用。

          先來一個color-red。

          .color-red {
          	color: red
          }

          這樣,在整個項目中,都可以給任意元素添加一個color-red類,美滋滋,我真是個小機靈鬼!

          幾個迭代過去,你已經把color-red這面紅旗插滿了整個項目。UED說,咱們改個版,所有紅色的文本改為藍色,紅色的link不變!

          嗶!——(你發出的聲音)

          你又得屁顛屁顛地把一個一個的紅旗拔出來,再插上藍色的旗子(因為你不敢不干呀)。

          命名沖突

          在一個頁面,你定義了一個.header,寫了個完美的特效,發布到dev一看,就是不管用,橫看豎看,本地是好的啊,神奇(生氣)!過了若干時間的排查,另一個同事在另一個地方也寫了一個.header,完美的覆蓋了你的。把你頭打歪!

          編輯器可不會提醒你哦!

          慢慢你會發現,這種命名沖突可太頻繁了呀!頭大,要不要用上css modular啊?

          子類覆蓋

          有的小伙伴聰明地將類名嵌套定義,這就不會沖突了吧?嘿嘿,你想多了!

          /* in article.css */
          .article .title {
            border-bottom: 1px solid;
            font-size: 1.5em;
          }
          
          /* in widget.css */
          .widget .title {
            color: gray;
            text-transform: uppercase;
          }

          如果在dom樹里面,article和widget在一棵樹的路徑上,你說title是沖突呢還是不沖突呢?

          以上的這些問題,在項目中相信大家都遇見過,并且項目越大,出現的概率就越高,最后就會演變成一座[屎]山。

          “大家都別動,牽一發而動全身哦!”

          “這就是蝴蝶效應吧???”

          認識BEM

          難道css這些問題就沒法解決了嗎?當然不是,我們來看看大神們是如何解決這些問題的。

          BEM是Block、Element、Modifier的縮寫,是一個類命名的規范。

          首先我們來看一個例子:

          /* Block */
          .btn {}
          
          /* Element that depends upon the block */ 
          .btn__price {}
          
          /* Modifier that changes the style of the block */
          .btn--orange {} 
          .btn--big {}

          相信小伙伴們已經有了一個初步的認知:

          Block是一個獨立的組件(元素),定義的了“組件是什么,按鈕?還是菜單?”。

          Element是屬于Block,是依賴于Block的元素,描述的是“Block里面的什么?比如,文本?圖標?”

          Modifier用于描述Block或者Element的外在表現,比如大小、顏色、狀態等。

          看一個例子:

          <form class="search-form search-form_theme_islands">
              <input class="search-form__input">
              <button class="search-form__button search-form__button_size_m">Search</button>
          </form>

          search-form是Block;

          search-form_theme_islands是Modifier,描述了theme為islands的search-form;

          search-form__input是Element,描述的是search-form內部的input元素;

          search-form__button是Element,描述的是search-form內部的button元素;

          search-form__button_size_m是Modifier,描述的是size為m的search-form__button;

          這樣寫css是不是非常的清晰?瞬間就提高了可讀性和可維護性?

          概念如此簡單,還不趕緊多了解一下?

          另外,可能有些小伙伴也注意到了,Block和Element使用雙下劃線分隔,和Modifier是用中劃線分隔,這也不是一成不變的,可以按照自己的喜好來決定如何分割。

          Saas、Css Module

          有些小伙伴可能會有疑問,BEM和Saas、Css Module有什么區別?解決的問題是一樣的嗎?

          Sass是css的預處理器,在寫css的時候定義了一套規范,經過編譯處理后輸出為css,和BEM是兩個不同的概念。使用saas或less也能實現BEM。BEM其實是不推崇類名的嵌套定義的,如果想像sass那樣嵌套的寫出標準的BEM,可以使用@at-root。

          Css Module解決的問題是多個模塊的css的命名沖突問題,個人覺得是傻瓜式解決方案,在應用層的css-in-js應用比較多,適合css入門選手。要想寫好css,還是得從根本上入手呀!

          家好,我是皮湯。最近業務調整,組內開啟了前端工程化方面的基建,我主要負責 CSS 技術選型這一塊,針對目前業界主流的幾套方案進行了比較完善的調研與比較,分享給大家。

          目前整個 CSS 工具鏈、工程化領域的主要方案如下:

          而我們技術選型的標準如下:

          - 開發速度快

          - 開發體驗友好

          - 調試體驗友好

          - 可維護性友好

          - 擴展性友好

          - 可協作性友好

          - 體積小

          - 有最佳實踐指導

          目前主要需要對比的三套方案:

          - Less/Sass + PostCSS 的純 CSS c側方案

          - styled-components / emotion 的純 CSS-in-JS 側方案

          - TailwindCSS 的以寫輔助類為主的 HTML 側方案

          ## 純 CSS 側方案

          ### 介紹與優點

          > 維護狀態:一般

          > Star 數:16.7K

          > 支持框架:無框架限制

          > 項目地址:https://github.com/less/less.js

          Less/Sass + PostCSS 這種方案在目前主流的組件庫和企業級項目中使用很廣,如 ant-design 等

          它們的主要作用如下:

          - 為 CSS 添加了類似 JS 的特性,你也可以使用變量、mixin,寫判斷等

          - 引入了模塊化的概念,可以在一個 less 文件中導入另外一個 less 文件進行使用

          - 兼容標準,可以快速使用 CSS 新特性,兼容瀏覽器 CSS 差異等

          這類工具能夠與主流的工程化工具一起使用,如 Webpack,提供對應的 loader 如 sass-loader,然后就可以在 React/Vue 項目中建 `.scss` 文件,寫 sass 語法,并導入到 React 組件中生效。

          比如我寫一個組件在響應式各個斷點下的展示情況的 sass 代碼:

          ```

          .component {

          width: 300px;

          @media (min-width: 768px) {

          width: 600px;

          @media (min-resolution: 192dpi) {

          background-image: url(/img/retina2x.png);

          }

          }

          @media (min-width: 1280px) {

          width: 800px;

          }

          }

          ```

          或導入一些用于標準化瀏覽器差異的代碼:

          ```

          @import "normalize.css";

          // component 相關的其他代碼

          ```

          ### 不足

          這類方案的一個主要問題就是,只是對 CSS 本身進行了增強,但是在幫助開發者如何寫更好的 CSS、更高效、可維護的 CSS 方面并沒有提供任何建議。

          - 你依然需要自己定義 CSS 類、id,并且思考如何去用這些類、id 進行組合去描述 HTML 的樣式

          - 你依然可能會寫很多冗余的 Less/Sass 代碼,然后造成項目的負擔,在可維護性方面也有巨大問題

          ### 優化

          - 可以引入 CSS 設計規范:BEM 規范,來輔助用戶在整個網頁的 HTML 骨架以及對應的類上進行設計

          - 可以引入 CSS Modules,將 CSS 文件進行 “作用域” 限制,確保在之后維護時,修改一個內容不會引起全局中其他樣式的效果

          #### BEM 規范

          B (Block)、E(Element)、M(Modifier),具體就是通過塊、元素、行為來定義所有的可視化功能。

          拿設計一個 Button 為例:

          ```

          /* Block */

          .btn {}

          /* 依賴于 Block 的 Element */

          .btn__price {}

          /* 修改 Block 風格的 Modifier */

          .btn--orange {}

          .btn--big {}

          ```

          遵循上述規范的一個真實的 Button:

          ```

          <a class="btn btn--big btn--orange" href="#">

          <span class="btn__price"></span>

          <span class="btn__text">BIG BUTTON</span>

          </a>

          ```

          可以獲得如下的效果:

          #### CSS Modules

          CSS Modules 主要為 CSS 添加局部作用域和模塊依賴,使得 CSS 也能具有組件化。

          一個例子如下:

          ```

          import React from 'react';

          import style from './App.css';

          export default ()=> {

          return (

          <h1 className={style.title}>

          Hello World

          </h1>

          );

          };

          ```

          ```

          .title {

          composes: className;

          color: red;

          }

          ```

          上述經過編譯會變成如下 hash 字符串:

          ```

          <h1 class="_3zyde4l1yATCOkgn-DBWEL">

          Hello World

          </h1>

          ```

          ```

          ._3zyde4l1yATCOkgn-DBWEL {

          color: red;

          }

          ```

          CSS Modules 可以與普通 CSS、Less、Sass 等結合使用。

          ## 純 JS 側方案

          ### 介紹與優點

          > 維護狀態:一般

          > Star 數:35.2K

          > 支持框架:React ,通過社區支持 Vue 等框架

          > 項目地址:https://github.com/styled-components/styled-components

          使用 JS 的模板字符串函數,在 JS 里面寫 CSS 代碼,這帶來了兩個認知的改變:

          - 不是在根據 HTML,然后去寫 CSS,而是站在組件設計的角度,為組件寫 CSS,然后應用組件的組合思想搭建大應用

          - 自動提供類似 CSS Modules 的體驗,不用擔心樣式的全局污染問題

          同時帶來了很多 JS 側才有的各種功能特性,可以讓開發者用開發 JS 的方式開發 CSS,如編輯器自動補全、Lint、編譯壓縮等。

          比如我寫一個按鈕:

          ```

          const Button=styled.button`

          /* Adapt the colors based on primary prop */

          background: ${props=> props.primary ? "palevioletred" : "white"};

          color: ${props=> props.primary ? "white" : "palevioletred"};

          font-size: 1em;

          margin: 1em;

          padding: 0.25em 1em;

          border: 2px solid palevioletred;

          border-radius: 3px;

          `;

          render(

          <div>

          <Button>Normal</Button>

          <Button primary>Primary</Button>

          </div>

          );

          ```

          可以獲得如下效果:

          還可以擴展樣式:

          ```

          // The Button from the last section without the interpolations

          const Button=styled.button`

          color: palevioletred;

          font-size: 1em;

          margin: 1em;

          padding: 0.25em 1em;

          border: 2px solid palevioletred;

          border-radius: 3px;

          `;

          // A new component based on Button, but with some override styles

          const TomatoButton=styled(Button)`

          color: tomato;

          border-color: tomato;

          `;

          render(

          <div>

          <Button>Normal Button</Button>

          <TomatoButton>Tomato Button</TomatoButton>

          </div>

          );

          ```

          可以獲得如下效果:

          ### 不足

          雖然這類方案提供了在 JS 中寫 CSS,充分利用 JS 的插值、組合等特性,然后應用 React 組件等組合思想,將組件與 CSS 進行細粒度綁定,讓 CSS 跟隨著組件一同進行組件化開發,同時提供和組件類似的模塊化特性,相比 Less/Sass 這一套,可以復用 JS 社區的最佳實踐等。

          但是它仍然有一些不足:

          - 仍然是是對 CSS 增強,提供非常大的靈活性,開發者仍然需要考慮如何去組織自己的 CSS

          - 沒有給出一套 “有觀點” 的最佳實踐做法

          - 在上層也缺乏基于 styled-components 進行復用的物料庫可進行參考設計和使用,導致在初始化使用時開發速度較低

          - 在 JS 中寫 CSS,勢必帶來一些本屬于 JS 的限制,如 TS 下,需要對 Styled 的組件進行類型注釋

          - 官方維護的內容只兼容 React 框架,Vue 和其他框架都由社區提供支持

          整體來說不太符合團隊協作使用,需要人為總結最佳實踐和規范等。

          ### 優化

          - 尋求一套寫 CSS 的最佳實踐和團隊協作規范

          - 能夠擁有大量的物料庫或輔助類等,提高開發效率,快速完成應用開發

          ## 偏向 HTML 側方案

          ### 介紹與優點

          > 維護狀態:積極

          > Star 數:48.9K

          > 支持框架:React、Vue、Svelte 等主流框架

          > 項目地址:https://github.com/tailwindlabs/tailwindcss

          典型的是 TailwindCSS,一個輔助類優先的 CSS 框架,提供如 `flex` 、`pt-4` 、`text-center` 、`rotate-90` 這樣實用的類名,然后基于這些底層的輔助類向上組合構建任何網站,而且只需要專注于為 HTML 設置類名即可。

          一個比較形象的例子可以參考如下代碼:

          ```

          <button class="btn btn--secondary">Decline</button>

          <button class="btn btn--primary">Accept</button>

          ```

          上述代碼應用 BEM 風格的類名設計,然后設計兩個按鈕,而這兩個類名類似主流組件庫里面的 Button 的不同狀態的設計,而這兩個類又是由更加基礎的 TailwindCSS 輔助類組成:

          ```

          .btn {

          @apply text-base font-medium rounded-lg p-3;

          }

          .btn--primary {

          @apply bg-rose-500 text-white;

          }

          .btn--secondary {

          @apply bg-gray-100 text-black;

          }

          ```

          上面的輔助類包含以下幾類:

          - 設置文本相關: `text-base` 、`font-medium` 、`text-white` 、`text-black`

          - 設置背景相關的:`bg-rose-500` 、`bg-gray-100`

          - 設置間距相關的:`p-3`

          - 設置邊角相關的:`rounded-lg`

          通過 Tailwind 提供的 `@apply` 方法來對這些輔助類進行組合構建更上層的樣式類。

          上述的最終效果展示如下:

          可以看到 TailwindCSS 將我們開發網站的過程抽象成為使用 Figma 等設計軟件設計界面的過程,同時提供了一套用于設計的規范,相當于內置最佳實踐,如顏色、陰影、字體相關的內容,一個很形象的圖片可以說明這一點:

          TailwindCSS 為我們規劃了一個元素可以設置的屬性,并且為每個屬性給定了一組可以設置的值,這些屬性+屬性值組合成一個有機的設計系統,非常便于團隊協作與共識,讓我們開發網站就像做設計一樣簡單、快速,但是整體風格又能保持一致。

          TailwindCSS 同時也能與主流組件庫如 React、Vue、Svelte 結合,融入基于組件的 CSS 設計思想,但又只需要修改 HTML 上的類名,如我們設計一個食譜組件:

          ```

          // Recipes.js

          import Nav from './Nav.js'

          import NavItem from './NavItem.js'

          import List from './List.js'

          import ListItem from './ListItem.js'

          export default function Recipes({ recipes }) {

          return (

          <div className="divide-y divide-gray-100">

          <Nav>

          <NavItem href="/featured" isActive>Featured</NavItem>

          <NavItem href="/popular">Popular</NavItem>

          <NavItem href="/recent">Recent</NavItem>

          </Nav>

          <List>

          {recipes.map((recipe)=> (

          <ListItem key={recipe.id} recipe={recipe} />

          ))}

          </List>

          </div>

          )

          }

          // Nav.js

          export default function Nav({ children }) {

          return (

          <nav className="p-4">

          <ul className="flex space-x-2">

          {children}

          </ul>

          </nav>

          )

          }

          // NavItem.js

          export default function NavItem({ href, isActive, children }) {

          return (

          <li>

          <a

          href={href}

          className={`block px-4 py-2 rounded-md ${isActive ? 'bg-amber-100 text-amber-700' : ''}`}

          >

          {children}

          </a>

          </li>

          )

          }

          // List.js

          export default function List({ children }) {

          return (

          <ul className="divide-y divide-gray-100">

          {children}

          </ul>

          )

          }

          //ListItem.js

          export default function ListItem({ recipe }) {

          return (

          <article className="p-4 flex space-x-4">

          <img src={recipe.image} alt="" className="flex-none w-18 h-18 rounded-lg object-cover bg-gray-100" width="144" height="144" />

          <div className="min-w-0 relative flex-auto sm:pr-20 lg:pr-0 xl:pr-20">

          <h2 className="text-lg font-semibold text-black mb-0.5">

          {recipe.title}

          </h2>

          <dl className="flex flex-wrap text-sm font-medium whitespace-pre">

          <div>

          <dt className="sr-only">Time</dt>

          <dd>

          <abbr title={`${recipe.time} minutes`}>{recipe.time}m</abbr>

          </dd>

          </div>

          <div>

          <dt className="sr-only">Difficulty</dt>

          <dd> · {recipe.difficulty}</dd>

          </div>

          <div>

          <dt className="sr-only">Servings</dt>

          <dd> · {recipe.servings} servings</dd>

          </div>

          <div className="flex-none w-full mt-0.5 font-normal">

          <dt className="inline">By</dt>{' '}

          <dd className="inline text-black">{recipe.author}</dd>

          </div>

          <div class="absolute top-0 right-0 rounded-full bg-amber-50 text-amber-900 px-2 py-0.5 hidden sm:flex lg:hidden xl:flex items-center space-x-1">

          <dt className="text-amber-500">

          <span className="sr-only">Rating</span>

          <svg width="16" height="20" fill="currentColor">

          <path d="M7.05 3.691c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.372 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.539 1.118l-2.8-2.034a1 1 0 00-1.176 0l-2.8 2.034c-.783.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.363-1.118L.98 9.483c-.784-.57-.381-1.81.587-1.81H5.03a1 1 0 00.95-.69L7.05 3.69z" />

          </svg>

          </dt>

          <dd>{recipe.rating}</dd>

          </div>

          </dl>

          </div>

          </article>

          )

          }

          ```

          上述食譜的效果如下:

          可以看到我們無需寫一行 CSS,而是在 HTML 里面應用各種輔助類,結合 React 的組件化設計,既可以輕松完成一個非常現代化且好看的食譜組件。

          除了上面的特性,TailwindCSS 在響應式、新特性支持、Dark Mode、自定義配置、自定義新的輔助類、IDE 方面也提供非常優秀的支持,除此之外還有基于 TailwindCSS 構建的物料庫 Tailwind UI ,提供各種各樣成熟、好看、可用于生產的物料庫:

          ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1cb983da6f71470b91ac764d14907998~tplv-k3u1fbpfcp-zoom-1.image)

          因為需要自定的 CSS 不多,而需要自定義的 CSS 可以定義為可復用的輔助類,所以在可維護性方面也是極好的。

          ### 不足

          - 因為要引入一個額外的運行時,TailwindCSS 輔助類到 CSS 的編譯過程,而隨著組件越來越多,需要編譯的工作量也會變大,所以速度會有影響

          - 過于底層,相當于給了用于設計的最基礎的指標,但是如果我們想要快速設計網站,那么可能還需要一致的、更加上層的組件庫

          - 相當于引入了一套框架,具有一定的學習成本和使用成本

          ### 優化

          - Tailwind 2.0 支持 [JIT](https://blog.tailwindcss.com/tailwindcss-2-1 "JIT"),可以大大提升編譯速度,可以考慮引入

          - 基于 TailwindCSS,設計一套符合自身風格的上層組件庫、物料庫,便于更加快速開發

          - 提前探索、學習和總結一套教程與開發最佳實踐

          - 探索 styled-components 等結合 TailwindCSS 的開發方式

          ## 參考鏈接

          - [CSS 工程化發展歷程](https://bytedance.feishu.cn/docs/doccnTRF0OZtJMgKuo3y0hIDMbc# "CSS 工程化發展歷程")


          / 感謝支持/

          以上便是本次分享的全部內容,希望對你有所幫助^_^

          喜歡的話別忘了 分享、點贊、收藏 三連哦~

          歡迎關注公眾號 程序員巴士,來自字節、蝦皮、招銀的三端兄弟,分享編程經驗、技術干貨與職業規劃,助你少走彎路進大廠。

          們每天都在網上摸魚,作為前端開發人員,網站上微妙的細節變化通過比別人會更關注。我一直注意到的一件事是網站上的動畫的流暢性。動畫對于用戶體驗來說是非常好的,有時我們可以一些有趣的動畫來留住用戶。

          創建高級動畫聽起來是一個很難的話題,但好消息是,在CSS中,可以將多個簡單的動畫相互疊加,以創建一個更復雜的動畫

          在這節課中,我們會學習如下幾點:

          • 什么是貝塞爾曲線,以及如何用一行CSS來創建一個 "復雜"的動畫
          • 如何將動畫相互疊加以創建一個高級動畫
          • 如何通過應用上面學到的兩點來創建一個過山車動畫

          什么是貝塞爾曲線

          CSS中的 cubic-bezier 函數是一個緩動函數,可以讓我們完全控制動畫在時間上的表現。下面是官方的定義:

          貝塞爾緩動函數是一種由四個實數定義的緩和函數,指定了貝塞爾曲線的兩個控制點P1P2,其端點P0P3分別固定在(0, 0)和(1, 1)P1P2x坐標被限制在[0, 1]范圍內。

          什么是緩動函數?

          線性曲線

          想象兩個點P0P1,其中P0是動畫的起點,P1是結束點。現在想象另一個點在兩點之間線性移動,如下所示

          這就是所謂的線性曲線,也是最簡單的動畫。

          二次貝塞爾曲線

          如下圖所示,有三個點。P0、P1和P2。我們想讓動畫從P0移動到P2。在這種情況下,P1是一個控制點,控制動畫的曲線。

          二次方貝塞爾概念:

          • 在P0和P1之間以及P1和P2之間(用灰線表示)連接虛線
          • 點Q0沿著P0和P1之間的直線移動。同時,點Q1沿著P1和P2之間的直線移動
          • 在Q0和Q1之間連接一條虛線(用綠線表示)
          • 在Q0和Q1開始移動的同時,點B開始沿著綠線移動,B點所走的路徑就是動畫路徑

          請注意,Q0、Q1和B不以相同的速度移動。它們都必須在同一時間開始,并在同一時間完成它們的路徑。因此,每一個點都是根據它所移動的線長以適當的速度移動的。

          三次貝塞爾曲線

          三次貝塞爾曲線由4個點組成。P0, P1, P2和P3。動畫開始于P0,結束于P3。P1和P2是我們的控制點。

          三次貝賽爾的工作原理如下:

          • 在(P0, P1)、(P1, P2)和(P2, P3)之間連接虛線,由灰線表示
          • 點Q0、Q1和Q2分別沿直線(P0,P1)、(P1,P2)和(P2,P3)移動
          • 在(Q0, Q1)和(Q1, Q2)之間連接虛線,它們由綠線表示。
          • 點R0和R1分別沿直線(Q0, Q1)和(Q1, Q2)移動
          • 連接R0和R1之間的線(用藍線表示)
          • 最后,B點沿著R0和R1之間的連接線移動,B點所走的路徑就是動畫路徑

          如果你想更好地了解三次體貝塞爾的工作原理,建議你看看這個desmos鏈接。玩玩控制點,看看動畫如何隨時間變化。(注意,鏈接中的動畫是由黑線表示的)。

          疊加動畫

          有很多步驟的大動畫可以被分解成多個小動畫。在 css 中,通過添加animation-delay屬性來實現這一點。計算延遲很簡單,把你要計算動畫延遲的那個動畫之前的所有動畫的時間加起來。

          例如:

          animation: movePointLeft 4s linear forwards, movePointDown 3s linear forwards;
          

          這里,我們有兩個動畫,movePointLeftmovePointDownmovePointLeft的動畫延遲是零,因為它是我們想先運行的動畫。movePointDown的動畫延遲是4秒,因為movePointLeft將在這段時間后完成。

          因此,animation-delay屬性:

          animation-delay: 0s, 4s;
          

          注意,如果有兩個或更多的動畫同時開始,它們的動畫延遲將是一樣的。此外,當你計算即將開始的動畫的延遲時,把它們視為一個動。例如 :

          animation: x 4s linear forwards, y 4s linear forwards, jump 2s linear forwards;
          

          假設xy同時開始。在這種情況下,xy的動畫延遲都將為零,而 jump 動畫的延遲將為4秒(而不是8秒!)。

          animation-delay: 0s, 0s, 4s;
          

          創建過山車

          掌握了上面的知識,是時候應用一下了。

          了解動畫

          過山車路徑由三部分組成:

          • 滑動部分
          • 循環部分
          • 還會有一些動畫,在上面的兩個動畫之間創造水平空間

          我們將首先創建一個簡單的球,作為我們過山車的 "車"。

          hmtl 部分:

          <div id="the-cart" class="cart"></div>
          

          css 部分:

          .cart {
            background-color: rgb(100, 210, 128);
            height: 50px;
            width: 50px;
            border: 1px solid black;
            border-radius: 50px;
            position: absolute;
            left: 10vw;
            top: 30vh;
          }
          
          

          滑動部分

          創建小球滑動的部分可以用cubic-bezier函數來完成! 這個動畫是由2個動畫組成的,一個是沿x軸的動畫,另一個是沿y軸的動畫。X軸動畫是一個沿X軸的普通線性動畫。它的關鍵幀如下:

          @keyframes x {
            to {
              left: 40vw;
            }
          
          

          將其添加到球路徑的 animation 屬性中,如下所示

          animation: x 4s linear forwards
          
          

          y軸動畫是我們將使用cubic-bezier函數的部分。首先定義動畫的關鍵幀。我們希望起始點和結束點之間的差異很小,以至于球達到的高度幾乎相同。

          @keyframes y {
            to {
              top: 29.99vh;
            }
          }}
          
          

          現在讓我們來思考一下cubic-bezier函數。我們希望我們的路徑先向右緩慢移動,然后當它滑動時,它應該走得更快。

          • 向右緩慢移動意味著$P1$將沿x軸移動。所以,我們知道它是在(V,0)。
          • 我們需要選擇一個合適的V,使我們的動畫緩慢地向右移動,但又不能太多,以免占用整個空間。在這種情況下,我發現0.55最適合。
          • 為了達到滑動效果,我們需要將P2Y軸下移(負值),所以P2=(X,-Y)
            • Y應該是一個大值。在這種情況下,我選擇 Y=5000
            • 為了得到X,我們知道我們的動畫速度在滑動時應該更快,在再次上升時應該更慢。所以,X越接近于零,動畫在滑動時就越陡峭。在這種情況下,讓X=0.8

          現在,我們得到了一個cubic-bezier函數:

          cubic-bezier(0.55, 0, 0.2, -800).
          

          為動畫屬性添加關鍵幀:

          animation: x 4s linear forwards,
              y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards;
          

          這是我們動畫的第一部分,所以動畫延遲為零。我們應該添加一個animation-delay屬性,因為從下面的動畫開始,動畫的開始時間將與第一個動畫不同。

          animation-delay: 0s, 0s;
          

          地址:https://codepen.io/smashingmag/pen/VwxXBQb

          添加水平空間

          在做循環之前,球應該沿著X軸移動一小會兒,所以兩個動畫之間有空間。

          定義關鍵幀

          @keyframes x2 {
            to {
              left: 50vw;
            }
          }
          

          把它添加到 animation 屬性中:

          animation: x 4s linear forwards,
              y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards;
          

          這個動畫應該在滑動動畫之后開始,而滑動動畫需要4秒,因此,動畫延遲將是4秒。

          animation-delay: 0s, 0s, 4s;
          

          地址:https://codepen.io/smashingmag/pen/dyemExY

          循環部分

          要在CSS中創建一個圓(循環),我們需要把圓移到循環的中心,然后從那里開始做動畫。圓的半徑是100px,所以我們把圓的位置改為top: 20vh30是期望的半徑(這里是10vh))。然而,這需要在滑動動畫完成后發生,所以我們將創建另一個持續時間為0秒的動畫,并添加一個合適的動畫延遲。

          關鍵幀:

          @keyframes pointOfCircle {
            to {
              top: 20vh;
            }
          }
          

          添加到 animation 動畫中:

          animation: x 4s linear forwards,
              y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards,
              pointOfCircle 0s linear forwards;
          
          

          添加動畫延遲, 4.5s:

          animation-delay: 0s, 0s, 4s, 4.5s;
          

          循環本身

          創建一個循環動畫:

          • 創建一個關鍵幀,將球移回原來的位置,然后旋轉球。
          @keyframes loop {
            from {
              transform: rotate(0deg) translateY(10vh) rotate(0deg);
            }
            to {
              transform: rotate(-360deg) translateY(10vh) rotate(360deg);
            }
          }
          
          

          添加到 animation 中:

          animation: x 4s linear forwards,
              y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards,
              pointOfCircle 0s linear forwards, loop 3s linear forwards;
          
          

          添加動畫延遲,這里是4.5s:

          animation-delay: 0s, 0s, 4s, 4.5s, 4.5s;
          

          地址:https://codepen.io/smashingmag/pen/mdLxZdR

          添加水平空間

          快完成了,最后 只需要在動畫之后沿著x軸移動球,這樣球就不會像上圖中那樣在循環之后完全停止。

          關鍵幀:

          @keyframes x3 {
            to {
              left: 70vw;
            }
          }
          

          添加到 animation 中:

          animation: x 4s linear forwards,
              y 4s cubic-bezier(0.55, 0, 0.2, -800) forwards, x2 0.5s linear forwards,
              pointOfCircle 0s linear forwards, loop 3s linear forwards,
              x3 2s linear forwards;
          
          

          加上適當的延遲,這里是7.5s:

          animation-delay: 0s, 0s, 4s, 4.5s, 4.5s, 7.5s;
          

          地址:https://codepen.io/smashingmag/pen/wvjmLKp

          總結

          在本節中,我們介紹了如何結合多個關鍵幀來創建一個復雜的動畫路徑。我們還介紹了貝塞爾以及如何使用它們來創建你自己的緩動函數。建議大家自己多多動手,才能更好的掌握 css 動畫。

          來源:https://www.smashingmagazine.com/2022/10/advanced-animations-css/


          主站蜘蛛池模板: 一区二区国产精品| 天堂Av无码Av一区二区三区| 国产一区二区三区在线视頻| 国产a久久精品一区二区三区| 精产国品一区二区三产区| 欧美日韩综合一区二区三区| 国内精品视频一区二区三区八戒| 国产亚洲综合一区二区三区| 日本一区二区三区在线网| 国产精品污WWW一区二区三区 | 亚洲国产精品一区二区成人片国内 | 韩日午夜在线资源一区二区| 国产精品毛片VA一区二区三区| 精品爆乳一区二区三区无码av| 日本一区二区三区久久| 国内偷窥一区二区三区视频| 中文乱码人妻系列一区二区| 国产一区二区三区在线观看免费| 国产亚洲欧洲Aⅴ综合一区| 3d动漫精品一区视频在线观看| 波多野结衣在线观看一区| 中文日韩字幕一区在线观看| 在线观看日本亚洲一区| 久久久久久一区国产精品| 国产一区二区三区影院| 任你躁国产自任一区二区三区| 国产精品一级香蕉一区| 国模丽丽啪啪一区二区| 国产精品va一区二区三区| 国产探花在线精品一区二区 | 国产一区视频在线免费观看| 亚洲av不卡一区二区三区| 国产亚洲综合精品一区二区三区 | 日韩国产精品无码一区二区三区| 福利国产微拍广场一区视频在线 | 亚洲一区中文字幕久久| 精品国产一区二区三区香蕉事| 亚洲AV成人一区二区三区AV| 一区二区三区福利视频| 国产乱码精品一区二区三区四川人| 欲色影视天天一区二区三区色香欲 |