整合營銷服務商

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

          免費咨詢熱線:

          3行css實現循環動畫,順便說說瀏覽器兼容性

          前端開發來說,通過動畫來提升交互效果是很常見的。在很早以前,做web動畫主要通過javascript或者jquery或者flash這樣的手段,非常麻煩,自打有了ccs3,做動畫就太方便了,只需幾行css代碼就可以搞定。

          這里我們就演示一個常見的循環滾動效果,任務是這樣:先準備一個圖片,平鋪到頁面上充滿整個屏幕,然后就讓畫面一直向上循環滾動,形成無邊無際的感覺。

          雖然可以從網上搜到一些類似的代碼,但是魚龍混雜,無關緊要的代碼非常多,不夠純粹。如果要弄明白動畫的原理,只有自己動手做一遍才能真正消化吃透。所以我們來一步步原創這個代碼,排除所有不必要的基礎樣式,只說要點,3個步驟你就可以完全掌握其精髓!

          第一步:布局

          首先,滾動的圖片需要放在一個容器里,一行html代碼即可完成:

          第二步:把圖片放進容器

          css中body的邊界設為0,把容器設高度100%以充滿屏幕,再調用背景圖pic.png

          第三部:讓畫面動起來

          咱不做標題黨,循環滾動靠的就是3行css動起來的。

          先是1行 -webkit-animation屬性:4個參數分別表示:動畫名稱scroll,1秒時長,移動速度為線性的,無限循環。

          然后是對應的關鍵幀 @-webkit-keyframes 屬性,這是自己定義的動畫規則,只需寫2行規則即可:

          原理:動畫就是畫從一個地方動到另一個地方。對普通滾動效果來說,有起點和終點這兩個節點的位置就夠了。所以我們用0%和100%分別表示起點和終點,指定2個背景圖的xy位置坐標即可。圖片會在規定時間內從起點移動到終點,并循環下去,數值是負表示是向上移動。320px正好是圖片的高度,這樣循環的時候是無縫銜接的。

          好了,最終完整的代碼如下,是不是很精練呢?保存成 index.html 即可

          代碼寫完了,還要記得在當前目錄要有pic.png這個圖片哦,我隨便畫了幾筆,絕無觀賞性,建議自己找個好看點的圖片來代替。

          現在用瀏覽器打開index.html即可看到效果,比較魔性的地方在于,如果你盯著看久了,關閉窗口以后會出現幻覺,仿佛整個顯示器都在向上飛,哈哈!

          最后我們來說說瀏覽器兼容性問題:

          大家可能注意到了,前面那2個古怪的 -webkit-animation, @-webkit-keyframes 這里的-webkit-其實是一個前綴,animation和@keyframes才是CSS的標準屬性。

          當加上-webkit-后,就形成了一個針對特殊瀏覽器的專有屬性,表示用在谷歌的chrome和蘋果的safari瀏覽器上。此外還有-moz前綴代表針對firefox瀏覽器的私有屬性。

          所以我們在用到css3的一些特性的時候,經常使用一大堆的重復性的代碼,比如我們今天的這個代碼,有人會寫成這個樣子:

          一個簡單的動畫就要寫這么多冗余的代碼,為的只是支持一些舊的瀏覽器,有必要嗎?為什么在這個例子中我們僅僅采用了-webkit-而沒有使用其它專有屬性呢?

          因為現在已經是2019年了!谷歌蘋果的瀏覽器是主流,占據了絕大部分,而其它小眾瀏覽器也大多能夠兼容他們,在版本上,大部分人安裝瀏覽器是直接下載新版本安裝使用,而非找出家里陳年的老軟盤、老光盤去安裝,家中的老電腦也早已升級不知多少回了,所以也幾乎沒有機會使用低版本的瀏覽器了!

          至于微軟的IE,就更別提了,IE9以前不支持動畫的,只能用js或者jquery來寫動畫,直到IE10才支持css動畫,隨后IE被放棄,主推Edge,搞了幾天越來越頭大干脆也放棄,現在直接使用chrome內核了,所以針對ie的兼容性除非有特殊要求已經無需考慮。

          你在網上能看到的范例代碼,如果有寫成那么復雜臃腫的,估計也都是3-5年前發的老文,或者抄來抄去不做思考的搬磚工留下的“初學者”筆記。

          我們不仿測試一下幾款主流瀏覽器的情況看看,結論:

          測試結果表明,-webkit-的寫法在4款不同內核的瀏覽器上都能正常使用,所以我們的代碼因此能得以簡化。

          當然,這個例子也有局限性,比如你看,只有蘋果safari不支持標準寫法,萬一將來他改邪歸正了呢?畢竟標準寫法才是眾望所歸不是?使用針對個別瀏覽器的私有屬性寫法,雖可用但畢竟有些怪怪的,將來怎么樣還很難說呢。這樣看來,如果使用古老的處理辦法,重復N次為每個專屬瀏覽器各寫一份代碼,除了辣眼睛也真沒什么錯。

          瀏覽器的兼容問題涉及面實在是非常廣,三言兩語還真說不完,以后會專門來講。

          avaScript 語言中的 for 循環用于多次執行代碼塊,它是 JavaScript 中最常用的一個循環工具,還可用于數組的遍歷循環等。

          我們為什么要使用 for 循環呢?打個比方,例如我們想要控制臺輸出1到1000之間的所有數字,如果單寫輸出語句,要寫1000句代碼,但是如果使用 for 循環,幾句代碼就能實現??傊?,使用 for 循環能夠讓我們寫代碼更方便快捷(當然啦,否則要它干嘛)。

          for 循環語法

          語法如下所示:

          for(變量初始化; 條件表達式; 變量更新) {
              // 條件表達式為true時執行的語句塊
          }
          
          • 變量初始化,表示代碼塊開始前執行。
          • 條件表達式,定義運行循環代碼塊的條件。
          • 變量更新,在循環代碼塊每次被執行之后再執行。

          示例:

          例如我們在一個HTML文件中,編寫如下代碼,實現計算1到100的總和:

          <!DOCTYPE html>
          <html>
          <head>
          <meta charset="utf-8">
          <title>JS_俠課島(9xkd.com)</title>
          </head>
          <body>
          <script>
            var result = 0;
            for(var i = 1; i <= 100; i++) {
              result = result + i;
            }
            alert(result);
          </script>
          </body>   
          </html>
          

          在瀏覽器中打開這個文件,會彈出一個彈出層,彈出層中顯示的是1到100的總和:


          上述代碼中,我們聲明了一個變量 result 并給它賦值為 0,表示初始的總和為 0 。


          然后在 for 循環中三個語句:

          • 變量初始化 i = 1,表示從 1 開始計算。
          • 條件表達式 i <= 100,表示只要 i 小于等于 100 循環就會一直執行,當 i 大于 100 循環會停止。
          • 變量更新 i++,之前我們學運算符的時候學過,這是遞增運算符 ++,表示為其操作數增加 1。

          此時我們可以一點點來看這個 for 循環:

          第一次循環: result = 0 + 1   // 此時result值為0,  i的值為1
          第二次循環: result = 1 + 2   // 此時result值為0+1,i的值為2
          第三次循環: result = 3 + 3   // 此時result值為1+2,i的值為3
          第四次循環: result = 6 + 4   // 此時result值為3+3,i的值為4
          第五次循環: result = 10 + 5  // 此時result值為6+4,i的值為5
          ...
          

          我們只需要搞清楚 for 循環中的執行原理,不需要手動來計算求和,只要寫好代碼,執行代碼后計算機會很快會告訴我們1到 100 的總和。

          再補充一下,上述代碼中result = result + i,我們也可以寫成 result += i,這是我們之前學過的加賦值運算符,還記得嗎?

          示例:

          再來看一個例子,例如我們可以使用 for 循環來實現數組遍歷,首先定義一個數組 lst:

          var lst = ["a", "b", "c", "d", "e"];
          

          在寫 for 循環時,首先就是要搞清楚小括號里面的三個語句,因為我們可以通過數組中元素的下標索引來獲取元素的值,而數組的索引又是從 0 開始,所以變量初始化可以設置為i = 0。第二個條件表達式,因為數組中最后一個索引為 lst.length - 1,所以只要小于等于 lst.length - 1,循環就會一直執行。而i <= lst.length - 1 就相當于 i<lst.length。第三個變量更新,當循環每循環一次,索引值就加一,所以為 i++。

          所以循環可以像下面這樣寫:

          for(i = 0; i<lst.length; i++){
              console.log(lst[i]);  // 輸出數組中的元素值,從索引為0的值開始輸出,每次加1,一直到lst.length-1
          }
          

          輸出:

          a
          b
          c
          d
          e
          

          其實遍歷數組還有一種更好的方法,就是使用 for...in 循環語句來遍歷數組。

          for...in 循環

          for...in 循環主要用于遍歷數組或對象屬性,對數組或對象的屬性進行循環操作。for...in 循環中的代碼每執行一次,就會對數組的元素或者對象的屬性進行一次操作。

          語法如下:

          for (變量 in 對象) {
              // 代碼塊
          }
          

          for 循環括號內的變量是用來指定變量,指定的可以是數組對象或者是對象屬性。

          示例:

          使用 for...in 循環遍歷我們定義好的 lst 數組:

          var lst = ["a", "b", "c", "d", "e"];
          for(var l in lst){
              console.log(lst[l]);
          }
          

          輸出:

          a
          b
          c
          d
          e
          

          除了數組,for...in 循環還可以遍歷對象,例如我們遍歷 俠俠 的個人基本信息:

          var object = {
              姓名:'俠俠',
              年齡:'22',
              性別:'男',
              出生日期:'1997-08-05',
              職業:'程序員',
              特長:'跳舞'
          }
          
          for(var i in object) {
              console.log(i + ":" + object[i]);
          }
          

          輸出:

          姓名: 俠俠
          年齡: 22
          性別: 男
          出生日期: 1997-08-05
          職業:程序員
          特長:跳舞
          

          動手小練習

          1. 請自定義一個長度為7的數組,然后通過 for 循環將數組中的元素遍歷出來。
          2. 求和:1~100的奇數和。
          3. 求和:1~100的偶數和。
          4. 使用對象定義一個人的個人信息(包括姓名、性別、年齡、出生日期、興趣愛好、職業、特長等),然后使用 for...in 循環將這些信息遍歷輸出。

          循環可以將代碼塊執行指定的次數。

          JavaScript 循環

          如果您希望一遍又一遍地運行相同的代碼,并且每次的值都不同,那么使用循環是很方便的。

          我們可以這樣輸出數組的值:

          一般寫法:

          document.write(cars[0] + "<br>");

          document.write(cars[1] + "<br>");

          document.write(cars[2] + "<br>");

          document.write(cars[3] + "<br>");

          document.write(cars[4] + "<br>");

          document.write(cars[5] + "<br>");

          使用for循環

          for (var i=0;i<cars.length;i++)

          {

          document.write(cars[i] + "<br>");

          }

          不同類型的循環

          JavaScript 支持不同類型的循環:

          • for - 循環代碼塊一定的次數

          • for/in - 循環遍歷對象的屬性

          • while - 當指定的條件為 true 時循環指定的代碼塊

          • do/while - 同樣當指定的條件為 true 時循環指定的代碼塊

          For 循環

          for 循環是您在希望創建循環時常會用到的工具。

          下面是 for 循環的語法:

          for (語句 1; 語句 2; 語句 3)

          {

          被執行的代碼塊

          }

          語句 1 (代碼塊)開始前執行 starts.

          語句 2 定義運行循環(代碼塊)的條件

          語句 3 在循環(代碼塊)已被執行之后執行

          實例

          for (var i=0; i<5; i++)

          {

          x=x + "該數字為 " + i + "<br>";

          }

          從上面的例子中,您可以看到:

          Statement 1 在循環開始之前設置變量 (var i=0)。

          Statement 2 定義循環運行的條件(i 必須小于 5)。

          Statement 3 在每次代碼塊已被執行后增加一個值 (i++)。

          語句 1

          通常我們會使用語句 1 初始化循環中所用的變量 (var i=0)。

          語句 1 是可選的,也就是說不使用語句 1 也可以。

          您可以在語句 1 中初始化任意(或者多個)值:

          實例:

          for (var i=0,len=cars.length; i<len; i++)

          {

          document.write(cars[i] + "<br>");

          }

          同時您還可以省略語句 1(比如在循環開始前已經設置了值時):

          實例:

          var i=2,len=cars.length;

          for (; i<len; i++)

          {

          document.write(cars[i] + "<br>");

          }

          語句 2

          通常語句 2 用于評估初始變量的條件。

          語句 2 同樣是可選的。

          如果語句 2 返回 true,則循環再次開始,如果返回 false,則循環將結束。

          如果您省略了語句 2,那么必須在循環內提供 break。否則循環就無法停下來。這樣有可能令瀏覽器崩潰。請在本教程稍后的章節閱讀有關 break 的內容。

          語句 3

          通常語句 3 會增加初始變量的值。

          語句 3 也是可選的。

          語句 3 有多種用法。增量可以是負數 (i--),或者更大 (i=i+15)。

          語句 3 也可以省略(比如當循環內部有相應的代碼時):

          實例:

          var i=0,len=cars.length;

          for (; i<len; )

          {

          document.write(cars[i] + "<br>");

          i++;

          }

          for/In 循環

          JavaScript for/in 語句循環遍歷對象的屬性:

          實例

          var person={fname:"John",lname:"Doe",age:25};

          for (x in person)

          {

          txt=txt + person[x];

          }

          您將在有關 JavaScript 對象的章節學到更多有關 for / in 循環的知識。

          While 循環

          我們將在下一章為您講解 while 循環和 do/while 循環。

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!


          主站蜘蛛池模板: 精品熟人妻一区二区三区四区不卡 | 亚洲欧洲专线一区| 亚洲码欧美码一区二区三区| 成人免费一区二区三区| 国产精品分类视频分类一区| 一区二区三区在线免费 | 视频在线观看一区| 国产视频一区二区在线播放| 四虎成人精品一区二区免费网站| 精品欧洲av无码一区二区| 一区二区三区免费看| 亚洲av日韩综合一区久热| 国产一区二区三区高清在线观看 | 久久综合一区二区无码| 国产大秀视频在线一区二区| 国产成人精品久久一区二区三区av | 精品人妻AV一区二区三区| 精品日本一区二区三区在线观看| 色噜噜一区二区三区| 精品无码人妻一区二区三区品| 亚洲国产日韩一区高清在线| 老湿机一区午夜精品免费福利| 乱中年女人伦av一区二区| 国产一区二区三区乱码在线观看| 亚洲日韩中文字幕无码一区| 精品国产日产一区二区三区| 内射白浆一区二区在线观看| 亚洲AV一区二区三区四区| 色狠狠AV一区二区三区| 中文人妻av高清一区二区| 亚洲国产精品成人一区| 国产一区二区影院| 日韩在线视频不卡一区二区三区| 国产精品一区电影| 学生妹亚洲一区二区| 无码人妻久久久一区二区三区| 无码人妻精品一区二区蜜桃| 麻豆国产一区二区在线观看| 国99精品无码一区二区三区| 高清国产精品人妻一区二区| 国产亚洲自拍一区|