เพิ่มประสิทธิภาพรูปภาพเว็บไซต์ปี 2026: คู่มือ AVIF, WebP, fetchpriority และ Responsive Images

คู่มือเพิ่มประสิทธิภาพรูปภาพเว็บไซต์ปี 2026 ครอบคลุม AVIF, WebP, fetchpriority, preload, Lazy Loading และ Responsive Images พร้อมตัวอย่างโค้ดจริงเพื่อปรับปรุง LCP และ Core Web Vitals

ทำไมการเพิ่มประสิทธิภาพรูปภาพถึงสำคัญที่สุดในปี 2026

รูปภาพคิดเป็นกว่า 51% ของขนาดหน้าเว็บเฉลี่ยทั่วโลก ซึ่งทำให้มันกลายเป็นปัจจัยอันดับหนึ่งที่ส่งผลต่อความเร็วในการโหลดเว็บไซต์ แล้วในปี 2026 ที่ Google ให้น้ำหนัก Core Web Vitals มากขึ้นกว่าเดิมในการจัดอันดับ — โดยเฉพาะ Largest Contentful Paint (LCP) ที่วัดเวลาการโหลดเนื้อหาหลักของหน้า — การเพิ่มประสิทธิภาพรูปภาพจึงไม่ใช่แค่ "ทำก็ดี" อีกต่อไป แต่เป็นสิ่งที่ ต้องทำ จริง ๆ

ข้อมูลจาก HTTP Archive ชี้ว่าเว็บไซต์ที่มี LCP ต่ำกว่า 2.5 วินาทีมี อัตราการตีกลับต่ำกว่า 24% เมื่อเทียบกับเว็บไซต์ที่ช้า แล้วการลดเวลาโหลดเพียงแค่ 1 วินาทีสามารถเพิ่ม Conversion ได้ถึง 20% เลย ตัวเลขพวกนี้บอกชัดเจนว่า: รูปภาพที่เร็วขึ้น = รายได้ที่มากขึ้น

เอาล่ะ มาเริ่มกันเลย — บทความนี้จะพาไปดูทุกเทคนิคที่จำเป็นสำหรับการเพิ่มประสิทธิภาพรูปภาพในปี 2026 ตั้งแต่การเลือกฟอร์แมตที่ถูกต้อง ไปจนถึง fetchpriority, preload, Responsive Images และอื่น ๆ พร้อมตัวอย่างโค้ดที่ใช้งานได้จริงทุกตัว

AVIF vs WebP vs JPEG: เลือกฟอร์แมตไหนดีในปี 2026

WebP — ตัวเลือกที่ปลอดภัยและครอบคลุม

WebP พัฒนาโดย Google รองรับทั้งการบีบอัดแบบ Lossy และ Lossless พร้อมรองรับ Transparency (Alpha Channel) และ Animation ได้ในฟอร์แมตเดียว จุดเด่นหลัก ๆ ก็คือ:

  • ไฟล์เล็กกว่า JPEG 25–35% ที่คุณภาพเทียบเท่า
  • รองรับเบราว์เซอร์สมัยใหม่ ทุกตัว ในปี 2026 แล้ว
  • ความเร็ว Encode/Decode สูงกว่า AVIF อย่างเห็นได้ชัด
  • เหมาะสำหรับเว็บไซต์ที่ต้องการความเข้ากันได้สูงสุด

AVIF — แชมป์การบีบอัดแห่งปี 2026

AVIF พัฒนามาจาก AV1 Video Codec และพูดตรง ๆ ว่ามันให้การบีบอัดดีที่สุดเท่าที่เราจะหาได้ในตอนนี้:

  • ไฟล์เล็กกว่า JPEG ถึง 50% และเล็กกว่า WebP อีก ~20%
  • รองรับ HDR, Wide Color Gamut และ Bit Depth สูง (10/12 บิต)
  • รองรับ Chrome, Edge, Firefox, Safari (iOS 16+) ครอบคลุมผู้ใช้กว่า 93%
  • ข้อด้อย: ใช้เวลา Encode นานกว่า WebP พอสมควร (ตรงนี้ต้องยอมรับ)

