抖音抖一抖-SVG和CSS視覺故障藝術小賞

来源:https://www.cnblogs.com/wphmoon/archive/2019/10/09/11644923.html
-Advertisement-
Play Games

故障藝術,英文名稱叫glitch,在很多賽博朋克作品中經常看到,其實就是故意表現一種顯示設備的小故障效果,抖音的圖標其實就是這種的效果,我們看下這個圖標 這個圖標中的紅色和藍色的偏移其實就是一種故障藝術,看到這個,我就能想到早年我家還沒有有線電視時,搖天線對電視信號的場景,信號一差就是對著電視一陣拳 ...


故障藝術,英文名稱叫glitch,在很多賽博朋克作品中經常看到,其實就是故意表現一種顯示設備的小故障效果,抖音的圖標其實就是這種的效果,我們看下這個圖標

這個圖標中的紅色和藍色的偏移其實就是一種故障藝術,看到這個,我就能想到早年我家還沒有有線電視時,搖天線對電視信號的場景,信號一差就是對著電視一陣拳打腳踢,現在看到這種藝術效果頗為懷念。

某甲:為啥我沒遇到過這種場景?

我:你把手裡的平板扔地上就能看到了。

某甲:(土豪動作完成)我摔了,咋還沒看到呢

我:我就打個比方,你何必當真...

某甲:我一定要看到!

我:要不你再跺幾腳...

----------------------------------------我是打算開始的分割線------------------------------------------

我們先來實現一個動態的抖音故障效果,首先我們要有一個乾凈的抖音圖標,我是從阿裡巴巴矢量圖標庫找的,因為它家支持SVG格式,得到的SVG代碼是這樣的。

<svg id="douyin" t="1570181112474" class="icon" viewBox="0 0 1024 1024" version="1.1"
          xmlns="http://www.w3.org/2000/svg" p-id="2916" width="128" height="128">
          <path
            d="M937.386667 423.850667a387.84 387.84 0 0 1-232.874667-77.824v352.341333C704.512 878.250667 565.930667 1024 394.922667 1024S85.333333 878.250667 85.333333 698.368c0-179.882667 138.581333-325.632 309.589334-325.632 17.066667 0 33.706667 1.450667 49.92 4.266667v186.624a131.754667 131.754667 0 0 0-48.64-9.216c-76.288 0-138.154667 65.024-138.154667 145.322666 0 80.213333 61.866667 145.322667 138.24 145.322667 76.202667 0 138.069333-65.109333 138.069333-145.322667V0h172.714667c0 134.485333 103.68 243.541333 231.594667 243.541333v180.309334h-1.28"
            p-id="2917"></path>
        </svg>

看到的圖形是這樣子的

註意,在SVG的代碼裡面是沒有設置顏色的,圖片裡面的黑色是為了讓大家看清楚。我們先把白色,藍色和紅色的三層抖音圖標先顯示出來,代碼如下:

<use xlink:href="#douyin" x="0%" y="10%"  class="douyin1" />
<use xlink:href="#douyin" x="0%" y="10%"  class="douyin2" />
<use xlink:href="#douyin" x="0%" y="10%"  class="douyin" />
/* 白色 */
.douyin {
      fill: #fff;
    }
/* 藍色 */
    .douyin1 {
      fill: #25f4ee;
    }
/* 紅色 */
    .douyin2 {
      fill: #fe2c55;
    }

分別填上了白色,紅色和藍色,在SVG裡面,後面的會覆蓋前面的,所以把白色放在最前面,因為現在三者的位置是重疊的,所以只能看到白色的。

我們再設置白色的動畫效果

@keyframes glitch1 {
      0% {
        transform: none;
        opacity: 1;
      }

      7% {
        transform: skew(-2.5deg, -0.9deg);
        opacity: 0.75;
      }

      10% {
        transform: none;
        opacity: 1;
      }

      27% {
        transform: none;
        opacity: 1;
      }

      30% {
        transform: skew(1.8deg, -0.1deg);
        opacity: 0.75;
      }

      35% {

        transform: none;
        opacity: 1;
      }

      52% {

        transform: none;
        opacity: 1;
      }

      55% {
        transform: skew(-1deg, 1.2deg);
        opacity: 0.75;
      }

      60% {
        transform: none;
        opacity: 1;
      }

      72% {
        transform: none;
        opacity: 1;
      }

      75% {
        transform: skew(0.4deg, -1deg);
        opacity: 0.75;
      }

      80% {
        transform: none;
        opacity: 1;
      }

      100% {
        transform: none;
        opacity: 1;
      }
    }

白色的動畫效果很小,因為我只做了一些輕微的傾斜效果,感覺畫面在抖動,用的是 transform: skew()。transform是css的一個屬性,主要設置的是變形效果,這邊用的skew是實現傾斜效果。另外還用opacity做了些透明度的處理,用來表現信號故障時的亮度變化。

