Image Lazyload 圖片懶加載

Introduction

Image Lazyload 圖片懶加載功能整合 lazysizes.js 可以顯著提升電商網站的性能和用戶體驗,是提升網站整體效果的一個重要手段。開啟該功能後可以期待以下幾個方面的效果和提升:

  1. 加速頁面載入速度:Lazysizes 實現了懶加載功能,這意味著圖片只在即將進入瀏覽器可視區域時才開始載入。這樣可以顯著減少初始頁面載入時間,因為並非所有圖片都需要同時被載入,特別是對於圖片密集型的頁面來說,這一點尤為重要。
  2. 提升用戶體驗:更快的頁面載入意味著用戶能夠更快地瀏覽商品列表,減少了等待時間,提高了互動的流暢性。這對於提高用戶滿意度和降低跳出率有直接幫助。
  3. SEO友善:lazysizes 設計時考慮了SEO因素,確保圖片在適當的時候(如在載入時)能夠被正確索引,有助於維護網站的搜索引擎排名。優化核心網頁效能指標 LCP(最大內容繪製),整體載入速度提升,搜尋引擎更青睞快速網站,有利於搜索排名。
  4. 響應式圖像支援:lazysizes 自動處理響應式圖像的sizes屬性,確保不同設備螢幕下載入最合適的圖片尺寸版本,既優化了載入速度,也提升了圖像質量,適應各種螢幕需求。
  5. 手機端體驗改善:僅載入首屏可見的商品圖,其他圖片延遲載入,節省流量;減少不必要的圖片處理,降低設備耗能,電池壽命延長;

受影響的範圍

建構器元件類型一般店家LE店家
NPB圖片元件直接內建 Lazyload直接內建 Lazyload
NPB商品元件需申請啟用 Lazyload需申請啟用 Lazyload + 修改 liquid 檔案
OPB圖片元件需申請啟用 Lazyload需申請啟用 Lazyload
OPB商品元件需申請啟用 Lazyload需申請啟用 Lazyload + 修改 liquid 檔案

*一般店家,預計在 2024 Aug 後會全數自動啟用 lazyload,此功能暫時未覆蓋到「文字分頁」「部落格頁面」「一頁商店」

Layout Engine 店家啟用

為了支援 SHOPLINE 新開發的功能 "Image Lazyload 圖片懶加載",對於有開啟 Layout Engine 的店家,除了聯繫你的顧問申請啟用功能外,也需調整程式碼檔案。
涉及到的檔案有四個,為了避免 Lazyload img tag 影響 Layout Engine 客製化結果,請自行依照以下說明調整語法。

  • product.liquid
  • quick_cart_product.liquid
  • promotion_product.liquid
  • theme.css.liquid

*新開 LE 店家的 liquid 檔案已是最新版本,無需調整程序碼,只需申請啟用 Lazyload


調整說明

product.liquid 檔案調整

步驟一: 找出要修改的程式碼 1

<div class="Image-boxify-image js-image-boxify-image sl-lazy-image {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %}" style="background-image:url({{ product.image.src | img_url: '800x' }})"></div>

步驟二:將找到的程式碼替換為下面的程式碼 1

<div
    class="Image-boxify-image js-image-boxify-image sl-media {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %}">
    <div class="boxify-image-wrap">
        {{ product.image.src | image_tag: use_lazysizes: true, widths: 'auto', sizes: 'auto', origin:
        product.image.width,
        alt: product.title }}
    </div>
</div>

步驟三: 找出要修改的程式碼 2

{% if product.cover_images.size > 1 %}
<div class="Image-boxify-image js-image-boxify-image sl-lazy-image {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} second-image"
    style="background-image:url({{ product.cover_images[1].src | img_url: '800x' }})"></div>
{% endif %}

步驟四:將找到的程式碼替換為下面的程式碼 2

{% if product.cover_images.size > 1 %}
<div
    class="Image-boxify-image js-image-boxify-image sl-media {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} second-image">
    <div class="boxify-image-wrap">
        {{ product.cover_images[1].src | image_tag: use_lazysizes: true, widths: 'auto', sizes: 'auto', origin:
        product.cover_images[1].width, alt: product.title }}
    </div>
</div>
{% endif %}

步驟五:檢查完成後的樣子是否正確

quick_cart_product.liquid 檔案調整

步驟一: 找出要修改的程式碼 1