JPEG — ยังไม่ตาย แต่ควรเป็น Fallback

JPEG ยังคงจำเป็นอยู่ในฐานะ Fallback สำหรับเบราว์เซอร์เก่าที่ไม่รองรับ WebP หรือ AVIF แต่ไม่ควรเป็นฟอร์แมตหลักอีกต่อไปแล้ว เพราะประสิทธิภาพการบีบอัดมันด้อยกว่ามากจริง ๆ

ตารางเปรียบเทียบ

คุณสมบัติJPEGWebPAVIF
การบีบอัดเทียบกับ JPEGดีกว่า 25–35%ดีกว่า 50%
รองรับ Transparencyไม่รองรับรองรับรองรับ
รองรับ HDRไม่รองรับไม่รองรับรองรับ
ความเร็ว Decodeเร็วเร็วช้ากว่า
Browser Support (2026)ทั้งหมดทั้งหมด93%+

กลยุทธ์ที่แนะนำ: AVIF First, WebP Fallback

ใช้ <picture> element เพื่อ Serve AVIF ก่อน ตามด้วย WebP และ JPEG เป็น Fallback สุดท้าย — วิธีนี้เป็น Best Practice ที่ได้ผลดีจริง ๆ:

<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="คำอธิบายภาพ" width="1200" height="630">
</picture>

เบราว์เซอร์จะเลือกฟอร์แมตที่ดีที่สุดที่ตัวเองรองรับได้โดยอัตโนมัติ ผู้ใช้ Chrome จะได้ AVIF ที่เล็กที่สุด ส่วนเบราว์เซอร์เก่าก็ Fallback ไปที่ JPEG แบบไม่มีปัญหา

การบีบอัดรูปภาพ: คุณภาพ vs ขนาดไฟล์

หลักการสำคัญที่ต้องจำไว้: ตาของมนุษย์แทบไม่สามารถแยกความแตกต่างระหว่าง Lossy Compression ที่คุณภาพ 80–85% ดังนั้นไม่จำเป็นต้องใช้คุณภาพ 100% ซึ่งจะทำให้ไฟล์ใหญ่โดยไม่ได้ประโยชน์อะไรเลย

แนวทางการตั้งค่าคุณภาพที่ลองแล้วได้ผล:

  • AVIF: คุณภาพ 60–70% (ให้ผลลัพธ์ดีเยี่ยมเลย เพราะ Codec มีประสิทธิภาพสูงมาก)
  • WebP: คุณภาพ 75–85%
  • JPEG: คุณภาพ 80–85%

เป้าหมายสำหรับ Hero Image: ขนาดไฟล์ ไม่เกิน 200 KB สำหรับรูปเต็มหน้าจอ ถ้าทำได้ต่ำกว่านี้ยิ่งดี

fetchpriority: อาวุธลับสำหรับปรับปรุง LCP

ปัญหา: เบราว์เซอร์ไม่รู้ว่ารูปไหนสำคัญ

ตามค่าเริ่มต้น เบราว์เซอร์จะโหลดรูปภาพด้วย Priority ต่ำ เพราะมันสันนิษฐานว่ารูปส่วนใหญ่อยู่นอก Viewport แต่ Hero Image หรือรูปภาพหลักที่เป็น LCP Element ของหน้าควรได้รับ Priority สูง นี่แหละคือจุดที่ fetchpriority เข้ามาช่วย

วิธีใช้ fetchpriority

ง่ายมาก แค่เพิ่ม Attribute fetchpriority="high" ลงใน <img> tag ของ LCP Image:

<img src="hero.webp"
     alt="Hero Image"
     width="1200"
     height="630"
     fetchpriority="high">

ผลลัพธ์จริงในการใช้งาน

ตัวอย่างที่น่าสนใจ (และน่าประทับใจ):

  • Google Flights: LCP ดีขึ้นจาก 2.6 วินาทีเหลือ 1.9 วินาที — ลดลง 700 มิลลิวินาที จากการเปลี่ยนแค่ Attribute เดียว
  • Etsy: LCP ดีขึ้น 4% จากการใช้ fetchpriority
  • หลายเว็บไซต์รายงานว่า LCP ดีขึ้น 20–30% ในการทดสอบ