我們接著設置藍色圖標的動畫效果:

@keyframes glitch2 {
      0% {
        transform: none;
        opacity: 0.25;
      }

      7% {
        transform: translate(-4px, -6px);
        opacity: 0.5;
      }

      10% {
        transform: none;
        opacity: 0.25;
      }

      27% {
        transform: none;
        opacity: 0.25;
      }

      30% {
        transform: translate(-7px, -4px);
        opacity: 0.5;
      }

      35% {
        transform: none;
        opacity: 0.25;
      }

      52% {
        transform: none;
        opacity: 0.25;
      }

      55% {
        transform: translate(-5px, -2px);
        opacity: 0.5;
      }


      60% {
        transform: none;
        opacity: 0.25;
      }

      72% {
        transform: none;
        opacity: 0.25;
      }

      75% {
        transform: translate(-4px, -6px);
        opacity: 0.5;
      }

      80% {
        transform: none;
        opacity: 0.25;
      }

      100% {
        transform: none;
        opacity: 0.25;
      }
    }

這裡同樣是使用transform變形,但用的效果是translate,官方的名稱是2D轉換,其實就是平移效果,可以在橫向縱向做移動,我們看抖音的圖標就知道,藍色部分是在白色圖標的左上方,所以設置的translate的值都是負數,這是左上方的平移。

紅色部分類似,只是translate的值都是正數,表示時右下方的平移。代碼如下:

@keyframes glitch3 {
      0% {
        transform: none;
        opacity: 0.25;
      }

      7% {
        transform: translate(4px, 6px);
        opacity: 0.5;
      }

      10% {
        transform: none;
        opacity: 0.25;
      }

      27% {
        transform: none;
        opacity: 0.25;
      }

      30% {
        transform: translate(7px, 4px);
        opacity: 0.5;
      }

      35% {
        transform: none;
        opacity: 0.25;
      }

      52% {
        transform: none;
        opacity: 0.25;
      }

      55% {
        transform: translate(5px, 2px);
        opacity: 0.5;
      }

      60% {
        transform: none;
        opacity: 0.25;
      }

      72% {
        transform: none;
        opacity: 0.25;
      }

      75% {
        transform: translate(4px, 8px);
        opacity: 0.5;
      }

      80% {
        transform: none;
        opacity: 0.25;
      }

      100% {
        transform: none;
        opacity: 0.25;
      }
    }

最後,把動畫效果加到css類裡面去,之前的css代碼改成這樣

.douyin {
      fill: #fff;

      /*Animation*/
      animation: glitch1 3s infinite;
    }

    .douyin1 {
      fill: #25f4ee;
      animation: glitch2 3s infinite;
    }

    .douyin2 {
      fill: #fe2c55;
      animation: glitch3 3s infinite;
    }

動畫效果設置成3秒,無限迴圈,最後的成品效果如下:

線上效果請移步codepen.io

---------------------------------------------還有高級效果的分割線----------------------------------------

上面實現的是模仿抖音官方圖標的動態效果,但作為一個賽博朋克藝術家(是的,我都藝術家好幾個星期了),我覺得這個效果雖然很符合抖音的氣質,但離我想象中的高大上效果還有很大一段距離,我決定再加些效果,更加賽博朋克一些。

這裡我要用上一個負責的svg的filter,代碼如下:

<filter id="filter">
          <feTurbulence type="turbulence" baseFrequency="0.01 0.15" numOctaves="2" seed="5" stitchTiles="stitch"
            result="turbulence" />
          <feColorMatrix type="saturate" values="30" in="turbulence" result="colormatrix" />
          <feColorMatrix type="matrix" values="1 0 0 0 0
          0 1 0 0 0
          0 0 1 0 0
          0 0 0 150 -15" in="colormatrix" result="colormatrix1" />
          <feDisplacementMap in="SourceGraphic" in2="colormatrix1" scale="10" xChannelSelector="R" yChannelSelector="A"
            result="displacementMap" />
        </filter>

這是一個組合的filter效果,具體的分工如下:

  • feTurbulence是利用Perlin雜訊函數創建了一個圖像。它實現了人造紋理比如說雲紋、大理石紋的合成,我之前做雲朵的時候用的就是它。這裡主要實現干擾信號的效果
  • feColorMatrix 基於轉換矩陣對顏色進行變換,在這裡可以把白、藍、紅的顏色混合,在三種顏色疊加的地方產生一種顏色互相干擾的效果
  • feDisplacementMap 實際上是一個位置替換濾鏡,就是改變元素和圖形的像素位置的。在這裡,針對抖音的圖標(SourceGraphic)和經過feColorMatrix /feTurbulence過濾器後的結果做位置變換,就等到了干擾效果的最終結果。

