整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          css3動畫-加載中...

          幾個簡單的加載中動畫吧。

          像前面三種都是相當于幾個不同的點輪流來播放同一動畫:變大變小。css3里面有一個用于尺度變換的方法:scale(x,y)定義 2D 縮放轉(zhuǎn)換,改變元素的寬度和高度

          第四種就是一個小球從上往下跌落,再彈回去,在上面的時候速度最小,下面的時候速度最大。由于該小球只進行了上下的移動,所以我們可以運用:translateY(n):定義 2D 轉(zhuǎn)換,沿著 Y 軸移動元素,從而實現(xiàn)小球沿Y方向來回移動。

          廢話不多說了,上代碼。

          首先,第一個加載中的動畫:

          html Code

          <div id="loading1">
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
           </div>

          css Code

          .demo1 {
               width: 4px;
               height: 4px;
               border-radius: 2px;
               background: #68b2ce;
               float: left;
               margin: 0 3px;
               animation: demo1 linear 1s infinite;
               -webkit-animation: demo1 linear 1s infinite;
           }
           .demo1:nth-child(1){
               animation-delay:0s;
           }
           .demo1:nth-child(2){
               animation-delay:0.15s;
           }
           .demo1:nth-child(3){
               animation-delay:0.3s;
           }
           .demo1:nth-child(4){
               animation-delay:0.45s;
           }
           .demo1:nth-child(5){
               animation-delay:0.6s;
           }
           @keyframes demo1 
           {
               0%,60%,100% {transform: scale(1);}
               30% {transform: scale(2.5);}
           }
           @-webkit-keyframes demo1 
           {
               0%,60%,100% {transform: scale(1);}
               30% {transform: scale(2.5);}
           }
          
          css Code

          第二個動畫和第一個動畫大同小異,第一個動畫是將小球整體變大變小,第二動畫則是將小方塊的高度變大變小,而寬度不變:

          html Code

           <div id="loading2">
               <div class="demo2"></div>
               <div class="demo2"></div>
               <div class="demo2"></div>
               <div class="demo2"></div>
               <div class="demo2"></div>
           </div>

          css Code

          .demo2 {
               width: 4px;
               height: 6px;
               background: #68b2ce;
               float: left;
               margin: 0 3px;
               animation: demo2 linear 1s infinite;
               -webkit-animation: demo2 linear 1s infinite;
           }
           .demo2:nth-child(1){
               animation-delay:0s;
           }
           .demo2:nth-child(2){
               animation-delay:0.15s;
           }
           .demo2:nth-child(3){
               animation-delay:0.3s;
           }
           .demo2:nth-child(4){
               animation-delay:0.45s;
           }
           .demo2:nth-child(5){
               animation-delay:0.6s;
           }
           @keyframes demo2 
           {
               0%,60%,100% {transform: scale(1);}
               30% {transform: scaleY(3);}
           }
           @-webkit-keyframes demo2 
           {
               0%,60%,100% {transform: scale(1);}
               30% {transform: scaleY(3);}
           }
          
          css Code

          第三個動畫就需要將小球的位置定位一下,讓幾個小球整體上看起來圍成一個圓,然后就像第一個一樣使小球變大變小:

          html Code

           <div id="loading1">
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
                   <div class="demo1"></div>
           </div>

          css Code

          #loading3 {
               position: relative;
               width: 50px;
               height: 50px;
           }
           .demo3 {
               width: 4px;
               height: 4px;
               border-radius: 2px;
               background: #68b2ce;
               position: absolute;
               animation: demo3 linear 0.8s infinite;
               -webkit-animation: demo3 linear 0.8s infinite;
           }
           .demo3:nth-child(1){
               left: 24px;
               top: 2px;
               animation-delay:0s;
           }
           .demo3:nth-child(2){
               left: 40px;
               top: 8px;
               animation-delay:0.1s;
           }
           .demo3:nth-child(3){
               left: 47px;
               top: 24px;
               animation-delay:0.1s;
           }
           .demo3:nth-child(4){
               left: 40px;
               top: 40px;
               animation-delay:0.2s;
           }
           .demo3:nth-child(5){
               left: 24px;
               top: 47px;
               animation-delay:0.4s;
           }
           .demo3:nth-child(6){
               left: 8px;
               top: 40px;
               animation-delay:0.5s;
           }
           .demo3:nth-child(7){
               left: 2px;
               top: 24px;
               animation-delay:0.6s;
           }
           .demo3:nth-child(8){
               left: 8px;
               top: 8px;
               animation-delay:0.7s;
           }
           
           @keyframes demo3 
           {
               0%,40%,100% {transform: scale(1);}
               20% {transform: scale(3);}
           }
           @-webkit-keyframes demo3 
           {
               0%,40%,100% {transform: scale(1);}
               20% {transform: scale(3);}
           }
          

          接下來是第四個動畫:

          1 <div id="loading5">
          2      <div class="demo5"></div>
          3 </div>
           #loading5 {
               width: 20px;
               height: 100px;
               border-bottom: 1px solid #68b2ce;
           }
           .demo5 {
               width: 20px;
               height: 20px;
               border-radius: 10px;
               background: #68b2ce;
               animation: demo5 cubic-bezier(0.5,0.01,0.9,1) 0.6s infinite alternate;
               -webkit-animation: demo5 cubic-bezier(0.5,0.01,0.9,1) 0.6s infinite alternate;
           }
           @keyframes demo5
           {
               0%{
                   transform:translateY(0px);
                   -webkit-transform:translateY(0px);
               }
               100% {
                   transform:translateY(80px);
                   -webkit-transform:translateY(80px);
               }
           }
           @-webkit-keyframes demo5
           {
               0%{
                   transform:translateY(0px);
                   -webkit-transform:translateY(0px);
               }
               100% {
                   transform:translateY(80px);
                   -webkit-transform:translateY(80px);
               }
           }
          
          css Code

          以上就是這幾個簡單的加載中小動畫的內(nèi)容了。

          轉(zhuǎn)載 https://www.cnblogs.com/tangchan/p/7604594.html

          覽器加載一個js腳本,會在devtools中留下各種痕跡,elements中的script元素,console中的日志,source中的代碼,network中的網(wǎng)絡請求等

          elements

          這個比較簡單,插入js的時候設(shè)置好id,在js中刪掉自身就好了

          <script id="xxx">
              // todo
              document.getElementById("xxx").remove();
          </script>
          

          對于引用js

          <script id="xxx" src="a.js"></script>
          
          // a.js
          document.getElementById("xxx").remove()
          

          對于動態(tài)加載的js也是一樣的

          <script>
              let e=document.createElement("script");
              e.id="xxx";
              e.src="a.js";
              document.head.appendChild(e);
          </script>
          
          // a.js
          document.getElementById("xxx").remove()
          

          或者也可以這樣

          <script>
              let e=document.createElement("script");
              e.src="a.js";
              document.head.appendChild(e);
              e.remove();
          </script>
          

          雖然看起來很奇怪,但a.js確實能執(zhí)行,似乎是加載a.js時阻塞了腳本執(zhí)行,執(zhí)行完a.js之后再remove

          console

          clear就好了

          console.clear()
          

          source

          直接引用和動態(tài)加載都會在source中出現(xiàn)

          <script src="a.js"></script>
          
          <script>
              let e=document.createElement("script");
              e.src="a.js";
              document.head.appendChild(e);
          </script>
          

          這樣都是不行的,經(jīng)過測試發(fā)現(xiàn)動態(tài)插入js代碼時不會被記錄在source中

          <script>
              fetch("a.js").then(resp => {
                  return resp.text()
              }).then(text => {
                  let e = document.createElement("script");
                  e.innerHTML = text;
                  document.head.appendChild(e);
              })
          </script>
          

          這樣a.js就不會出現(xiàn)在source里了

          network

          常規(guī)HTTP/WebSocket都會被記錄,無法繞過,但是WebRTC不會,WebRTC可以基于UDP/TCP傳輸,WebRTC提供createDataChannel API,可以用于傳輸文本,那么就可以實現(xiàn)network隱藏加載

          考慮WebRTC需要傳遞offer和icecandidate,還是得通過HTTP/WebSocket傳輸,而且復雜網(wǎng)絡環(huán)境下還需要使用或部署STUN/TURN服務器,穩(wěn)定性有待考慮

          WebRTC技術(shù)可以參考學習我最近看的幾篇文章透明日報20200801期

          其他的方法我還沒有找到,技術(shù)不行就社會工程

          一個思路是可以偽裝成其他流量混過去,比如png

          <script>
              fetch("a.png").then(resp => {
                  return resp.text()
              }).then(text => {
                  let e = document.createElement("script");
                  e.innerHTML = text;
                  document.head.appendChild(e);
              })
          </script>
          

          然后在delvtools里也看不出來

          另外一個思路是devtools目前只在打開的時候記錄network數(shù)據(jù),那么只要在devtools關(guān)閉的時候加載資源,打開就不加載,這樣就不會出現(xiàn)在network里了

          新的問題又出現(xiàn)了,如何檢測devtools的狀態(tài),網(wǎng)上已經(jīng)有不少公開技巧了

          https://github.com/sindresorhus/devtools-detect

          https://github.com/AEPKILL/devtools-detector

          最后

          還可以在哪里找到加載和執(zhí)行痕跡呢

          還有什么方法可以隱藏這些痕跡呢

          如果你現(xiàn)在也想學習前端開發(fā)技術(shù),在學習前端的過程當中有遇見任何關(guān)于學習方法,學習路線,學習效率等方面的問題,你都可以申請加入我的Q群:前114中6649后671還有大牛整理的一套高效率學習路線和教程與您免費分享,還有許多大廠面試真題。希望能夠?qū)δ銈冇兴鶐椭?/p>

          能大家都知道,js執(zhí)行會阻塞DOM樹的解析和渲染,那么css加載會阻塞DOM樹的解析和渲染嗎?接下來,我們就一起來分析一下。

          原理解析

          那么為什么會出現(xiàn)上面的現(xiàn)象呢?我們從瀏覽器的渲染過程來解析下。

          不同的瀏覽器使用的內(nèi)核不同,所以他們的渲染過程也是不一樣的。目前主要有兩個:

          webkit渲染過程

          Gecko渲染過程

          從上面兩個流程圖我們可以看出來,瀏覽器渲染的流程如下:

          1. HTML解析文件,生成DOM Tree,解析CSS文件生成CSSOM Tree
          2. 將Dom Tree和CSSOM Tree結(jié)合,生成Render Tree(渲染樹)
          3. 根據(jù)Render Tree渲染繪制,將像素渲染到屏幕上。

          從流程我們可以看出來

          1. DOM解析和CSS解析是兩個并行的進程,所以這也解釋了為什么CSS加載不會阻塞DOM的解析。
          2. 然而,由于Render Tree是依賴于DOM Tree和CSSOM Tree的,所以他必須等待到CSSOM Tree構(gòu)建完成,也就是CSS資源加載完成(或者CSS資源加載失敗)后,才能開始渲染。因此,CSS加載是會阻塞Dom的渲染的。
          3. 由于js可能會操作之前的Dom節(jié)點和css樣式,因此瀏覽器會維持html中css和js的順序。因此,樣式表會在后面的js執(zhí)行前先加載執(zhí)行完畢。所以css會阻塞后面js的執(zhí)行。

          DOMContentLoaded

          對于瀏覽器來說,頁面加載主要有兩個事件,一個是DOMContentLoaded,另一個是onLoad。而onLoad沒什么好說的,就是等待頁面的所有資源都加載完成才會觸發(fā),這些資源包括css、js、圖片視頻等。

          而DOMContentLoaded,顧名思義,就是當頁面的內(nèi)容解析完成后,則觸發(fā)該事件。那么,正如我們上面討論過的,css會阻塞Dom渲染和js執(zhí)行,而js會阻塞Dom解析。那么我們可以做出這樣的假設(shè)

          1. 當頁面只存在css,或者js都在css前面,那么DomContentLoaded不需要等到css加載完畢。
          2. 當頁面里同時存在css和js,并且js在css后面的時候,DomContentLoaded必須等到css和js都加載完畢才觸發(fā)。

          我們先對第一種情況做測試:

          <!DOCTYPE html>
          <html lang="en">
           <head>
           <title>css阻塞</title>
           <meta charset="UTF-8">
           <meta name="viewport" content="width=device-width, initial-scale=1">
           <script>
           document.addEventListener('DOMContentLoaded', function() {
           console.log('DOMContentLoaded');
           })
           </script>
           <link  rel="stylesheet">
           </head>
           <body>
           </body>
          </html>
          

          實驗結(jié)果如下圖:

          從動圖我們可以看出來,css還未加載完,就已經(jīng)觸發(fā)了DOMContentLoaded事件了。因為css后面沒有任何js代碼。

          接下來我們對第二種情況做測試,很簡單,就在css后面加一行代碼就行了

          <!DOCTYPE html>
          <html lang="en">
           <head>
           <title>css阻塞</title>
           <meta charset="UTF-8">
           <meta name="viewport" content="width=device-width, initial-scale=1">
           <script>
           document.addEventListener('DOMContentLoaded', function() {
           console.log('DOMContentLoaded');
           })
           </script>
           <link  rel="stylesheet">
           <script>
           console.log('到我了沒');
           </script>
           </head>
           <body>
           </body>
          </html>
          

          實驗結(jié)果如下圖:

          我們可以看到,只有在css加載完成后,才會觸發(fā)DOMContentLoaded事件。因此,我們可以得出結(jié)論:

          1. 如果頁面中同時存在css和js,并且存在js在css后面,則DOMContentLoaded事件會在css加載完后才執(zhí)行。
          2. 其他情況下,DOMContentLoaded都不會等待css加載,并且DOMContentLoaded事件也不會等待圖片、視頻等其他資源加載。

          總結(jié)

          由上所述,我們可以得出以下結(jié)論:

          1. css加載不會阻塞DOM樹的解析
          2. css加載會阻塞DOM樹的渲染
          3. css加載會阻塞后面js語句的執(zhí)行、

          因此,為了避免讓用戶看到長時間的白屏時間,我們應該盡可能的提高css加載速度,比如可以使用以下幾種方法:

          1. 使用CDN(因為CDN會根據(jù)你的網(wǎng)絡狀況,替你挑選最近的一個具有緩存內(nèi)容的節(jié)點為你提供資源,因此可以減少加載時間)
          2. 對css進行壓縮(可以用很多打包工具,比如webpack,gulp等,也可以通過開啟gzip壓縮)
          3. 合理的使用緩存(設(shè)置cache-control,expires,以及E-tag都是不錯的,不過要注意一個問題,就是文件更新后,你要避免緩存而帶來的影響。其中一個解決防范是在文件名字后面加一個版本號)
          4. 減少http請求數(shù),將多個css文件合并,或者是干脆直接寫成內(nèi)聯(lián)樣式(內(nèi)聯(lián)樣式的一個缺點就是不能緩存)

          主站蜘蛛池模板: 国产成人综合一区精品| 久久精品国产一区二区三| 国产精品免费综合一区视频| 无码人妻一区二区三区在线视频 | 久久精品无码一区二区app| 人妻少妇一区二区三区| 久久精品一区二区国产| 亚洲av成人一区二区三区| 色婷婷亚洲一区二区三区| 精品一区二区三区免费观看 | 一区二区三区视频网站| 亚洲.国产.欧美一区二区三区| 久久久久99人妻一区二区三区| 国产天堂一区二区综合| 国产不卡视频一区二区三区| 波多野结衣中文一区| 国产精品一区二区AV麻豆| 精品免费国产一区二区| 国产激情一区二区三区四区| 国产成人无码精品一区不卡| 国内精品一区二区三区在线观看| 亚洲欧美国产国产一区二区三区 | 亚洲一区欧洲一区| 亚洲熟妇av一区| 一色一伦一区二区三区| 冲田杏梨AV一区二区三区| 国产成人一区二区在线不卡| 国产高清一区二区三区视频| 视频一区二区三区免费观看| 波多野结衣中文字幕一区二区三区 | 一区二区中文字幕| 亚洲熟妇AV一区二区三区浪潮| 中文字幕人妻AV一区二区| 理论亚洲区美一区二区三区 | 精品人妻少妇一区二区| 国产精品污WWW一区二区三区| 国产成人精品无码一区二区三区 | 亚洲人成人一区二区三区| 中文字幕人妻无码一区二区三区| 在线视频精品一区| 无码人妻精品一区二区三区99性|