พูดตรง ๆ ว่า ROI ของการเพิ่ม Attribute ตัวเดียวนี้ดีมาก ๆ ไม่ค่อยเจอการปรับแต่งไหนที่ใช้แรงน้อยแต่ได้ผลมากขนาดนี้

ใช้กับ picture element

เมื่อใช้ร่วมกับ <picture> ให้เพิ่ม fetchpriority ที่ <img> ข้างใน ไม่ใช่ที่ <picture> หรือ <source> นะ — จุดนี้คนผิดกันเยอะ:

<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg"
       alt="Hero Image"
       width="1200"
       height="630"
       fetchpriority="high">
</picture>

ข้อควรระวัง: อย่าใช้ fetchpriority="high" มากเกินไป

ถ้าทุกรูปเป็น High Priority ก็เท่ากับไม่มีรูปไหนเป็น High Priority จริง ๆ ใช่ไหม? ให้ใช้เฉพาะกับ LCP Image เท่านั้น และใช้ fetchpriority="low" กับรูปที่อยู่นอก Viewport เพื่อลดการแย่ง Bandwidth:

<!-- รูป Hero — High Priority -->
<img src="hero.webp" fetchpriority="high" alt="Hero">

<!-- รูปที่ไม่สำคัญ — Low Priority -->
<img src="thumbnail.webp" fetchpriority="low" loading="lazy" alt="Thumbnail">

Preload: บอกเบราว์เซอร์ล่วงหน้าว่ารูปไหนสำคัญ

ทำไมต้อง Preload

preload ช่วยให้เบราว์เซอร์ ค้นพบ (Discover) รูปภาพเร็วขึ้น ก่อนที่จะต้องรอ Parse HTML หรือ CSS เสร็จ นี่สำคัญมากสำหรับกรณีเหล่านี้:

  • รูปภาพที่โหลดผ่าน CSS background-image (เบราว์เซอร์มองไม่เห็นจนกว่าจะ Parse CSS เสร็จ)
  • รูปภาพที่โหลดผ่าน JavaScript
  • รูปภาพที่อยู่ลึกใน DOM จนไม่ถูก Preload Scanner ค้นพบเร็วพอ

Preload + fetchpriority: คู่หูสุดทรงพลัง

ตรงนี้สำคัญมาก: preload คือ Mandatory Fetch (สั่งให้โหลด) ส่วน fetchpriority คือ Hint (บอก Priority) — ทั้งสองทำงานคนละหน้าที่และ ควรใช้ร่วมกัน เพื่อผลลัพธ์ที่ดีที่สุด:

<head>
  <!-- Preload เพื่อให้ค้นพบเร็ว + fetchpriority เพื่อให้ Priority สูง -->
  <link rel="preload"
        as="image"
        href="/img/hero.webp"
        fetchpriority="high">
</head>

Preload สำหรับ CSS Background Images

รูปภาพที่โหลดผ่าน CSS background-image เป็น "มองไม่เห็น" สำหรับ Preload Scanner ของเบราว์เซอร์ เลยต้อง Preload ระบุเอาเองอย่างชัดเจน:

<!-- CSS -->
<style>
  .hero { background-image: url('/img/hero-bg.webp'); }
</style>

<!-- Preload ใน head -->
<link rel="preload"
      as="image"
      href="/img/hero-bg.webp"
      fetchpriority="high">

Lazy Loading: โหลดเฉพาะสิ่งที่จำเป็น

หลักการ

Lazy Loading คือการเลื่อนการโหลดรูปภาพที่อยู่นอก Viewport ออกไปจนกว่าผู้ใช้จะ Scroll เข้าใกล้ ช่วยประหยัด Bandwidth และลดเวลาโหลดเริ่มต้นได้เยอะมาก

วิธีที่ง่ายที่สุดคือ Native Lazy Loading ด้วย Attribute loading="lazy":