最後我們把這個filter加到動畫效果裡面,我們拿三個keyframe中的一個來看下代碼,其他兩個是一樣的。

@keyframes glitch1 {
      0% {
        transform: none;
        opacity: 1;
      }

      7% {
        transform: skew(-2.5deg, -0.9deg);
        filter: url(#filter);
        opacity: 0.75;
      }

      8% {
        filter: none;
      }

      10% {
        transform: none;
        opacity: 1;
      }

      27% {
        transform: none;
        opacity: 1;
      }

      30% {
        transform: skew(1.8deg, -0.1deg);
        filter: url(#filter);
        opacity: 0.75;
      }
      31% {
        filter: none;
      }

      35% {

        transform: none;
        opacity: 1;
      }

      52% {

        transform: none;
        opacity: 1;
      }

      55% {
        transform: skew(-1deg, 1.2deg);
        filter: url(#filter);
        opacity: 0.75;
      }

      56% {
        filter: none;
      }

      60% {
        transform: none;
        opacity: 1;
      }

      72% {
        transform: none;
        opacity: 1;
      }

      75% {
        transform: skew(0.4deg, -1deg);
        filter: url(#filter);
        opacity: 0.75;
      }
      76% {
        filter: none;
      }

      80% {
        transform: none;
        opacity: 1;
      }

      100% {
        transform: none;
        opacity: 1;
      }
    }

filter: url(#filter) 這一句就是調用svg filter的語句。註意每調用一次這個,在後面都會加上這一句

31% {
        filter: none;
      }

這是為了讓filter效果瞬間出現,瞬間消失,使得故障效果更加逼真。最終看到的效果如下:

線上效果請看codepen.io

源代碼請看這裡


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

-Advertisement-
Play Games
更多相關文章
  • 前段時間因為一個bug,研究了一下android binder的大概流程,方便自己理解畫了一個框圖。 粗點線箭頭是繼承關係,細實線箭頭是調用關係。 ...
  • 最近需要實現導航功能,其中路線規劃和導航場景如下圖所示: 上面的截圖中,路線上面都繪製出了路名,方便用戶查看自己選擇的路線都經過了哪些道路。這裡用到的地圖的能力即為 騰訊地圖 Android SDK v4.2.7 已經開放了實現此功能的能力。 主要涉及介面如下: 介面名稱 | 功能概述 : | : ...
  • axios的除了初始化配置外,其它有用的應該就是攔截器了,攔截器分為請求攔截器和響應攔截器兩種: 請求攔截器 ;在請求發送前進行一些操作,例如在每個請求體裡加上token,統一做了處理如果以後要改也非常容易。 響應攔截器 ;是在接收到響應後進行一些操作,例如在伺服器返回登錄狀態失效,需要重新登錄的時 ...
  • XML Schema XSD (XML Schema Definition)是W3C於2001年5月發佈的推薦標準,指出如何形式描述XML文檔的元素。XSD是許多XML Schema 語言中的一支。XSD是首先分離於XML本身的schema語言,故獲取W3C的推薦地位。 像所有XML Schema ...
  • 一、介紹 運用UniApp+Vue+Vuex+swiper+uniPop等技術開發的仿微信原生App聊天室|仿微信聊天界面實例項目uniapp-chatroom,實現了發送圖文消息、表情(gif圖),圖片預覽、地圖位置、長按菜單、紅包/錢包、仿微信朋友圈等功能。 二、測試效果 H5 + 小程式 + ...
  • 一、判斷方法 1.判斷是否元素寬高為200的盒子 只需要看:邊框+內邊距+內容寬度/內容高度的值是否等於200 2.判斷是否內容寬高為100的盒子 只需要看:width和heght的值是否等於100 3.判斷是否元素空間寬高為300的盒子 只需要看:外邊距+邊框+內邊距+內容寬度/內容高度的值是否等 ...
  • /約定/ 讓我們輕裝上陣 一個功能頁(Page)的開發通常需要四大塊:配置、代碼、佈局、樣式。 這四大塊承載不同的方面,要獨立不混雜,又要整體融合。於是有了以下約定: 每一塊 獨立的文件、相同的文件名、不同的擴展名。 按約定行事,自動融合。 於是,一個小程式的功能頁 Page,就這樣形成了。 ind ...
  • 23、$refs是什麼東東? 通過在標簽上設置ref屬性,然後在Vue實例方法中可以通過$refs拿到這些標簽,如: 24、對於多級嵌套組件,後代組件如何拿到父級或祖父級,設置更高級別的組件的數據或方法? 使用依賴註入。 provide選項允許我們在當前組件指定我們想要提供給後代組件的數據/方法,比 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...