Google AMP - ภาพเคลื่อนไหว

Amp-animation เป็นส่วนประกอบของแอมป์ที่กำหนดภาพเคลื่อนไหวที่จะใช้กับส่วนประกอบแอมป์อื่น ๆ บทนี้จะกล่าวถึงรายละเอียด

ในการทำงานกับ amp-animation เราต้องเพิ่มสคริปต์ต่อไปนี้ -

<script async custom-element = "amp-animation" 
   src = "https://cdn.ampproject.org/v0/amp-animation-0.1.js">
</script>

รายละเอียดของภาพเคลื่อนไหวถูกกำหนดไว้ภายในโครงสร้าง json

โครงสร้างพื้นฐานของ amp-animation ดังที่แสดงไว้ที่นี่ -

<amp-animation layout = "nodisplay">
   <script type = "application/json">
      {
         // Timing properties
         ...
         "animations": [
            {
               // animation 1
            },
            ...
            {
               // animation n
            }
         ]
      }
   </script>
</amp-animation>

animation ส่วนประกอบประกอบด้วยสิ่งต่อไปนี้ - Selectors, Variables, Timing Properties, Keyframes etc.

{
   "selector": "#target-id",
   // Variables
   // Timing properties
   // Subtargets
   ...
   "keyframes": []
}

ตัวเลือก

ที่นี่เราต้องให้คลาสหรือ id ขององค์ประกอบที่จะใช้ภาพเคลื่อนไหว

ตัวแปร

เป็นค่าที่กำหนดให้ใช้ภายในคีย์เฟรม ตัวแปรถูกกำหนดโดยใช้var().

ตัวอย่าง

{
   "--delay": "0.5s",
   "animations": [
      {
         "selector": "#target1",
         "delay": "var(--delay)",
         "--x": "150px",
         "--y" : "200px",
         "keyframes": {
            "transform": "translate(var(--x), var(--y, 0px)"
         }
      }
   ]
}

ที่นี่ delay, x และ y เป็นตัวแปรและค่าของตัวแปรถูกกำหนดไว้ในตัวอย่างที่แสดง

คุณสมบัติของเวลา

คุณสามารถกำหนดระยะเวลาและความล่าช้าของภาพเคลื่อนไหวได้ที่นี่ ต่อไปนี้เป็นคุณสมบัติเวลาที่รองรับ -

ทรัพย์สิน มูลค่า คำอธิบาย
ระยะเวลา คุณสมบัติของเวลาค่าจะต้องเป็นมิลลิวินาที ระยะเวลาที่ใช้สำหรับภาพเคลื่อนไหว
ล่าช้า คุณสมบัติของเวลาค่าจะต้องเป็นมิลลิวินาที ความล่าช้าก่อนที่ภาพเคลื่อนไหวจะเริ่มดำเนินการ
endDelay คุณสมบัติเวลาค่าจะต้องเป็นมิลลิวินาทีหรือวินาที ความล่าช้าที่กำหนดซึ่งจะมีผลเมื่อภาพเคลื่อนไหวเสร็จสิ้น
การทำซ้ำ ค่าต้องเป็นตัวเลข จำนวนครั้งที่ต้องเล่นภาพเคลื่อนไหวซ้ำ
เริ่มต้น ค่าต้องเป็นตัวเลข เวลาชดเชยที่เอฟเฟกต์เริ่มเคลื่อนไหว
การค่อยๆเปลี่ยน ค่าคือสตริง สิ่งนี้ใช้เพื่อรับเอฟเฟกต์การค่อยๆเปลี่ยนให้กับแอนิเมชั่นตัวอย่างบางส่วนสำหรับการค่อยๆเปลี่ยนเป็นแบบเชิงเส้นความง่ายความสะดวกในการคลายออกความง่ายในการเข้าออก
ทิศทาง ค่าคือสตริง หนึ่งใน "ปกติ" "ย้อนกลับ" "ทางเลือก" หรือ "ทางเลือกย้อนกลับ"
เติม ค่าคือสตริง ค่าสามารถเป็น "ไม่มี" "ไปข้างหน้า" "ถอยหลัง" "ทั้งคู่" "อัตโนมัติ"

คีย์เฟรม

คีย์เฟรมสามารถกำหนดได้หลายวิธีเช่นในรูปแบบวัตถุหรือรูปแบบอาร์เรย์ ลองพิจารณาตัวอย่างต่อไปนี้