<img src="product.webp"
     alt="สินค้า"
     width="400"
     height="300"
     loading="lazy">

กฎเหล็ก: ห้าม Lazy Load รูป LCP เด็ดขาด

นี่คือ ข้อผิดพลาดที่พบบ่อยที่สุด ในการเพิ่มประสิทธิภาพรูปภาพเลย และเจอเว็บที่ทำผิดตรงนี้บ่อยมาก — การใส่ loading="lazy" ให้ Hero Image หรือรูปภาพ Above-the-fold

ข้อมูลจาก Chrome UX Report พบว่าเว็บไซต์ที่ Lazy Load รูป LCP มี LCP ช้ากว่าถึง 35% แล้วทีมพัฒนา WordPress Core เองก็พบว่าการ Lazy Load รูปแรกในหน้าทำให้ LCP แย่ลง 7% อีกด้วย

กฎง่าย ๆ ที่ต้องจำ:

  • รูป Above-the-fold (ภายใน Viewport แรก): ใช้ loading="eager" หรือไม่ต้องใส่เลย (ค่าเริ่มต้นคือ eager อยู่แล้ว)
  • รูป Below-the-fold (ต้อง Scroll ถึง): ใช้ loading="lazy"

Lazy Loading ขั้นสูงด้วย Intersection Observer

สำหรับกรณีที่ต้องการควบคุมมากขึ้น เช่น โหลดรูปก่อนที่จะ Scroll ถึงจริง ๆ สักหน่อย ให้ใช้ Intersection Observer API แบบนี้:

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.removeAttribute('data-src');
      observer.unobserve(img);
    }
  });
}, {
  rootMargin: '200px 0px' // โหลดล่วงหน้า 200px ก่อน Scroll ถึง
});

document.querySelectorAll('img[data-src]').forEach(img => {
  observer.observe(img);
});

Responsive Images: ส่งรูปที่ใช่ให้อุปกรณ์ที่ถูกต้อง

ทำไม Responsive Images ถึงสำคัญ

ลองคิดดู — การส่งรูปขนาด 2560px ให้โทรศัพท์มือถือที่แสดงผลแค่ 375px กว้าง มันคือการ สิ้นเปลือง Bandwidth ไปเปล่า ๆ ล้วน ๆ Responsive Images ช่วยให้เบราว์เซอร์เลือกโหลดรูปขนาดที่เหมาะสมกับอุปกรณ์ได้เอง

srcset กับ sizes: Resolution Switching

srcset บอกเบราว์เซอร์ว่ามีรูปขนาดไหนบ้างให้เลือก ส่วน sizes บอกว่ารูปจะแสดงผลกว้างเท่าไหร่ที่แต่ละ Breakpoint:

<img srcset="hero-640.webp 640w,
             hero-1024.webp 1024w,
             hero-1920.webp 1920w,
             hero-2560.webp 2560w"
     sizes="(max-width: 640px) 100vw,
            (max-width: 1024px) 100vw,
            1920px"
     src="hero-1920.webp"
     alt="Hero Image"
     width="1920"
     height="1080"
     fetchpriority="high">

ขนาดรูปที่แนะนำให้เตรียมไว้ (ครอบคลุมอุปกรณ์ส่วนใหญ่):

  • มือถือ: 640px – 768px
  • แท็บเล็ต: 1024px – 1280px
  • เดสก์ท็อป: 1920px – 2560px (สูงสุด ไม่จำเป็นต้องมากกว่านี้)

picture element: Art Direction

ใช้ <picture> เมื่อต้องการ Serve รูปที่แตกต่างกันจริง ๆ ตาม Breakpoint เช่น รูป Landscape สำหรับ Desktop และ Portrait สำหรับมือถือ:

<picture>
  <!-- มือถือ: รูป Portrait ที่ Crop แน่นขึ้น -->
  <source media="(max-width: 768px)"
          srcset="hero-mobile.avif"
          type="image/avif">
  <source media="(max-width: 768px)"
          srcset="hero-mobile.webp"
          type="image/webp">

  <!-- เดสก์ท็อป: รูป Landscape แบบเต็ม -->
  <source srcset="hero-desktop.avif"
          type="image/avif">
  <source srcset="hero-desktop.webp"
          type="image/webp">

  <img src="hero-desktop.jpg"
       alt="Hero Image"
       width="1920"
       height="1080"
       fetchpriority="high">