<div class="boxify-image js-boxify-image center-contain sl-lazy-image {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %}"
    style="background-image:url({{ product.image.src | img_url: '750x' }})">
    {% unless is_quick_cart == false or product.available_time_type or product.sold_out and shop.sold_out_enabled %}
    <div class="btn-add-to-cart js-btn-add-to-cart hidden-xs hidden-sm" {% if expend_variation_key %}
        data-variant-id="{{ expend_variation_key }}" {% endif %}>
        {{'shopline_translations.product.quick_cart.add_to_cart' | translate}}
    </div>
    {% endunless %}
</div>

步驟二:將找到的程式碼替換為下面的程式碼 1

<div
    class="boxify-image js-boxify-image center-contain sl-media {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %}">
    <div class="boxify-image-wrap">
        {{ product.image.src | image_tag: use_lazysizes: true, widths: 'auto', sizes: 'auto', origin:
        product.image.width, alt: product.title }}
    </div>

    {% unless is_quick_cart == false or product.available_time_type or product.sold_out and shop.sold_out_enabled %}
    <div class="btn-add-to-cart js-btn-add-to-cart hidden-xs hidden-sm" {% if expend_variation_key %}
        data-variant-id="{{ expend_variation_key }}" {% endif %}>
        {{'shopline_translations.product.quick_cart.add_to_cart' | translate}}
    </div>
    {% endunless %}
</div>

步驟三: 找出要修改的程式碼 2

{% if product.cover_images.size > 1 %}
<div class="boxify-image js-boxify-image center-contain sl-lazy-image {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} second-image"
    style="background-image:url({{ product.cover_images[1].src | img_url: '750x' }})">
    {% unless is_quick_cart == false or product.available_time_type or product.sold_out and shop.sold_out_enabled %}
    <div class="btn-add-to-cart js-btn-add-to-cart hidden-xs hidden-sm">
        {{'shopline_translations.product.quick_cart.add_to_cart' | translate}}</div>
    {% endunless %}
</div>
{% endif %}

步驟四:將找到的程式碼替換為下面的程式碼 2

{% if product.cover_images.size > 1 %}
<div
    class="boxify-image js-boxify-image center-contain sl-media {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} second-image">
    <div class="boxify-image-wrap">
        {{ product.cover_images[1].src | image_tag: use_lazysizes: true, widths: 'auto', sizes: 'auto', origin:
        product.cover_images[1].width, alt: product.title }}
    </div>

    {% unless is_quick_cart == false or product.available_time_type or product.sold_out and shop.sold_out_enabled %}
    <div class="btn-add-to-cart js-btn-add-to-cart hidden-xs hidden-sm">
        {{'shopline_translations.product.quick_cart.add_to_cart' | translate}}</div>
    {% endunless %}
</div>
{% endif %}

步驟五:檢查完成後的樣子是否正確

promotion_product.liquid 檔案調整

步驟一: 找出要修改的程式碼

<div class="boxify-image center-contain sl-lazy-image {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} {% if product.available_time_type %}not-in-available-time{% endif %}" style="background-image:url({{ product.image.src | img_url: '750x' }})" ></div>

步驟二:將找到的程式碼替換為下面的程式碼

<div
    class="boxify-image center-contain sl-media {% if product.sold_out and shop.sold_out_enabled %}out-of-stock{% endif %} {% if product.available_time_type %}not-in-available-time{% endif %}">
    <div class="boxify-image-wrap">
        {{ product.image.src | image_tag:
        use_lazysizes: true,
        widths: 'auto',
        sizes: 'auto',
        origin: product.image.width,
        mobile_size: 180,
        desktop_size: 480,
        alt: product.title
        }}
    </div>
</div>

步驟三:檢查完成後的樣子是否正確

theme.css.liquid 檔案調整

步驟一:搜尋 theme.css.liquid,並在最底下加入以下程式碼

.sl-media {
    display: block;
    position: relative;
    overflow: hidden;
}
.sl-media > *:not(.btn-add-to-cart) {
    display: block;
    max-width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
}
.sl-media > img,
.sl-media > .boxify-image-wrap img {
    display: block;
    -o-object-fit: contain;
    object-fit: contain;
    -o-object-position: center center;
    object-position: center center;
}
.sl-media > .boxify-image-wrap img {
    width: 100%;
    height: 100%;
    max-width: 100%;
}
.Grid-row .Grid-item .sl-media img {
    height: 100%;
    -o-object-position: center;
    object-position: center;
}
.sl-lazy,
.sl-lazyloading {
    opacity: 0.01;
}
.sl-lazyloaded {
    opacity: 1;
    transition: opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

步驟二:搜尋 theme.css.liquid 中以下程式碼並移除,此调整大幅改善使用 Layout engine - Ultra Chic 店家網站的白屏行為

body.home.index .CustomPage {
    visibility: hidden;
}

步驟三:點擊保存以檢查格式是否正確