ตัวอย่าง

"keyframes": {"transform": "translate(100px,200px)"}

ตัวอย่าง

{
   "keyframes": {

      "opacity": [1, 0],
      "transform": ["scale(1)", "scale(2)"]
   }
}

ตัวอย่าง

{
   "keyframes": [
      {"opacity": 1, "transform": "scale(1)"},
      {"opacity": 0, "transform": "scale(2)"}
   ]
}

ตัวอย่าง

{
   "keyframes": [
      {"easing": "ease-out", "opacity": 1, "transform": "scale(1)"},
      {"opacity": 0, "transform": "scale(2)"}
   ]
}

คีย์เฟรมโดยใช้ CSS

<style amp-custom>
   div {
      width: 100px;
      height: 100px;
      background-color: red;
      position: relative;
      margin: 0 auto;
      transform:scale(3);
   }
   @keyframes example { 0% {transform:scale(3)}
      75% {transform:scale(2)}
      100% {transform:scale(1)}
   }

</style>

<amp-animation layout = "nodisplay">
   <script type = "application/json">
      {
         "duration": "4s",
         "keyframes": "example"
      }
   </script>
</amp-animation>

มีคุณสมบัติ CSS บางอย่างที่สามารถใช้ภายในคีย์เฟรมได้ สิ่งที่รองรับเรียกว่าคุณสมบัติที่อนุญาตพิเศษ ต่อไปนี้เป็นคุณสมบัติที่อนุญาตพิเศษซึ่งสามารถใช้ได้ภายในคีย์เฟรม -

  • opacity
  • transform
  • visibility
  • 'offsetDistance'

Note - การใช้คุณสมบัติอื่น ๆ นอกเหนือจากรายการสีขาวจะทำให้เกิดข้อผิดพลาดในคอนโซล

ตอนนี้ให้เราทำความเข้าใจผ่านตัวอย่างง่ายๆซึ่งจะหมุนภาพเมื่อใช้ภาพเคลื่อนไหว ในตัวอย่างนี้เรากำลังหมุนภาพโดยใช้ amp-animation

ตัวอย่าง

<!doctype html>
<html amp lang = "en">
   <head>
      <meta charset = "utf-8">
      <script async src = "https://cdn.ampproject.org/v0.js"></script>
      <title>Google AMP - Amp Video</title>
      <link rel = "canonical" href = "http://example.ampproject.org/article-metadata.html">
      <meta name = "viewport" content = "width = device-width, minimum-scale = 1,initial-scale = 1">
   
      <style amp-boilerplate>
         body{
            -webkit-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-ms
            -amp-start 8s steps(1,end) 0s 1 normal both;animation:
            -amp-start 8s steps(1,end) 0s 1 normal both
         }
         @-webkit-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}
      </style>
   
      <noscript>
         <style amp-boilerplate>
            body{
               -webkit-animation:none;
               -moz-animation:none;
               -ms-animation:none;
               animation:none
            }
         </style>
      </noscript>
   
      <script async custom-element = "amp-animation" 
         src =" https://cdn.ampproject.org/v0/amp-animation-0.1.js">
      </script>
      <style amp-custom>
         amp-img {
            border: 1px solid black;
            border-radius: 4px;
            padding: 5px;
         }
      </style>
   </head>
   <body>
      <h3>Google AMP - Amp Animation Example</h3>
      <amp-animation id = "anim1" layout = "nodisplay" trigger = "visibility">
         <script type = "application/json">
            {
               "duration": "1s",
               "fill": "both",
               "direction": "alternate",
               "animations": [
                  {
                     "selector": "#image1",
                     "easing": "cubic-bezier(0,0,.21,1)",
                     "keyframes": {
                        "transform": "rotate(20deg)"
                     }
                  }
               ]
            }
         </script>
      </amp-animation>
      <br/>
      <br/>
      <amp-img 
         id = "image1" 
         src = "images/christmas1.jpg" 
         width = 300 
         height = 250 
         layout = "responsive">
      </amp-img>
      <br/>
   </body>
</html>

เอาต์พุต

รายละเอียดของรายละเอียดแอมป์ - แอนิเมชั่นที่ใช้ข้างต้นมีให้ในโค้ดที่แสดงด้านล่าง