</picture>

Preload Responsive Images

เมื่อต้องการ Preload รูปที่เป็น Responsive ให้ใช้ imagesrcset และ imagesizes บน <link> tag:

<link rel="preload"
      as="image"
      imagesrcset="hero-640.webp 640w,
                   hero-1024.webp 1024w,
                   hero-1920.webp 1920w"
      imagesizes="(max-width: 640px) 100vw,
                  (max-width: 1024px) 100vw,
                  1920px"
      fetchpriority="high">

อย่าลืม: ใส่ fetchpriority="high" ด้วยนะ เพราะ Preload สำหรับรูปภาพจะได้ Priority ต่ำตามค่าเริ่มต้น ตรงนี้หลายคนมักพลาดไป

ป้องกัน Layout Shift: กำหนด width และ height เสมอ

การไม่กำหนด width และ height ให้รูปภาพทำให้เบราว์เซอร์ไม่สามารถจอง Space ล่วงหน้าได้ พอรูปโหลดเสร็จก็เกิดการ "กระโดด" ของเนื้อหา ส่งผลให้คะแนน Cumulative Layout Shift (CLS) แย่ลง ซึ่งผู้ใช้เกลียดมาก

แนวทางป้องกัน:

<!-- ดี: กำหนด width/height ให้เบราว์เซอร์คำนวณ aspect ratio -->
<img src="photo.webp"
     width="800"
     height="600"
     alt="รูปภาพ"
     loading="lazy">

<!-- ดีกว่า: ใช้ CSS aspect-ratio ร่วมด้วย -->
<style>
  .responsive-img {
    width: 100%;
    height: auto;
    aspect-ratio: 4 / 3;
  }
</style>
<img src="photo.webp"
     class="responsive-img"
     alt="รูปภาพ"
     loading="lazy">

Image CDN: ระบบอัตโนมัติสำหรับเว็บไซต์ขนาดใหญ่

สำหรับเว็บไซต์ที่มีรูปภาพจำนวนมาก (เช่น E-commerce ที่มีสินค้าเป็นพัน ๆ รายการ) การแปลงฟอร์แมตและ Resize ด้วยมือแทบเป็นไปไม่ได้ นี่คือจุดที่ Image CDN อย่าง Cloudinary, imgix, Cloudflare Images หรือ Bunny CDN เข้ามาช่วยได้:

  • แปลงฟอร์แมตอัตโนมัติ: ตรวจสอบ Accept Header แล้ว Serve AVIF หรือ WebP ตามที่เบราว์เซอร์รองรับ
  • Resize ตาม URL Parameter: เปลี่ยนขนาดรูปผ่าน Query String เช่น ?w=640&q=80
  • Cache ที่ Edge: ลด Latency โดย Serve รูปจากเซิร์ฟเวอร์ที่ใกล้ผู้ใช้ที่สุด
  • บีบอัดอัตโนมัติ: ปรับคุณภาพให้เหมาะสมโดยไม่สูญเสียคุณภาพที่มองเห็นได้
<!-- ตัวอย่าง: ใช้ Image CDN เพื่อ Serve รูปที่เพิ่มประสิทธิภาพแล้ว -->
<img srcset="https://cdn.example.com/hero.jpg?w=640&f=auto 640w,
             https://cdn.example.com/hero.jpg?w=1024&f=auto 1024w,
             https://cdn.example.com/hero.jpg?w=1920&f=auto 1920w"
     sizes="(max-width: 640px) 100vw, (max-width: 1024px) 100vw, 1920px"
     src="https://cdn.example.com/hero.jpg?w=1920&f=auto"
     alt="สินค้า"
     fetchpriority="high">