<amp-animation id = "anim1" layout = "nodisplay" trigger = "visibility">
   <script type = "application/json">
   {
      "duration": "1s",
      "fill": "both",
      "direction": "alternate",
      "animations": [
         {
            "selector": "#image1",
            "easing": "cubic-bezier(0,0,.21,1)",
            "keyframes": {
               "transform": "rotate(20deg)"
            }
         }
      ]
   }
   </script>
</amp-animation>

ตัวเลือกที่นี่คือรหัสของรูปภาพที่ใช้แอนิเมชั่นการหมุน -

<amp-img 
   id = "image1" 
   src = "images/christmas1.jpg" 
   width = 300 
   height = 250 
   layout = "responsive">
</amp-img>

ตัวอย่างการใช้คีย์เฟรมจาก CSS

ตัวอย่าง

<!doctype html>
<html amp lang = "en">
   <head>
      <meta charset = "utf-8">
      <script async src = "https://cdn.ampproject.org/v0.js"></script>
      <title>Google AMP - Amp Video</title>
      <link rel = "canonical" href = "http://example.ampproject.org/article-metadata.html">
      <meta name = "viewport" content = "width = device-width,minimum-scale = 1,initial-scale = 1">
      <style amp-boilerplate>
         body{
            -webkit-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;animation:
            -amp-start 8s steps(1,end) 0s 1 normal both
         }
         @-webkit-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}
      </style>
      <noscript>
         <style amp-boilerplate>
            body{
               -webkit-animation:none;
               -moz-animation:none;
               -ms-animation:none;
               animation:none
            }
         </style>
      </noscript>
      <script async custom-element = "amp-animation"
         src = "https://cdn.ampproject.org/v0/amp-animation-0.1.js">
      </script>
      <style amp-custom>
         div {
            width: 100px;
            height: 100px;
            background-color: red;
            position: relative;
            margin: 0 auto;
            transform:scale(3);
         }

         @keyframes example {
            0% {transform:scale(3)}
            75% {transform:scale(2)}
            100% {transform:scale(1)}
         }
      </style>
   </head>
   <body>
      <h3>Google AMP - Amp Animation Example</h3>
      <amp-animation id = "anim1" layout = "nodisplay" trigger = "visibility">
         <script type = "application/json">
            {
               "duration": "3s",
               "fill": "both",
               "direction": "alternate",
               "animations": [{
                  "selector": "#image1",
                  "easing": "cubic-bezier(0,0,.21,1)",
                  "keyframes":"example"
               }]
            }
         </script>
      </amp-animation>
      <br/>
      <br/>
      <div id = "image1"></div>
      <br/>
   </body>
</html>

เอาต์พุต

ทริกเกอร์ภาพเคลื่อนไหว

ด้วย trigger =” visibility” ภาพเคลื่อนไหวจะถูกนำไปใช้โดยค่าเริ่มต้น ในการเริ่มภาพเคลื่อนไหวในเหตุการณ์เราต้องลบ trigger =” visibility” และเพิ่มเหตุการณ์เพื่อเริ่มภาพเคลื่อนไหวดังที่แสดงในตัวอย่างด้านล่าง -

ตัวอย่าง

<!doctype html>
<html amp lang = "en">
   <head>
      <meta charset = "utf-8">
      <script async src = "https://cdn.ampproject.org/v0.js"></script>
      <title>Google AMP - Amp Video</title>
      <link rel = "canonical" href = "http://example.ampproject.org/article-metadata.html">
      <meta name = "viewport" content = "width = device-width,
      minimum-scale = 1,initial-scale = 1">
      <style amp-boilerplate>
         body{
            -webkit-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;animation:
            -amp-start 8s steps(1,end) 0s 1 normal both
         }
         @-webkit-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}
      </style>
      <noscript>
         <style amp-boilerplate>                      
            body{
               -webkit-animation:none;
               -moz-animation:none;
               -ms-animation:none;
               animation:none}
         </style>
      </noscript>
      <script async custom-element = "amp-animation" 
         src = "https://cdn.ampproject.org/v0/amp-animation-0.1.js">
      </script>
      <style amp-custom>
         div {
            width: 100px;
            height: 100px;
            background-color: red;
            position: relative;
            margin: 0 auto;
            transform:scale(2); 
         }
         @keyframes example {
            0% {transform:scale(2)}
            75% {transform:scale(1)}
            100% {transform:scale(0.5)}
         }
         button{ 
            background-color: #ACAD5C; 
            color: white; 
            padding: 12px 20px; 
            border: none; 
            border-radius: 4px; 
            cursor: pointer; 
            float: left;
         }
      </style>
   </head>
   <body>
      <h3>Google AMP - Amp Animation Example</h3>
      <amp-animation id = "anim1" layout = "nodisplay">
         <script type = "application/json">
            {        
               "duration": "3s",
               "fill": "both",
               "direction": "alternate",
               "animations": [{
                  "selector": "#image1",
                  "easing": "cubic-bezier(0,0,.21,1)",
                  "keyframes":"example"
               }]
            }
         </script>
      </amp-animation>
      <button on = "tap:anim1.start">Start</button>
      <br/>
      <br/>
      <div id = "image1"></div>
   </body>