พารามิเตอร์ f=auto บอกให้ CDN เลือกฟอร์แมตที่ดีที่สุดตาม Accept Header ของเบราว์เซอร์โดยอัตโนมัติ สะดวกมากเพราะไม่ต้องจัดการ <picture> element เอง

Checklist รวม: เพิ่มประสิทธิภาพรูปภาพเว็บไซต์ปี 2026

เทคนิคสิ่งที่ต้องทำผลกระทบ
ฟอร์แมตServe AVIF > WebP > JPEG ด้วย picture elementสูงมาก
การบีบอัดLossy คุณภาพ 80–85% (AVIF: 60–70%)สูง
fetchpriorityใส่ fetchpriority="high" ที่ LCP Image เท่านั้นสูง
PreloadPreload LCP Image ใน head พร้อม fetchpriorityสูง
Lazy Loadingใส่ loading="lazy" เฉพาะรูป Below-the-foldสูง
Responsive Imagesใช้ srcset/sizes หรือ picture สำหรับทุก Breakpointสูง
width/heightกำหนดขนาดทุกรูปเพื่อป้องกัน CLSปานกลาง
Image CDNใช้ CDN แปลงฟอร์แมตและ Resize อัตโนมัติสูง

คำถามที่พบบ่อย (FAQ)

AVIF กับ WebP ต่างกันอย่างไร ควรเลือกใช้อันไหน?

AVIF ให้การบีบอัดที่ดีกว่า WebP ประมาณ 20% และรองรับ HDR กับ Wide Color Gamut ด้วย แต่ข้อเสียคือใช้เวลา Encode นานกว่า ในปี 2026 ทั้งสองฟอร์แมตรองรับเบราว์เซอร์สมัยใหม่ทุกตัวแล้ว กลยุทธ์ที่ดีที่สุดคือใช้ <picture> element เพื่อ Serve AVIF ก่อน แล้วให้ WebP เป็น Fallback

fetchpriority="high" ต่างจาก rel="preload" อย่างไร?

preload ทำให้เบราว์เซอร์ ค้นพบ รูปภาพเร็วขึ้น (Mandatory Fetch) แต่ไม่ได้เปลี่ยน Priority ส่วน fetchpriority="high" เป็น Hint ที่บอกเบราว์เซอร์ให้ จัดลำดับความสำคัญ ของรูปภาพสูงขึ้น ทั้งสองทำงานคนละหน้าที่ ใช้ร่วมกันได้ผลดีที่สุด

ทำไมไม่ควร Lazy Load รูป Hero Image?

Hero Image มักเป็น LCP Element ของหน้า การใส่ loading="lazy" จะทำให้เบราว์เซอร์ชะลอการโหลดออกไป ส่งผลให้ LCP ช้าลงถึง 35% ตามข้อมูลจาก Chrome UX Report รูป Above-the-fold ควรใช้ loading="eager" (หรือไม่ต้องใส่เลย) แล้วเสริมด้วย fetchpriority="high"

ควรบีบอัดรูปภาพที่คุณภาพเท่าไหร่?

สำหรับ Lossy Compression ตาของมนุษย์แทบไม่แยกความแตกต่างที่คุณภาพ 80–85% สำหรับ WebP และ JPEG ส่วน AVIF สามารถลงไปถึง 60–70% ได้เลย เพราะ Codec มีประสิทธิภาพสูงกว่ามาก เป้าหมายสำหรับ Hero Image คือขนาดไฟล์ไม่เกิน 200 KB

srcset กับ picture element ใช้ต่างกันอย่างไร?

srcset กับ sizes ใช้สำหรับ Resolution Switching — ให้เบราว์เซอร์เลือกขนาดรูปที่เหมาะสมกับ Viewport และ DPR ส่วน <picture> ใช้สำหรับ Art Direction — เมื่อต้องการ Serve รูปที่แตกต่างกันจริง ๆ ตาม Breakpoint เช่น Landscape บน Desktop และ Portrait บนมือถือ หรือเพื่อ Serve ฟอร์แมตต่าง ๆ พร้อม Fallback

เกี่ยวกับผู้เขียน Editorial Team

Our team of expert writers and editors.