</html>

โปรดทราบว่าภาพเคลื่อนไหวจะเริ่มขึ้นเมื่อแตะปุ่มเริ่ม

เอาต์พุต

เราได้ใช้การกระทำที่เรียกว่า startเปิดเพื่อเริ่มต้นด้วยภาพเคลื่อนไหว ในทำนองเดียวกันมีการดำเนินการอื่น ๆ ที่รองรับซึ่งมีดังต่อไปนี้ -

  • start
  • pause
  • restart
  • resume
  • togglePause
  • seekTo
  • reverse
  • finish
  • cancel

ให้เราดูตัวอย่างการทำงานที่เราสามารถใช้การกระทำ

ตัวอย่าง

<!doctype html>
<html amp lang = "en">
   <head>
      <meta charset = "utf-8">
      <script async src = "https://cdn.ampproject.org/v0.js"></script>
      <title>Google AMP - Amp Video</title>
      <link rel = "canonical" href = "http://example.ampproject.org/article-metadata.html">
      <meta name = "viewport" content = "width=device-width,minimum-scale = 1,initial-scale = 1">
      
      <style amp-boilerplate>
         body{
            -webkit-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:
            -amp-start 8s steps(1,end) 0s 1 normal both;animation:
            -amp-start 8s steps(1,end) 0s 1 normal both
         }
         @-webkit-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes 
         -amp-start{from{visibility:hidden}to{visibility:visible}}
      </style>
      
      <noscript>
         <style amp-boilerplate> 
            body{
               -webkit-animation:none;
               -moz-animation:none;
               -ms-animation:none;
               animation:none}
         </style>
      </noscript>
      <script async custom-element = "amp-animation" 
         src = "https://cdn.ampproject.org/v0/amp-animation-0.1.js">
      </script>
      <style amp-custom>
         #image1 {
            width: 100px;
            height: 100px;
            background-color: red;
            position: relative;
            margin: 0 auto;
            transform:scale(2);
         }
         @keyframes example {
            0% {transform:scale(2)}
            75% {transform:scale(1)}
            100% {transform:scale(0.5)}
         }
         button1{
            background-color: #ACAD5C; 
            color: white; 
            padding: 12px 20px; 
            border: none; 
            border-radius: 4px; 
            cursor: pointer; 
            float: left;
         }
      </style>
   </head>
   <body>
      <h3>Google AMP - Amp Animation Example</h3>
      <amp-animation id = "anim1" layout = "nodisplay">
         <script type = "application/json">
            {
               "duration": "3s",
               "fill": "both",
               "direction": "alternate",
               "animations": [{
                  "selector": "#image1",
                  "easing": "cubic-bezier(0,0,.21,1)",
                  "keyframes":"example"
               }]
            }
         </script>
      </amp-animation>
      <button on = "tap:anim1.start">Start</button>
      <button on = "tap:anim1.pause">Pause</button>
      <button on = "tap:anim1.resume">Resume</button>
      <button on = "tap:anim1.reverse">Reverse</button>
      <button on = "tap:anim1.cancel">cancel</button>
      <button on = "tap:anim1.finish">finish</button>
      <button on = "tap:anim1.togglePause">togglePause</button>
      <button on = "tap:anim1.seekTo(percent = 1.00)">seekTo(100%)</button>
      <br/>
      <br/>
      <br/>
      <br/>
      <div id="image1"></div>
   </body>
</html>

เอาต์พุต