LogoLogo
Navigation
Advanced Javascript
Advanced Javascript
  • 😆Attribute Starts With Selector [name^="value"] (ok)
  • 🥹 Tìm hiểu về Map và Set trong javascript (ok)
  • 🫢 The Array.from() method returns an array from any iterable object. (ok)
  • 😍localeCompare() method compares two strings return sort order -1, 1,0 (for before, after, or equal)
  • 😍JavaScript Array some() method returns true (and stops) if the function returns true() (ok)
  • Add key value pair to all objects in array (ok)
  • 🥸Làm một sider tuyệt đẹp "Timed-Cards-Opening"
  • 🥸Scroll animations! How to add a flowing path like the Lusion site with SVG and Javascript (ok)
  • Chia sẽ code plugin tạo thời gian chờ tải cho nút download
  • 😛jQuery 1.9 .live,.delegate,.on is not a function (ok)
  • 😁Importing CSS Breakpoints Into JavaScript (ok)
  • The matchMedia() method returns a MediaQueryList with the results from the query. (ok)
  • Collect nhiều sách pdf (ok)
  • 😁Check device Agent chrome, firefox ... (ok)
  • === START Three.js and TypeScript ===
  • Setup Development Environment (ok)
  • === END Three.js and TypeScript ===
  • === START THREE.JS ===
  • 🥳Fundamentals - three.js manual
    • Light trong Three.js
  • == Start Nguyên tắc cơ bản ===
  • Nguyên tắc cơ bản
  • Thiết kế đáp ứng
  • nguyên thủy
  • 😅Điều chỉnh camera (ok)
  • 😅Điều chỉnh scale
  • 🥲Xử lý màn hình HD-DPI
  • 😃So sánh Mesh với Object3D
  • 😅Trục AxesHelper
  • 😅Tạo GridHelper
  • 😆MeshBasic, MeshLambert, MeshPhong, MeshToon, MeshStandard, MeshPhysical, Shader, RawShader
  • == End Nguyên tắc cơ bản ===
  • 🥰Bài viết mẫu thự hành tọa độ, quay (ok)
  • Giới thiệu HTML5 Canvas
  • Bài 1: Làm quen với môi trường 3D của ThreeJS
  • Bài 2: Dịch chuyển đối tượng 3D - Controls
  • Bài 3: makeup
  • Bài 4: Models loader
  • 😁Những trang học three.js
  • Source Code Example
  • === END THREE.JS ===
  • === START WebGL ===
  • 😇Trang học WebGL && Shador
  • 😅Tìm hiểu về OpenGL ES 2.0
  • Tìm hiểu về WebGL phần 1: thư viện đồ họa web.
  • Tìm hiểu WebGL Phần 2: Đi sâu vào cách code WebGL appication
  • Tìm hiểu WebGL Phần 3: Đi sau vào cách code WebGL appication - các ví dụ
  • Tìm hiểu WebGL Phần 4: Các ví dụ.
  • === END WebGL ===
  • 😃Getting started with systemjs full (ok)
  • Đọc thêm bài này Mô-đun ECMAScript và khả năng tương thích trình duyệt (ok)
  • 😖Thư viện chặn truy cập vào Devtool (ok)
  • === START JAVASCRIPT Vanila ===
  • 😄Làm cách nào để ngăn sự kiện onclick của cha mẹ kích hoạt khi nhấp vào con parent, child ? (ok)
  • 😁Bootstrap 5 - multi item carousel (ok)
  • Three dots ( … ) in JavaScript
  • "... Three Dots" đã thay đổi javascript như thếnào ?
  • Array-like objects, Chuyển đối tượng arguments thành array (ok)
  • 😇Making a short alias for document.querySelectorAll (ok)
  • JavasScript Siblings (ok)
  • JavaScript Modules Full (ok)
  • JavaScript select Element (ok)
  • === END JAVASCRIPT Vanila ===
  • Sử dụng async, await, bất đồng bộ lấy dữ liệu Pagination, sử dụng Deferred 👌 phần 2 (ok)
  • how to use multiple ternary operator in javascript, ?:, ?? (ok)
  • 😅[DATETIMEPICKER] jQuery Plugin Date and Time Picke Full (ok)
  • === START tutorial HYPERAPP ==
  • [HYPERAPP] Hyperapp - JavaScript micro-framework chỉ 1kB (ok)
  • [HYPERAPP] hyperapp-tutorial-step-1 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-2 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-3 (ok)
  • [HYPERAPP] hyperapp-tutorial-step-4 (ok)
  • === END tutorial HYPERAPP ==
  • Free and Open Source Web Builder Framework
  • 😁How to recursively fetch data from paginated API then combine into one array (ok)
  • 😆Create a form with dom with nested tags, Wrapping a set of DOM elements using JavaScript (ok)
  • 😇Array find, Tìm phần tử đầu tiên thỏa mãn điều kiện (ok)
  • 😁Array find, Tìm phần tử cuối cùng thỏa mãn điều kiện (ok)
  • Cách tích hợp bộ lọc select chọn nhanh Tỉnh, Thành & Quận, Huyện, districts, provinces (ok)
  • object with methods, you can simply call a method from the object returned. (ok)
  • Portfolio, Filter, Gallery, Tabmenu (ok)
  • JavaScript chạy bất đồng bộ như thế nào?, Microtask ,Macrotask, queueMicrotask bài viết hay (ok)
  • 😋Learn prototypejs 😒😒😒
  • === START JavaScript chuyên sâu ===
  • [JavaScript chuyên sâu] Higher order function trong JavaScript - phần 1 (ok)
  • [JavaScript chuyên sâu] - Higher order function - phần 2: closure, currying, callback
  • [JavaScript chuyên sâu] - So sánh Constructor Function và Factory Function
  • [JavaScript chuyên sâu] - 5 vai trò của Function: function, object, property, callback, constructor
  • [JavaScript chuyên sâu] : Đồng bộ và bất đồng bộ của JavaScript - phần 1: Callback
  • [JavaScript chuyên sâu]: Từ hàm IIFE tới Module Pattern
    • 😍IIFE=>Immediately Invoked Function Expression=>khởi tạo function & chạy ngay, import, export như nào
  • Tìm hiểu về Higher-Order Functions trong JavaScript
  • === END JavaScript chuyên sâu ===
  • QR-Card (ok)
  • === START DATATABLE ===
  • [DATATABLE] bộ lọc sử dụng các thẻ bên trong td matter.vn (ok)
  • 😁[DATATABLE] JQuery Datatables Editor - Alternative to the official one (ok)
  • Example: Datatables Add Edit Delete with Ajax, PHP & MySQL (ok)
  • [DATATABLE] fixedColumns, DataTable, Left and right fixed columns (ok)
  • [DATATABLE] Sử dụng thư viện dataTables.bootstrap.min.js && dataTables.bootstrap.min.js (ok)
  • [DATATABLE] DataTables.net with DataTableQueryBuilder sample input filter (ok)
  • [DATATABLE] How to use Tabledit plugin with jQuery Datatable in PHP Ajax (ok)
  • [DATATABLE] DataTables Custom Filter Demo (ok)
  • [DATATABLE] Datatable multiple checkbox demo (ok)
  • [DATATABLE] HTML5 export buttons (ok)
  • [DATATABLE] CodePen Home DataTable 2 Card view (ok)
  • [DATATABLE] DataTables - Column Search (ok)
  • [DATATABLE] CodePen Home dataTables conditional row and cell styling (ok)
  • [DATATABLE] DataTables example of styling Excel export(ok)
  • === END DATATABLE ===
  • 😅Bất ngờ về sử dụng Window History full 1 (ok)
  • 😁Bất ngờ về sử dụng Window History full 2, window.history.scrollRestoration,history.replaceState(ok)
  • workingHoursBetweenTimes, tính giờ làm việc, giờ làm thêm (ok)
  • 😅addDataToArray, cộng mảng đối tượng với điều kiện key == (ok)
  • You can get the number of days in a specified month (ok)
  • Lấy giá trị khác nhau đầu tiên, cuối trong một mảng Object (ok)
  • swiperjs.com (ok)
    • Swiper Slider (ok)
  • Một số cách viết ngắn gọn code trong JS phần 1 (ok)
  • Một số cách viết ngắn gọn code trong JS phần 2 (ok)
  • literal javascript, php (ok)
  • Bài toán kinh điển sử dụng three dots lấy tất cả các key của object, key same, plus (ok)
  • convert object to array javascript (ok)
  • ==== Start Google Sheet ====
  • Kintone width Appscript (ok)
  • [GOOGLE-SHEETS] Buttons in Google Sheets
  • [GOOGLE-SHEETS] thực hiện chuyển dữ liệu sang bản khác (ok)
  • [GOOGLE-SHEETS] method getRange (ok)
  • [GOOGLE-SHEETS] method getRange (ok)
  • Bài 1: Khai Báo Biến và Đọc Ghi Ô – Dải Ô (Cell / Range)
  • Bài 2: Các Hàm Lấy Giá Trị và Đặt Giá Trị Dải Ô getRange – getValues – setValues
  • Bài 3: Copy và Di Chuyển Dải Ô Sang Sheet khác
  • Bài 4: Vòng Lặp For
  • Bài 5: Di chuyển dòng từ Sheet này sang Sheet khác
  • [Help] – Chuyển Cột Sang Hàng (bỏ ô trống) (ok)
  • Bài 6: Câu lệnh điều kiện IF (ok)
  • Bài 7: Giới thiệu các Trigger App Script – onEdit onOpen
  • [Help] – Form nhập liệu đơn giản
  • Bài 8: Hộp thoại Dialog / Popup
  • Bài 9: Ghi công thức Google Sheet vào ô
  • Bài 10: Đọc Ghi Mảng (Array) App Script
  • Bài 11: Tạo xác thực dữ liệu phụ thuộc
  • Lấy Email người dùng đang hoạt động trên Google Sheet – getActiveUser
  • Bài 12: Liên kết Google Form – Sheet – Apps Script
  • [Series Email] Bài 1: Gửi Email bằng Apps Script cơ bản
  • [Series Email] Bài 2: Gửi Email Đính Kèm File – Hình Ảnh
  • [Series Email] Bài 3: Gửi Email Cho Danh Sách Nhập Vào Từ Google Sheet
  • Addon Email All in One | Email AI1 | RA MẮT BẢN THỬ NGHIỆM
  • [Series Email] Bài 4: Gửi Email Bcc Cho Danh Sách Nhập Vào Từ Google Sheet
  • [Series Email] Bài 5: Tạo Hộp Thoại Xem Email Trước Khi Gửi
  • [Series Email] Bài 6: Gửi Email Theo Template Cho Sẵn
  • [Series Email] Bài 7: Gửi Email Xác Nhận Điền Form (Email Confirmation)
  • [Series Email] Bài 8: Hẹn Giờ Gửi Email
  • SpreadsheetApp
  • Giới hạn các Service trong Apps Script
  • [CF] Lọc dải ô bao gồm dải ô khác
  • Cách lưu trữ trong Google Apps Script – PropertiesService
  • [CF] Custom Function Google Sheets là gì và Cách ‘cài đặt’
  • [CF] Tìm Ô – Có Giá Trị – Cuối Cùng Trong Cột – Google Sheets
  • [CF] Đếm số lần xuất hiện kí tự trong dải ô Google Sheets
  • [CF] Lọc dải ô không bao gồm
  • ==== End Google Sheet ====
  • [REDUCE] JavaScript Array reduce()
  • Merge object and split array by size, Trộn object và tách array theo size (ok)
  • Đặt điều kiện mới load js (ok)
  • Calculate working days between two dates in Javascript excepts holidays (ok)
  • Remove everything after a certain character remove replace (ok)
  • CodePen Home Image zoom on hover - auto run - view full (ok)
  • ======== Start Slider Revolution =======
  • How to start (ok)
  • Revolution Lightbox tham khảo
  • Mẫu và thực viện để thực hành (ok)
  • Tài liệu Slider Revolution Jquery 2.0 (ok)
  • Tài liệu Slider Revolution Jquery 4.1.2 (ok)
  • ======== End Slider Revolution =======
  • jQuery click / toggle between two functions (ok)
  • [TEXT ANIMATION] làm hiệu ứng chữ dòng trên xuất hiện trước rồi mới đến dòng dưới (ok)
  • Phát hiện phần tử xuất hiện ở màn hình, Detect element appearing on screen, view (ok)
  • what does !function in Javascript mean? (ok)
  • [WEBPACK] Một cách phân biệt khi bundle ra es5 hay es6 một ví dụ sử dụng webpack (ok)
  • Javascript Self Invoking Functions (ok)
  • ====== Start Convert ES5 class to ES6 class ====
  • VS Code tips: Convert ES5 class to ES6 class code action (ok)
  • ====== End Convert ES5 class to ES6 class ====
  • Get Substring between two characters using javascript (ok)
  • add Html Table rows data into JSON array Object (ok)
  • lightGallery, lightgalleryjs, Lightbox (ok)
  • same height (ok)
  • Hình ảnh :(
  • ============ Start serialize =============
  • jQuery serialize() Method (ok)
  • serialize width php mysql (ok)
  • serialize, serializeObject, serializeArray (ok)
  • How to access jQuery serialized data? (ok)
  • ============ End serialize =============
  • Sử dụng addQueryVar để thêm vào đường dẫn ajax (ok)
  • Cách tích hợp captcha style2.track360.xyz (ok)
  • Simple JavaScript Captcha Example (Client Side Captcha)
  • 😍Đoạn mã sử dụng translate.google.com (ok)
  • ========== Start [MultiLang] ===========
  • [MultiLang] MultiLang.js (ok)
  • [MultiLang] Localizing JavaScript apps with jQuery.i18n (ok) (full)
  • [MultiLang] jQuery i18n những điều nên biết (ok)
  • [MultiLang] How to Create a Multilingual Application using JavaScript
  • [MultiLang] Build multiple language website using jQuery and JSON based methods (ok)
  • [MultiLang] Switch Different Languages On The Webpage - jQuery multilang (ok)
  • [MultiLang] jquery-multilang (ok)
  • ========== End [MultiLang] ===========
  • [MINICOLORS] jquery.minicolors (ok)
  • jQuery - addClass ACTIVE--> set timeout --> cycle (ok)(online.vinmec.com)
  • WP Mapbox GL JS Settings key (ok)
  • Xử lý ảnh thiếu thuộc tính title, alt trên style2.track360.xyz (ok)
  • Register your schema (ok)
  • ========= Start Learn Graphql Website =======
  • 1. Query and Mutation types
  • ========= End Learn Graphql Website =======
  • [GRAPHQL] Tạo Database với Mysql (ok)
  • KẾT NỐI VỚI MYSQL – NODEJS – 05
  • 😍Quick start graphql (ok)
  • Hướng dẫn bắt đầu GraphQL với Node.js (Phần 1)
  • Hướng dẫn bắt đầu GraphQL với Node.js (Phần 2)
  • Cách bắt đầu với ứng dụng GraphQL, React, Apollo Client và Apollo Server
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 1 (Application Introduction
  • 😍[Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 2 (Backend - Project Setup a
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 3 (Backend - Simple Mutation
  • [Fullstack] Xây dựng forum bằng GraphQL, React, Apollo và Prisma - Part 4 (Backend - Connect to Data
  • 😍Prisma Crud Full
    • 🥰Sử dụng kết hợp prisma.io với wordpress như nào?
    • [ERROR] gặp lỗi TypeError: Do not know how to serialize a BigInt (ok)
    • 😍Migrate MongoDB to MySQL using Prism Key Differences (ok)
  • Setting Up Prisma with MySQL: A Step-by-Step Guid
  • Tìm hiểu GraphQL, Xây dựng 1 GraphQL server với prisma
  • 🥹Đã có bài viết về sqlite, sqlite3 đầy đủ (ok)
  • 😍Querying Sequelize Full link sequelize.org (ok)
  • 😁Sqlite Sequelize Example (ok)
  • 😍CRUD with React and GraphQL Mysql (ok)
  • 😍A GraphQL Sqlite, sequelize Full (ok)
  • GraphQL in practice - Part 1: Xây dựng GraphQL server với Apollo Server, ExpressJS và MongoDB
  • GraphQL in practice - Part 2: Tạo ứng dụng GraphQL với Apollo Client và React
  • GraphQL in practice - Part 2: Tạo ứng dụng GraphQL với Apollo Client và React
  • TÌm hiểu về GraphQL
  • Cùng tìm hiểu về GraphQL
  • Simple Guidance For You In GraphQL
  • [GRAPHQL] Get started with Apollo Server (ok)
  • [GRAPHQL] Schema basics (ok)
  • [GRAPHQL] Subscriptions (ok)
  • [GRAPHQL] Unions and interfaces (ok)
  • Tham khảo: https://www.howtographql.com
  • Tìm hiểu GraphQL: Các khái niệm cơ bản (ok)
  • GraphQL Và Ưu Điểm Nổi Bật So Với Rest API?
  • Xây dựng server GraphQL với NodeJS (ok)
  • Tìm hiểu GraphQL
  • Xây dựng GraphQL server với Node.js
  • Ví dụ Tạo Restfull API - CRUD đơn giản với NodeJS, GraphQL (ok)
  • Sequelize with Node, Express & Mysql and it’s setup (ok)
  • Sequelize in Nodejs Part I
  • Sequelize in Nodejs Part II
  • Videos NodeJS + MySQL Database
  • NodeJS – Lưu trữ dữ liệu trên MySQL với Sequelize
  • Exploring The Node.js With MySQL Example Using Sequelize & Express
  • Tạo model, migration, seeds với Sequelize
  • Sử dụng passport với sequelize và MySQL
  • Tạo model, migration, seeds với Sequelize
  • GraphQL là gì? Bắt đầu với GraphQL
  • Xây dựng API sử dụng Laravel và GraphQL
  • How To Connect To MySql Database Using Sequlize In Express (Node) Application
  • Node.js MySQL Tutorial
  • Node.js Rest APIs example with Express, Sequelize & MySQL
  • Getting Started with Node, Express and Mysql Using Sequelize
  • [GRAPHQL] GraphQL – Công nghệ mới cho web developer
  • GraphQL là gì? Tìm hiểu về GraphQL (ok)
  • [GRAPHQL] Cùng tìm hiểu về GraphQL
  • Điều gì ẩn chứa bên trong $.event???
  • ===== Start Put JavaScript Design Patterns Into Practice (Videos) ========
  • 2.1. The Factory Pattern (ok)
  • 3.1. The Publisher-Subscriber Pattern (ok)
  • 3.2. The Strategy Pattern (ok)
  • Rời phần thử khỏi mảng sử dụng filter (ok)
  • 3.3. The Observer Pattern (ok)
  • 3.4. The Chain of Responsibility Pattern (ok)
  • 3.5. The Mediator Pattern (ok)
  • 3.6. The Iterator Pattern (ok)
  • ===== End Put JavaScript Design Patterns Into Practice (Videos) ========
  • ========== Start RequireJS Tutorial =======
    • Sử dụng RequireJS và AMD để module hóa code JavaScript (ok)
  • 😍Trình duyệt không có require, nhưng Node.js thì có. Với Browserify để trình duyệt cũng có (ok)
  • Sử dụng Bower để quản lý các thư viện code trong Laravel (ok)
  • RequireJS - Environment Setup (ok)
  • RequireJS - Configuration (ok)
  • RequireJS - AMD Modules (ok)
  • RequireJS - Defining Function (cách sử dụng require rất lạ) (ok)
  • RequireJS - Optimizer (ok)
  • ========== End RequireJS Tutorial =======
  • ========== Start jQuery Ui ======
  • Jquery Datepicker select multiple date ranges in one calender, button Reset (ok)
  • Tạo chức năng tự động hoàn tất nhập liệu với thư viện jQuery UI Autocomplete (Phần 1) (ok)
  • Draggable Widget, Droppable Widget (ok)
  • jQuery drag and drop (kéo thả bằng jQuery)
  • jQuery drag full (ok)
  • jQuery drop full (ok)
  • jQuery Resizable full (ok)
  • Tablesorter full (ok)
  • Live search through table rows (ok)
  • Loại bỏ một số cột không tìm kiếm trong Tablesorter (ok)
  • jQuery Sortable full, tablesorter (ok)
  • jQuery Selectable full (ok)
  • jQuery UI Sortable Tutorial - Save Positions With Ajax & PHP & MySQL (ok)
  • jQuery Drag and Drop TODO List with PHP MySQL (ok)
  • ========== End jQuery Ui ======
  • [TUTORIAL] TRÍCH XUẤT THÔNG TIN TỪ WEBSITE VỚI HTML AGLITITY PACK
  • ======== Start handlebars js =======
  • Sử dụng handlebars js
  • Handlebars nhỏ nhưng có võ
  • ======== End handlebars js =======
  • ==== Start JavaScript Tutorial ====
  • JavaScript Introduction
  • What is JavaScript
  • JavaScript Essentials
  • JavaScript Variables
  • JavaScript Operators
  • JavaScript Conditionals
  • JavaScript Loops
  • JavaScript Built-in Types
  • JavaScript Objects
  • JS Advanced Objects
  • JavaScript Arrays
  • JavaScript Functions
  • JavaScript Function Objects
  • JavaScript JSON
  • JavaScript Regular Expressions
  • Bôi màu cho một ký tự đặc biệt và chuỗi @EsportsArcadia Regular Expression (ok)
  • JavaScript Reference
  • ==== End JavaScript Tutorial ====
  • 🧐===== Start JavaScript Design Patterns ==
  • JavaScript Design Patterns
  • JavaScript Design Patterns – Explained with Examples
  • Js design pattern doFactory master (ok)
  • Chapter 5: jQuery Patterns
  • JavaScript Design Patterns (ok)
  • Abstract Factory (ok)
  • Builder (ok)
  • Factory Method (ok)
  • Prototype (ok)
  • Singleton (ok)
  • Adapter ( ok)
  • Bridge (ok)
  • Composite (ok)
  • Decorator (ok)
  • Facade (ok)
  • Flyweight (ok)
  • Proxy (ok)
  • Chain of Responsibility (ok)
  • Command (ok)
  • Interpreter (ok)
  • Iterator (ok)
  • Mediator (ok)
  • Memento (ok)
  • Observer (ok)
  • State (ok)
  • Strategy (ok)
  • Template Method (ok)
  • Visitor (ok)
  • ===== End JavaScript Design Patterns ==
  • ======== Start Backbone.js Tutorial Videos ======
  • Backbone.js Tutorial - 1 - Installation.mp4 (ok)
  • Backbone.js Tutorial - 2 - Introduction to Models (ok)
  • Backbone.js Tutorial - 3 - Model Attributes (ok)
  • Backbone.js Tutorial - 4 - Model Change Events ( ok)
  • Backbone.js Tutorial - 6 - Introduction to Views (ok)
  • Backbone.js Tutorial - 7 - (Views) Differerence between el and $el (ok)
  • Backbone.js Tutorial - 8 - (Views) Creating New HTML Elements (ok)
  • Backbone.js Tutorial - 9 - (Views) Using the Render Function (ok)
  • Backbone.js Tutorial - 10 - (Views) Events (ok)
  • Backbone.js Tutorial - 11 - Introduction to Collections (ok)
  • Backbone.js Tutorial - 12 - (Collections) Adding and Removing Elements (ok)
  • Backbone.js Tutorial - 13 - (Collections) Modifying Elements
  • Backbone.js Tutorial - 14 - (Collections) Events (ok)
  • ======== End Backbone.js Tutorial Videos ======
  • ====== Start Learn backbone.js tutorial from scratch for beginners =====
  • Backbone :)
  • 1. Learn backbone.js tutorial from scratch(Part 2) Features and Working Principle of backbone.js
  • 2. Learn backbone.js tutorial from scratch for beginners(Part 4) About el and $el in Backbone.js
  • 3. Learn backbone.js tutorial from scratch for beginners(Part 5) Underscore Templates in Backbone.js
  • 4. Learn backbone.js tutorial from scratch for beginners (Part 7) Delegate Events in backbone.js
  • 5. Learn backbone.js tutorial from scratch for beginners(Part 8) Introduction of models in backbone.
  • 6. Learn backbone.js tutorial from scratch for beginners(Part 9) Pass Model data to backbone.js View
  • 7. Learn backbone.js tutorial from scratch for beginners(Part 10) Model data to underscore.js templ
  • 8. Learn backbone.js tutorial from scratch for beginners(Part 11) Head back to underscore.js symbol
  • 9. Learn backbone.js tutorial from scratch for beginners(Part 12) Model Events in backbone.js
  • 10. Learn backbone.js tutorial from scratch for beginners(Part 13) Model Validation in backbone.js
  • 11. Learn backbone.js tutorial from scratch for beginners(Part 14) Model Change Events in backbone.j
  • 12. Learn backbone.js tutorial from scratch for beginners(Part 15) More Model Events and listenTo ev
  • 13. Learn backbone.js tutorial from scratch for beginners(Part 16) Model Inheritance in backbone.js
  • 14. Learn backbone.js tutorial from scratch for beginners(Part 17) Collection in backbone js
  • 15. Learn backbone.js tutorial from scratch for beginners(Part 18) Collection Events in backbone.js
  • 16. Learn backbone.js tutorial from scratch for beginners(Part 19) Collection to underscore.js templ
  • 17. Learn backbone.js tutorial from scratch for beginners(Part 20) Underscore js Methods in backbone
  • 18. Learn backbone.js tutorial from scratch for beginners(Part 21) Routing in backbone.js
  • 19. Learn backbone.js tutorial from scratch for beginners(Part 22) Parameterized Routing in backbone
  • 20. Learn backbone.js tutorial from scratch for beginners(Part 23) Handlebars templates in backb
  • ====== End Learn backbone.js tutorial from scratch for beginners =====
  • Giới thiệu Backbone.js (ok)
  • Backbone.localStorage thay thế Backbone.sync lưu vào window.localStorage thay vì vào máy chủ (ok)
  • Một ví dụ full LocalStorage với BackBoneJS (ok)
  • ========== Start Backbonejs Php Mysql =============
  • Full code backbonejs php mysql (ok)
  • Giao diện html để thực hành từ đầu (ok)
  • Xây dựng giao diện (ok)
  • Thực hiện chức năng crud add (ok)
  • Phân tích để tạo giao diên http://localhost/gulp/#crud/new 1.0
  • Phân tích để tạo giao diên http://localhost/gulp/#crud/new 1.1
  • Phân tích để tạo giao diên http://localhost/create/#crud/index 2.0
  • Chức năng thêm dữ liệu http://localhost/create/#crud/new (ok)
  • Lấy dữ liệu ra trang http://localhost/create/#crud/index (ok)
  • Chức năng cập nhật dữ liệu http://localhost/create/#crud/1/edit (ok)
  • ========== End Backbonejs Php Mysql =============
  • JQuery-Template (ok)
  • Learning JavaScript Design Patterns P.1 (ok)
  • Learning JavaScript Design Patterns P.2 (ok)
  • Learning JavaScript Design Patterns P.3 (ok)
  • Singleton design pattern PHP (ok)
  • Singleton Pattern javascript (ok)
  • Factory Pattern (ok)
  • Decorator Pattern (ok)
  • Creational Pattern (ok)
  • Constructor Pattern (ok)
  • Singleton Pattern (ok)
  • Module Pattern (ok)
  • Factory pattern (ok)
  • Built-in Object Factory (ok)
  • Iterator (ok)
  • Bridge Pattern (ok)
  • Composite Pattern (ok)
  • Một số Design Patterns có thể sử dụng trong Javascript – Phần 1 (ok)
  • Chém gió về JavaScript Design Pattern - Part 1(ok)
  • Chém Gió Về JavaScript Design Pattern Phần 2
  • Chém gió về JavaScript Design Pattern - Part 3
  • 4 Design Patterns trong Javascript mà bạn nên biết
  • Design Pattern trong JavaScript (ok)
  • Lebab chuyển mã ES5 của bạn thành ES6 / ES7. Nó hoàn toàn ngược lại với những gì Babel làm (ok)
  • Turn your ES5 code into readable ES6 (ok)
  • Thuộc tính :selected quá tuyệt cho sự lựa chọn (ok)
  • jQuery I want to add an active class to the linked ID of an anchor tag style2.track360.xyz (ok)
  • Keep URL unaffected when anchor link is clicked (ok)
  • [UI SLIDER] Ui slider with text box input (ok)
  • [SELECT2] version Select2 3.5.3 nhìn trực quan hơn (ok)
  • [SELECT2] keypress select2, enter key press keycode yp.vn (ok)
  • [SELECT2] Select2 Bootstrap Theme (ok)
  • [SELECT2] tags (ok)
  • [SELECT2] tokenSeparators (ok)
  • [SELECT2] click change value (ok)
  • [SELECT2] jQuery $.ajax options (ok)
  • [SELECT2] Full Options (ok)
  • [SELECT2] value placeholder (ok)
  • [SELECT2] Can thiệp vào templateResult (ok)
  • [SELECT2] làm lá cờ gắn trước text kiểu kool ngầu (ok)
  • [SELECT2] cam thiệp vào templateSelection (ok)
  • [SELECT2] thêm thẻ bọc vào lựa chọn ví dụ thẻ <strong/> (ok)
  • [SELECT2] opening when a result is selected (ok)
  • [SELECT2] Full Adapters hay (ok)
  • [SELECT2] Kiểu dữ liệu trả về cho giao diện dùng html & json (ok)
  • [SELECT2] sử dụng ngôn ngữ, i18n, language (ok)
  • [SELECT2] dropdownParent (ok)
  • [SELECT2] Hiểu submit trong javascript và nâng cấp sử dụng select 2, autocomplate (ok)
  • [SELECT2] Common problems Select2 does not function properly when I use it inside a Bootstrap modal
  • [SELECT2] Full Events (ok)
  • [SELECT2] lấy dữ liệu của wp, wordpress để thực hành (ok)
  • [JSONPLACEHOLDER SELECT2] Full Sử dụng website jsonplaceholder.typicode.com để thực hành (ok)
  • Sử dụng fetch trên console.log để get api test (ok)
  • jQuery.naturalWidth / jQuery.naturalHeight images natural Width Height Native Width (ok)
  • [SUBMIT ] form submit jquery (ok)
  • Tạo file package.json bằng lệnh (ok)
  • [TYPESCRIPT] tạo file tsconfig.json bằng lệnh (ok)
  • [TYPESCRIPT] cài đặt package chạy trực tiếp ts, tsx, ts-node (ok)
  • Object for Three Dots, Array for Three Dots (ok)
  • Cách giải thích Private Constructors & Singletons quá tuyệt (ok)
  • [TYPESCRIPT] Một số scripts hay được sử dụng trong typescripts (ok)
  • [TYPESCRIPT] A practical guide to TypeScript decorators exmaple (ok)
  • Object.getOwnPropertyDescriptor() (ok)
  • JavaScript — Property Descriptor && PropertyDescriptor (ok)
  • [TYPESCRIPT] Employing “Namespaces” in TypeScript to encapsulate your data
  • 😅[TYPESCRIPT] Một ví dụ sử dụng TypeScript Namespaces, xuất file use on browser (ok)
  • [NODEJS] object hóa một file trong javascript Nodejs - require, exports and module.exports
  • [TYPECRIPT] Omit type when extending an interface Cách loại trừ các thuộc tính khỏi giao diện (ok)
  • How TO - List Grid View (ok)
  • Javascript module, import, export, dễ ẹc, nhưng có thể bạn vẫn chưa biết
  • [BABEL] Giải thích gói babel (ok)
  • Cấu hình Webpack và Babel 7 cho React (ok)
  • ----------------- Start Kế thừa Prototype ngang và dọc -------------------
  • Kế thừa Prototype ngang và dọc
  • class, super, constructor (ok)
  • Kế thừa ngang giữa function (ok)
  • Ví dụ về kế thừa prototype ngang theo function constructor. Liên quan đến hàm call(), sẽ có bài chi
  • Kế thừa ngang giữa 2 object
  • Muốn tạo một class, object có tên k hác khi console.log?? (ok)
  • Ví dụ về Function constructor và object instance (ok)
  • Tất cả đều từ Function
  • ----------------- End Kế thừa Prototype ngang và dọc -----------
  • Easy Responsive Tabs to Accordion (ok)Demos
  • [ERROR] unable to read package/javascript (ok)
  • ------------Start Json-----------------
  • Cách để truyền dữ liệu dạng boolean trong Postman (ok)
  • ------------ End Json-----------------
  • ---------- start JSONP ---------------------
  • Cross-Domain Ajax Requests
  • 1. JSONP (JSON with padding)
  • 2. CORSCross-origin resource sharing (CORS) là một cơ chế đặc biệt cho phép resource đặt tại một do
  • 3. Proxy
  • JSONP là gì và tại sao nó được tạo ra? (ok)
  • 4. Javascript – Tạo script động và kĩ thuật JSONP (ok)
  • ----------- End JSONP --------------
  • Destructuring Assignment in ES6
  • Cơ chế bất đồng bộ trong javascript (ok)
  • jQuery.inArray()
  • website check call stack (ok)
  • Bài 6: Template Literals trong ES6 (ok)
  • ES6 Arrow Functions (ok)
  • Lập trình TypeScript (ok)
  • Uncaught ReferenceError: exports is not defined in filed generated by Typescript (ok)
  • Cách hoạt động của các module loader? (ok) một ví dụ kinh điển :)
  • RequireJS Cho Người Mới Bắt Đầu (ok) quá tuyệt
  • Tiny loaders tương tự REQUIREJS (Ok)
  • Javascript Module Loader – From the basic (ok)
  • ES6 Modules and CommonJS (Oke) Một ví dụ quý hơn vàng :(((
  • CommonJS là một module pattern hỗ trợ cho tất cả các phiên bản Node.js. Với CommonJS, JavaScript obj
  • ------------------------Start webpack ----------------------
  • [WEBPACK] Làm một ví dụ compile scss, sass bằng WEBPACK full (ok)
  • Webpack từ A đến Á: Webpack watch mode (ok)
  • Webpack từ A đến Á: Webpack dev server (ok)
  • Webpack từ A đến Á: Webpack output hash digest (ok)
  • Webpack từ A đến Á: Webpack multiple entry points (ok)
  • Webpack từ A đến Á: Webpack multiple file types per entry (ok)
  • Webpack từ A đến Á: Webpack import export module (ok)
  • Webpack từ A đến Á: Webpack source map (ok)
  • Webpack từ A đến Á: Webpack import jQuery (ok)
  • Webpack từ A đến Á: Webpack import jQuery - Bootstrap (ok)
  • Webpack từ A đến Á: Webpack import jQuery - Materialize
  • Webpack từ A đến Á: Code Splitting (ok)
  • Webpack từ A đến Á: Code Splitting (ok)
  • Webpack từ A đến Á: Webpack resolve alias - extensions
  • Config alias chuẩn trong webpack (ok)
  • Webpack từ A đến Á: Webpack Babel Loader (ok)
  • Webpack từ A đến Á: Webpack Eslint Loader (ok)
  • Webpack từ A đến Á: Webpack Url Loader (ok)
  • Webpack từ A đến Á: Webpack File Loader (ok)
  • Webpack từ A đến Á: Webpack Style Loader (ok)
  • Webpack từ A đến Á: Webpack Sass Loader (ok)
  • Webpack từ A đến Á: Html Webpack Plugin (ok)
  • Option chunks Html Webpack Plugin (ok)
  • Webpack từ A đến Á: Clean Webpack Plugin (ok)
  • What is the difference between @babel/core and babel-core? (ok)
  • [WEBPACK] 2. Webpack : Khởi Tạo Project (nghiepuit)
  • [WEBPACK] 3. Webpack : Apply Babel Cho Project (nghiepuit)
  • [WEBPACK] 4. Webpack : CSS Loader (nghiepuit)
  • plugin @babel/plugin-proposal-class-properties
  • [WEBPACK] 5. Webpack : Tạo Project ReactJS (
  • [WEBPACK] 7. Webpack : File Loader - Tích Hợp Bootstrap
  • [WEBPACK] 8. Webpack : Tích Hợp Jquery, React, Redux Devtools (nghiepuit)
  • [WEBPACK] 9. Webpack : Vendor Caching
  • [WEBPACK] 10. Webpack : CommonsChunkPlugin
  • [WEBPACK] 10. Webpack : CommonsChunkPlugin (ok)
  • [WEBPACK] Webpack series (ep3) - code splitting - chia code trong webpack (ok)
  • Compile SASS with Webpack into a CSS file (ok)
  • [WEBPACK] 11. Webpack : Optimize Khi Bundle template (ok)
  • [WEBPACK] 12. Webpack : Clean Project (ok)
  • [WEBPACK] 12+. Webpack : webpack-dev-server
  • [WEBPACK] Plugin HtmlWebpackPlugin (ok)
  • HashRouter vs BrowserRouter
  • [WEBPACK] Webpack giúp kết nối các module lại với nhau ( (ok)
  • [WEBPACK] Chú ý: @babel/preset-env dùng cho những gói cũ thay vì khai báo mới babel-preset-env (ok)
  • [WEBPACK]
  • [WEBPACK] webpack-dev-server (ok)
  • [WEBPACK] liên kết với trang Webpack (ok)
  • [WEBPACK] Webpack output hash digest (ok)
  • [WEBPACK] Webpack multiple file types per entry
  • [WEBPACK] Webpack import export module (ok)
  • [WEBPACK] Webpack source map (ok)
  • Simple use jQuery with TypeScript (ok)
  • [WEBPACK] Webpack import jQuery (ok)
  • [WEBPACK] Webpack import jQuery - Bootstrap (ok)
  • [WEBPACK] Webpack import jQuery - Materialize
  • [WEBPACK] Webpack từ A đến Á: Code Splitting
  • [WEBPACK] Webpack từ A đến Á: Webpack resolve alias - extensions
  • [WEBPACK] Config alias chuẩn trong webpack
  • [WEBPACK] Webpack từ A đến Á: Webpack Babel Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Eslint Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Url Loader (ok)
  • [WEBPACK] Webpack từ A đến Á: Webpack File Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Style Loader (ok)
  • [WEBPACK] Webpack từ A đến Á: Webpack Css Loader
  • [WEBPACK] Webpack từ A đến Á: Webpack Sass Loader
  • [WEBPACK] [SPITEST] Teach you how to use webpack to generate css sprites
  • Page learn webpack good
  • Remove unused CSS styles from Bootstrap using PurgeCSS (ok)
  • [WEBPACK] Webpack cho người mới bắt đầu (ok)
  • [WEBPACK] cấu hình output (ok)
  • [WEBPACK] Dùng webpack để sử dụng từ khóa import, export (ok)
  • [WEBPACK] Từ cơ bản đến nâng cao
  • [WEBPACK] Tăng Tốc Độ và Tối Ưu Hoá Website Bằng CSS Sprites (ok)
  • ------------------------ End webpack ----------------------
  • How to convert unordered list into nicely styled <select> dropdown using jquery? (ok)
  • 😆Lazy loading images using event handlers 1
  • 😄Layload ajax && background 2
  • jQuery Lazy 3
  • jQuery lazyload 4
  • Config lazySizesConfig lazysizes.min.js lazysizes(ok)
  • Lazy loading images using event handlers (ok)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 1)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 2)
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 3)
  • Native lazy-loading for the web (ok)
  • Tầm quan trọng của thuộc tính sizes, srcset trong thẻ img (ok)
  • Thực hành lazysizes.min.js
  • Check image img exits vieclam123.vn (ok)
  • Nestable - Drag & drop hierarchical list with mouse and touch compatibility (ok)
  • Cấu hình tawk chat web500.vn ( ok)
  • Cùng tìm hiểu plugin Jquery Validation
  • Tìm hiểu về Jquery Validation (Phần 1) (ok)
  • Tìm hiểu về Jquery Validation (Phần 2) (ok)
  • Tìm hiểu về hộp thoại Sweet alert 2
  • Multi-table,Multi table (ok)
  • SweetAlert2 getHtmlContainer (ok)
  • AJAX request preConfirm (ok)
  • sử dụng php kết hợp Sweetalert2 (ok)
  • Một ví dụ tuyệt vời Ajax SweetAlert for Live Data Deleting Rows in with PHP~MySQL~Ajax (ok)
  • SweetAlert makes popup messages easy and pretty (page learn) (kiể cũ)
  • sweetalert bản chuẩn (ok)
  • AJAX requests (ok)
  • sweetalert2 bản chuẩn (ok) cái này dùng hay hơn sweetalert (ok)
  • Toast (ok)
  • Email (ok)
  • jQuery trigger() Method
  • jQuery one() Method (ok)
Powered by GitBook

Navigation

  • Lionel

@Copyright 2023

On this page
  • GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 1)
  • Cách làm
  • Hỗ trợ ảnh đáp ứng (picture và/hoặc srcset)
  • Tại sao lazysizes được đánh giá rất cao
  • Tìm hiểu thêm về API
  • Các mẫu mã đánh dấu được khuyến khích hoặc có thể thực hiện

GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 1)

https://kiencang.net/lazysizes-js-lazy-load-anh-p1/

PreviousLazy loading images using event handlers (ok)NextGIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 2)

Last updated 4 years ago

GIỚI THIỆU THƯ VIỆN LAZYSIZES.JS ĐỂ LAZY LOAD ẢNH (PHẦN 1)

được viết bởi 1 April, 2020

Vài lời của người dịch: Nhờ bài viết về (có nội dung rất căn bản) tôi biết đến công cụ lazysizes.js (của tác giả có nickname aFarkas), nó được khen ngợi nhiều (rất hay được nhắc tên trong ), do đó tôi quyết định đầu tư thời gian tìm hiểu. Vì bài khá dài nên được chia làm ba phần. Một lần nữa thì bài viết dạng này chỉ dành cho những ai muốn đào sâu về lazy load và có ý muốn triển khai trên các ứng dụng mà bạn sẽ viết sau này. Nếu đơn thuần chỉ bạn cứ cho nhẹ đầu. Ngoài phần dịch nội dung chính, tôi có đưa thêm các ví dụ vào cho dễ hiểu. OK, giờ chúng ta bắt đầu nhé.

—

Công cụ dùng để lazy load ảnh (gồm cả ảnh đáp ứng và thông thường), iframe (cho video) có hiệu suất cao, . Nó xác định bất kỳ thay đổi nào trong khung nhìn trình duyệt (viewport) mà được kích hoạt bởi tương tác của người dùng (user interaction), CSS hoặc JavaScript mà không cần bạn phải can thiệp cấu hình (configuration).

Link chính thức của thư viện nằm ở đây:

Lazysizes là thư viện có tốc độ cao, tối ưu SEO và tự khởi tạo (self-initializing) cho mục đích lazy load ảnh (bao gồm cả ảnh đáp ứng picture / srcset), iframe, script/widget và nhiều thành phần khác nữa. Nó cũng ưu tiên các tài nguyên dựa trên sự khác biệt về tầm mức quan trọng, trong đó lazysizes ưu tiên các phần tử nằm trong khung nhìn và gần khung nhìn trình duyệt (near view elements) để tối ưu tốc độ tải nhận thức (perceived performance) nhanh hơn.

Thư viện này cũng có thể là công cụ hàng đầu để bạn tích hợp ảnh đáp ứng (ảnh có khả năng co giãn theo kích cỡ mãn hình / responsive images). Nó có thể tính toán tự động thuộc tính sizes cho ảnh đáp ứng của bạn, lazysizes cũng cho phép bạn chia sẻ các truy vấn media cho thuộc tính media của bạn bằng CSS, giúp tách biệt CSS (layout) khỏi nội dung/cấu trúc (HTML) và nó thực hiện tích hợp các ảnh đáp ứng vào trong bất cứ môi trường nào theo cách thực sự đơn giản. Lazysizes cũng bao gồm một tập hợp các plugin tùy chọn để mở rộng hơn nữa chức năng của nó.

Mục lục []

Cách làm

Đoạn mã để đưa vào trang như sau (thường bạn đưa nó vào trong phần <head>, nằm bên dưới CSS và JS khác):

<script src="lazysizes.min.js" async=""></script>

Ngoài việc tải về và tự host, bạn có thể sử dụng CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.0/lazysizes.min.js"></script>

Hoặc:

import 'lazysizes';
// import a plugin
import 'lazysizes/plugins/parent-fit/ls.parent-fit';

// Note: Never import/require the *.min.js files from the npm package.
<!-- không phải ảnh đáp ứng: -->
<img data-src="image.jpg" class="lazyload" />

Để kiểm tra hiệu ứng tải lười, trên trình duyệt Chrome (desktop) bạn làm như sau:

  • Nhấn tổ hợp phím Ctrl + Shift + I

  • Ở ngay bên dưới chọn tab Img để chỉ quan sát hành vi tải ảnh về

Từ trên xuống dưới nó sẽ cho tốc độ kết nối, hiển thị lazy load từ nhanh đến chậm (không tính Offline). Nếu trên đường truyền tốc độ cao, phần cứng tốt lazy load sẽ diễn ra rất êm và mượt, bạn thậm chí không nhìn thấy ảnh tải (điều này tốt hơn cho trải nghiệm người dùng). Nhưng trên đường truyền chậm hoặc/và phần cứng yếu ảnh sẽ tải chậm hơn và bạn sẽ nhận ra. Để dễ dàng quan sát, bạn có thể chọn Mid-tier mobile (ý chỉ dòng điện thoại cấp trung). Trong đoạn mã nhúng vừa rồi tôi cho thêm vài bức ảnh có dung lượng lớn (500 KB – 1 MB) ở cuối để ngay cả khi bạn chọn Online (có tốc độ cao nhất) bạn sẽ vẫn nhận ra hiện tượng lazy load.

Tiếp theo chúng ta sẽ làm quen với mã sử dụng ảnh đáp ứng với việc tính toán kích cỡ tự động:

<!-- ảnh đáp ứng với việc tính toán kích cỡ tự động: -->
<img
    data-sizes="auto"
    data-src="image2.jpg"
    data-srcset="image1.jpg 300w,
    image2.jpg 600w,
    image3.jpg 900w" class="lazyload" />

Tiếp theo là đoạn mã lazy load cho video:

<!-- ví dụ về iframe -->
<iframe frameborder="0"
    class="lazyload"
    allowfullscreen=""
    data-src="//www.youtube.com/embed/ZfV-aYdU4uE">
</iframe>

Hỗ trợ ảnh đáp ứng (picture và/hoặc srcset)

Tại sao lazysizes được đánh giá rất cao

lazysizes khác biệt so với các công cụ tải lười ảnh khác:

  1. Hướng đến tương lai (future-proof / không lỗi thời): lazysizes trực tiếp hỗ trợ các tiêu chuẩn về ảnh đáp ứng (picture và srcset)

  2. Chia tách các mối quan tâm: Để hỗ trợ ảnh đáp ứng, nó bổ sung thêm tính toán sizes tự động cũng như alias name cho tính năng truy vấn media. Cũng không cần thực hiện thay đổi JS nếu bạn thêm khối có thể cuộn bằng CSS (overflow: auto) hoặc tạo một mega menu chứa các ảnh.

  3. Hiệu suất: nó dựa trên các mã thực hành tốt nhất, có hiệu suất cao (runtime và network) để hoạt động nhẹ nhàng ở tốc độ 60 fps và có thể sử dụng với hàng trăm ảnh/iframe trên các trang hoặc ứng dụng web nặng JS và CSS.

  4. Khả năng mở rộng: Nó cung cấp các hook JS và CSS để mở rộng lazysizes với bất kỳ kiểu lazy load nào, khởi tạo lazy, trong view callback hoặc hiệu ứng (xem thêm các plugin/mã sẵn có bên dưới)

  5. Nhẹ nhàng, nhưng là giải pháp hoàn chỉnh: lazysizes cân bằng hợp lý giữa độ dài mã và tốc độ cũng như đưa ra giải pháp tin cậy.

  6. Cải thiện SEO: lazysizes không ẩn ảnh/các phần tử khác khỏi tầm mắt của Google. Không thành vấn đề là bạn đang sử dụng mẫu mã đánh dấu nào. Google không thể cuộn chuột/tương tác với trang web của bạn. lazysizes nhận diện tác nhân người dùng (user agent) có khả năng cuộn chuột hay là không, và nếu không, lazysizes sẽ tự động hiển thị tất cả các ảnh chứ không lazy load nó (ý là với user agent là bọ tìm kiếm như của Google, tính năng lazy load sẽ bị loại bỏ để máy tìm kiếm nhìn được ảnh ngay, qua đó không làm ảnh hưởng đến SEO của bạn).

Tìm hiểu thêm về API

lazysizes đi kèm với mã đánh dấu và JS API đơn giản. Thông thường bạn sẽ chỉ cần sử dụng mã đánh dấu API.

Mã đánh dấu API

Thêm class lazyload vào tất cả các phần tử img và iframe, những cái mà bạn muốn lazy load. Thay vì sử dụng thuộc tính src hoặc srcset hãy sử dụng thuộc tính data-src hoặc data-srcset:

<img data-src="image.jpg" class="lazyload" />
<!-- ảnh tối ưu retina: -->
<img data-srcset="responsive-image1.jpg 1x, responsive-image2.jpg 2x" class="lazyload" />

Tự động thiết lập thuộc tính sizes

lazysizes hỗ trợ thiết lập thuộc tính sizes tự động, tương ứng với kích cỡ hiện tại của hình ảnh – bạn chỉ cần thiết lập giá trị data-sizes thành auto.

<img
	data-sizes="auto"
	data-srcset="responsive-image1.jpg 300w,
	responsive-image2.jpg 600w,
	responsive-image3.jpg 900w"
        class="lazyload" />

Quan trọng: Cách tính toán sizes: Việc tính toán tự động kích cỡ (sizes) được sử dụng để hiển thị chiều rộng của ảnh. Điều này có nghĩa là chiều rộng của ảnh được tính toán (ít nhất là xấp xỉ) trước khi bản thân ảnh đó được tải (Điều này có nghĩa là bạn có thể không cần sử dụng width: auto). Thông thường quy tắc CSS chung sau đây có thể hữu ích: img[data-sizes=”auto”] { display: block; width: 100%; } (xem thêm phần chỉ định kích cỡ ảnh/iframe với các khuyến nghị về định nghĩa tỷ lệ khung hình, cũng trong bài viết này). Nếu nó có giá trị dưới 40 (có thể chỉnh giá trị này thông qua tùy chọn minSize), lazysizes đi qua cây DOM cho đến khi nó tìm được phần từ cha mà có giá trị hơn 40 và sử dụng con số này.

Tính năng data-sizes=”auto” chỉ có ý nghĩa nếu bạn sử dụng thuộc tính data-srcset đi kèm với các mô tả về chiều rộng width để hình ảnh phù hợp nhất có thể được chọn (Nó không có ý nghĩa nếu bạn sử dụng mô tả x hoặc chỉ dùng src)

Các mẫu mã đánh dấu được khuyến khích hoặc có thể thực hiện

lazysizes cho phép bạn viết vô số các mẫu mã đánh dấu khác nhau. Bạn có thể tìm mẫu đánh dấu phù hợp nhất cho bản thân hoặc chọn tùy ý một cái bằng các đoạn mã tham khảo dưới đây (Tất cả các mẫu sau cũng có thể sử dụng theo hướng nghệ thuật bằng cách sử dụng phần tử picture.)

Mẫu đơn giản

Thêm class lazyload và đơn giản bỏ qua thuộc tính src hoặc thêm dữ liệu uri như một dự phòng (fallback) cho src.

<!--  ví dụ về ảnh đáp ứng -->

<img
 class="lazyload"
 data-srcset="image.jpg 1x, image2.jpg 2x"
 alt="ảnh của tôi" />
<!--  ví dụ về tối ưu cho retina -->
<img class="lazyload"
 data-srcset="progressive-image.jpg 1x, progressive-image2.jpg 2x"
 alt="ảnh của tôi" />

<!-- hoặc ảnh không đáp ứng: -->
<img
 data-src="image.jpg"
 class="lazyload" />

Lưu ý: trong trường hợp bạn sử dụng cả srcset/data-srcset hoặc picture, chúng tôi khuyên bạn nên mở rộng mẫu này với data-src (xem mẫu kế tiếp: Kết hợp data-srcset với data-src) hoặc với thuộc tính src phù hợp (xem: “mẫu hiện đại” hoặc “LQIP”).

Kết hợp data-srcset với data-src

Trong trường hợp bạn muốn sử dụng ảnh đáp ứng cho các trình duyệt hỗ trợ, nhưng không muốn bao gồm các mã vá víu (polyfill) thêm, bạn chỉ cần đơn giản kết hợp data-srcset với một thuộc tính data-src.

<!-- ví dụ về ảnh đáp ứng: -->
<img
    data-sizes="auto"
    data-src="image3.jpg"
    data-srcset="image3.jpg 600w,
     image1.jpg 220w,
     image2.jpg 300w,
     image3.jpg 600w,
     image4.jpg 900w"
 class="lazyload" />

Lưu ý: Do trong thực tế data-src cũng sẽ được lấy bởi “Read_Later” của các ứng dụng hoặc các công cụ khác (ví dụ Pin trong nút bấm), mẫu này vẫn có ý nghĩa nếu bạn vẫn dùng polyfill. Trong trường hợp bạn không sử dụng polyfill, khuyến cáo là ứng viên hình ảnh đầu tiên cần phải khớp với dự phòng src.

Ảnh giữ chỗ kiểu LQIP/mờ và kỹ thuật ảnh mờ hiện dần thành ảnh rõ (blur up)

<!-- ví dụ về ảnh đáp ứng: -->
<img
    data-sizes="auto"
    src="lqip-src.jpg"
    data-srcset="lqip-src.jpg 220w,
    image2.jpg 300w,
    image3.jpg 600w,
    image4.jpg 900w" class="lazyload" />

<!-- hoặc ảnh không đáp ứng: -->
<img src="lqip-src.jpg" data-src="image.jpg" class="lazyload" />

Kỹ thuật LQIP có thể được tăng cường bằng cách kết hợp nó với CSS transitions/animation cho ảnh.

<style>
	.blur-up {
		-webkit-filter: blur(5px);
		filter: blur(5px);
		transition: filter 400ms, -webkit-filter 400ms;
	}

	.blur-up.lazyloaded {
		-webkit-filter: blur(0);
		filter: blur(0);
	}
</style>

<img src="lqip-src.jpg" data-src="image.jpg" class="lazyload blur-up" />

<!-- ... -->

<style>
	.fade-box .lazyload,
	 .fade-box .lazyloading {
		opacity: 0;
		transition: opacity 400ms;
	}

	.fade-box img.lazyloaded {
		opacity: 1;
	}
</style>

<div class="ratio-box fade-box">
	<img src="lqip-src.jpg" />
	<img data-src="image.jpg" class="lazyload" />
</div>

Để gia tăng chất lượng phần nhìn hơn nữa, thì ảnh chất lượng thấp sẽ được làm mờ ảo bằng CSS thông qua blur, còn để quá trình chuyển ảnh diễn ra nhẹ nhàng, ta cũng áp dụng CSS thông qua thuộc tính transition với khoảng thời gian tùy theo ý bạn, ở trên là 400 ms.

Sử dụng LQIP sẽ làm tăng dung lượng tải về của trang (so với việc không dùng) do trang phải tải cả ảnh chờ chất lượng thấp và ảnh chất lượng cao. Nhưng điều này không thành vấn đề, vì mức độ gia tăng là nhỏ (hoặc rất nhỏ), trong khi nó đem đến khả năng cải thiện trải nghiệm của người dùng lên rất nhiều (và tất nhiên vẫn tăng tốc độ tải trang lúc ban đầu / initial page load time).

Điểm mấu chốt của LQIP là bạn phải làm thế nào để ảnh chất lượng thấp có dung lượng càng nhỏ càng tốt, vì ảnh này chỉ đóng vai trò ảnh đệm, nó chỉ cần có các khối hình mờ mờ là ổn rồi.

Các mẫu srcset transparent hiện đại

Kết hợp thuộc tính src thông thường với ảnh transparent (trong suốt) hoặc ảnh chất lượng thấp bằng giá trị srcset và thuộc tính data-srcset. Với cách này các trình duyệt hiện đại sẽ lazy load mà không tải thuộc tính src và tất cả những thứ khác sẽ chỉ đơn giản là dự phòng cho thuộc tính src ban đầu (không có lazyload). Mẫu đẹp mắt này có nguồn gốc từ tác giả @ivopetkov.

<img
    src="image3.jpg"
    srcset="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="
	data-srcset="image3.jpg 600w,
            image1.jpg 220w,
	    image2.jpg 300w,
	    image4.jpg 900w"
	data-sizes="auto"
	class="lazyload" />

Mẫu mã noscript

Trong trường hợp bạn lo lắng vấn đề JavaScript bị vô hiệu hóa, bạn có thể kết hợp mẫu đơn giản dưới đây với ảnh ở bên trong phần tử noscript.

<style>
	.no-js img.lazyload {
    	display: none;
    }
</style>

<!-- noscript pattern -->
<noscript>
	<img src="image.jpg" />
</noscript>
<img src="transparent.jpg" data-src="image.jpg" class="lazyload" />

Nhưng trước hết ở thẻ <html> bạn cần thêm class no-js:

<html class="no-js" lang="vi-VN"> 

Và thêm đoạn mã sau vào trong <head> để loại bỏ class no-js trong trường hợp JavaScript được kích hoạt:

<script>document.documentElement.classList.remove("no-js");</script>

Để giả lập việc tắt JavaScript trên trình duyệt Chrome bạn làm như sau. Trên thanh địa chỉ bạn copy đoạn này vào rồi nhấn enter:

chrome://settings/content/javascript

Khi vô hiệu hóa JS thì lazysies không thể hoạt động, trong trường hợp đó nếu không có mã dự phòng <noscript> thì ảnh trên trang sẽ bị lỗi.

P/S: Chuyện bị vô hiệu hóa JavaScript rất nghiêm trọng do trên thực tế rất nhiều trang web sử dụng JS như một chức năng thiết yếu. Nói cách khác, việc vô hiệu hóa JS gần như không thể xảy ra, chính xác hơn: rất hiếm người làm như vậy.

Thuộc tính [data-expand]

Thông thường lazysizes sẽ mở rộng khung nhìn trình duyệt để tải lười trước các ảnh/iframe – là những thành phần mà sẽ sớm đi vào khung nhìn trình duyệt. Giá trị này có thể được điều chỉnh bằng cách sử dụng tùy chọn expand (bạn xem phần 2 để biết cách dùng giá trị này).

Ngoài ra tùy chọn chung này có thể được ghi đè với thuộc tính data-expand cho từng phần tử. Điểm khác biệt so với tùy chọn chung expand là thuộc tính data-expand chấp nhận giá trị âm (Tất cả các giá trị, bao gồm cả 0).

Điều này đặc biệt hữu ích trong một số trường hợp:

<style>
.lazyload,
.lazyloading {
	opacity: 0;
}
.lazyloaded {
	opacity: 1;
	transition: opacity 300ms;
}
</style>

<div class="teaser lazyload" data-expand="-20">
    <img data-src="image.jpg" class="lazyload" />
    <h1>Teaser Title</h1>
    <p>...</p>
</div>

Ở phần 2, tôi có nhiều ví dụ về expand, và nó hoạt động rất tốt.

CSS API

lazysizes thêm class có tên lazyloading trong khi ảnh tải về và thêm class lazyloaded sớm nhất có thể sau khi ảnh được tải xong. Điều này có thể được dùng để thêm các hiệu ứng unveil (tạm dịch: vén màn, tiết lộ, ý chỉ việc thể hiện ảnh thực cần lazy load):

/* làm mờ ảnh sau khi tải */
.lazyload,
.lazyloading {
	opacity: 0;
}
.lazyloaded {
	opacity: 1;
	transition: opacity 300ms;
}
/* làm mờ ảnh trong khi tải và hiển thị một spinner đang tải dưới dạng ảnh background (tốt cho các ảnh dạng progressive) */

.lazyload {
	opacity: 0;
}

.lazyloading {
	opacity: 1;
	transition: opacity 300ms;
	background: #f7f7f7 url(loader.gif) no-repeat center;
}

P/S: Hầu hết các ảnh sẽ tải nhanh đến nỗi mà bạn khó nhận ra biểu tượng của loading, chỉ trừ các ảnh nặng, hoặc trên kết nối chậm mới thấy.

Biểu tượng cho ảnh bị hỏng

Trong trường hợp bạn đang sử dụng thuộc tính alt nhưng không khai báo thuộc tính src / srcset hệ quả là bạn sẽ nhận được một biểu tượng là hình ảnh bị hỏng.

Có hai cách đơn giản để xử lý điều đó.

Hoặc bạn xác định src bằng ảnh base64 kiểu như:

src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="

Hoặc bạn thêm đoạn mã CSS sau:

img.lazyload:not([src]) {
	visibility: hidden;
}

1. Tải và đưa nó vào trong trang web của bạn. Hoặc cài đặt nó thông qua npm: npm install lazysizes –save hoặc bower bower install lazysizes –save

2. lazysizes không cần bất cứ cấu hình JS nào: Chỉ cần thêm class “lazyload” vào ảnh hoặc iframe của bạn và kết hợp với thuộc tính data-src và/hoặc data-srcset. Một tùy chọn nữa là bạn cũng có thể thêm một thuộc tính src với (đóng vai trò giữ chỗ cho bức ảnh gốc cần tải lười và chủ yếu để quá trình lazy load diễn ra mượt mà hơn):

Bạn có thể xem ví dụ về tải lười ảnh không đáp ứng tại đường dẫn này:

Chuyển sang tab Network, chọn Disabale cache (vô hiệu hóa để mỗi lần bạn reload, nó sẽ tải lại ảnh thay vì lấy ảnh từ cache, có như vậy mới mô phỏng / giả lập được chính xác hành vi của người dùng lần đầu vào trang của bạn)

Kiểm tra lazy load trên Chrome

Ở bên tay trái bạn chọn thiết bị di động muốn kiểm tra, trong ví dụ này tôi chọn iPhone 6/7/8 plus.

Tiếp theo chọn kích cỡ 100% cho dễ quan sát, nếu màn hình máy tính của bạn to bạn có thể để to hơn (125%, 150%):

Cuối cùng bạn chọn tốc độ kết nối/điều kiện thiết bị:

Sau khi thiết lập xong, bạn tải lại trang, bạn sẽ thấy trang chỉ tải trước 13 bức ảnh (trên tổng số 31 bức):Bạn cũng cũng thấy lượng dữ liệu tải về chỉ khoảng 1 MB.

Tiếp đó bạn cuộn chuột xuống bên dưới trong màn hình giả lập, bạn sẽ thấy trình duyệt tải dần các ảnh còn lại về tương ứng với quá trình cuộn chuột:Trình duyệt tải đủ 31 ảnh về, với hơn 5,8 MB dữ liệu

Để so sánh giữa ảnh theo phương thức tải lười và tải thông thường, tôi có tạo một trang cũng bao gồm các ảnh trên nhưng tải theo cách thông thường, không có lazy load:

Trang mẫu demo đoạn mã trên ở link này:

Còn đây là trang mẫu cho iframe YouTube:

Nếu bạn dùng WordPress, plugin rất tốt để tải lười video là: (cũng là tác giả phát triển – rất nổi tiếng và chất lượng về mảng tối ưu tốc độ)

Lazysizes được xây dựng dựa trên các tiêu chuẩn về ảnh đáp ứng và cho phép bạn mở rộng nó với các chức năng bổ sung. Để có thể có được hỗ trợ ảnh đáp ứng trên tất cả các trình duyệt (full cross browser), bạn phải thực hiện vá víu (polyfill) đầy đủ với các công cụ như hoặc sử dụng tiện ích siêu nhẹ hoặc . Ngoài ra bạn có thể định nghĩa một dự phòng (fallback) theo cách đơn giản cho src thông qua thuộc tính data-src. Nếu bạn muốn tìm hiểu thêm về cú pháp (syntax) của ảnh đáp ứng, hãy thêm khảo bài viết sau đây: ““.

Nhận diện bất cứ thay đổi nào về khả năng hiển thị trong hiện tại và tương lai của các phần tử lazyload trong bất kỳ môi trường web nào theo cách tự động: Đoạn mã hoạt động phổ cập, tự khởi tạo, tự cấu hình, tự hủy các thành phần và nhận diện bất kỳ thay đổi nào về khả năng hiển thị của bất kỳ phần tử ảnh/iframe trong hiện tại và tương lai một cách tự động, không thành vấn đề là liệu nó có được hiển thị thông qua tương tác của người dùng, một hoạt ảnh CSS được kích hoạt thông qua :hover hoặc thông qua bất kỳ kiểu hành vi JS nào (băng chuyền, slider, cuộn chuột vô tận / infinite scroll, masonry, isotope/filtering/sorting, AJAX, SPAs…). Nó cũng làm việc tự động khi kết hợp với bất kỳ thư viện JS-/CSS-/Frontend- nào (ví dụ jQuery mobile, Bootstrap, Backbone, Angular, React, Ember, bạn có thể xem thêm các extension cho ).

Prefetch thông minh/Ưu tiên tài nguyên thông minh: lazysizes prefetch/preload các phần tử ở gần khung nhìn trình duyệt để cải thiện trải nghiệm người dùng, nhưng chỉ khi trình duyệt ở trong thời gian nghỉ (xem thêm các tùy chọn expand, expFactor và loadMode / xem ). Đây là cách giúp lazy load nhanh hơn nhờ việc preload trước các phần tử cần lazy trước khi nó đi vào khung nhìn trình duyệt.

Tính năng tự động tính toán chiều rộng của lazysizes có thể được điều chỉnh bằng cách sử dụng sự kiện lazybeforesizes. Ngoài ra, có thể được dùng để định kích cỡ ảnh cho khớp với khối cha hoặc bao chứa, và là giải pháp duy nhất khi chiều cao của ảnh cũng cần tính đến khi cần đưa ảnh vào khít khớp với phần bao chứa của nó (điều này cũng bao gồm việc sử dụng object-fit).

Nếu bạn sử dụng mã mẫu kiểu LQIP (), bạn chỉ cần thêm ảnh chất lượng thấp đó vào src:

Bạn có thể tham khảo thêm (khuyến khích).

Đây là cách lazy load ảnh mà tôi rất thích, bởi vì nó sẽ làm cho cơ chế tải lười ảnh diễn ra rất mượt mà. Ảnh sẽ hiện ra theo kiểu tương tự (kể cả ảnh PNG). Cơ chế là trình duyệt sẽ tải ảnh chất lượng thấp của bức ảnh gốc trước để giữ chỗ (có dung lượng rất nhỏ, thường chỉ từ 1 đến 10% dung lượng của ảnh gốc hoặc đôi khi hơn tùy vào lựa chọn của bạn), sau đó nếu người dùng cuộn chuột đến, họ sẽ thấy ảnh chất lượng thấp trước, rồi lazysizes sẽ thay thế ảnh chất lượng kém này bằng ảnh thực chất lượng cao. Nhiều trang web lớn như medium.com đang áp dụng kiểu lazy load ảnh này.

Dưới đây là trang mẫu áp dụng LQIP kết hợp CSS (với transition chỉ 200ms – blur up): (đây là mẫu LQIP thông thường, không phải ảnh đáp ứng).

Mẫu tương tự với transition 800ms blur up:

Mẫu tương tự với transition 2000ms = 2s blur up (chỉ để bạn dễ quan sát, không nên làm trong thực tế vì quá trình chuyển tiếp với khoảng thời gian như thế sẽ hơi lâu):

Riêng với cái fade-box, tôi có thử nhưng không thành công (nó tải về cả hai ảnh), hiện không rõ tại sao:

Nếu bạn muốn tự thử, có thể sử dụng công cụ này để tạo ảnh chất lượng thấp cho ảnh chất lượng cao của bạn: Nó có thể tải lên đồng thời 20 bức ảnh. Bạn nhớ chuyển sang chất lượng thấp nhất có thể:

Ngoài ra bạn có thể dùng phần mềm máy bàn có tên Caesium nếu muốn áp dụng lên nhiều ảnh hơn cùng lúc (ngoài ra phần mềm không gặp vấn đề gì khi chuyển đổi ảnh có dung lượng lớn):

Dưới đây là mẫu áp dụng ảnh trong suốt:

Lưu ý: có mẫu noscript khác thay thế, bạn có thể xem thêm tại đây .

Rồi bạn tắt JS như hình dưới đây:

Nếu bạn sử dụng LQIP (), ảnh trên trang chỉ còn hiểu thị ảnh mờ, không còn hiển thị ảnh thật chất lượng cao nữa, kiểu như thế này:

Còn với trang áp dụng lazyload thông thường (), thậm chí còn mất luôn ảnh:

Mẫu trang khắc phục hiện tượng vô hiệu hóa JavaScript:

Hiện tượng lazy load vẫn bị biến mất trên trang vô hiệu hóa JavaScript, noscript chỉ giúp bạn khắc phục hiện tượng ảnh bị mất. Nếu bạn vẫn muốn lazy load ảnh trên trang bị vô hiệu hóa JS, chỉ có cách sử dụng .

Tôi có thử với data-expand, nhưng làm sai gì đó không rõ nên không thấy khác biệt lắm so với không dùng:

Mẫu trang áp dụng cho ví dụ trên:

Mẫu trang áp dụng cho ví dụ trên:

Cái loader.gif là ảnh động GIF để cho biết ảnh đang tải, nó chính là cái này: (chỉ có điều ảnh GIF đang dùng hơi nặng, bạn nên sử dụng cái có dung lượng nhỏ hơn, chẳng hạn như cái này: ).

Kết quả là nếu người dùng đi đến phần ảnh đang tải, nó sẽ trông giống thế này:

Tiện thể tôi làm luôn mẫu dành cho cái small loading (với transition 300 ms): (trông đẹp hơn thật).

Với transition 2000 ms, kết quả trông cũng không khác máy:

mã lazysizes.min.js về
ảnh giữ chỗ chất lượng thấp / low quality image placeholder
https://code.kiencang.net/lazysizes-demo1.html
cache trình duyệt
https://code.kiencang.net/tai-anh-thong-thuong-demo1.html
https://code.kiencang.net/lazysizes-auto-resize-anh.html
https://code.kiencang.net/lazysizes-iframe.html
WP YouTube Lyte
plugin Autoptimize
picturefill
respimg polyfill plugin
responsive image on demand plugin
Mổ sẻ sâu về ảnh đáp ứng
attrchange/re-initialization
phần 2 bài giới thiệu về lazysizes
plugin parent fit
Low Quality Image Placeholder / Ảnh giữ chỗ chất lượng thấp
plugin Blur Up lazysizes
định dạng JPEG Progressive
https://code.kiencang.net/lazysizes-demo-LQIP1.html
https://code.kiencang.net/lazysizes-demo-LQIP-800ms.html
https://code.kiencang.net/lazysizes-demo-LQIP-2000ms.html
https://code.kiencang.net/lazysizes-fade-box.html
https://saerasoft.com/caesium/
https://code.kiencang.net/lazysizes-anh-trong-suot.html
extension noscript
https://code.kiencang.net/lazysizes-noscript.html
lazy load cấp độ trình duyệt (native lazy loading)
https://code.kiencang.net/lazysizes-data-expand.html
https://code.kiencang.net/lazysizes-css-api1.html
https://code.kiencang.net/lazysizes-css-api2.html
loading.gif
small-loading.gif
https://code.kiencang.net/lazysizes-css-api3.html
https://code.kiencang.net/lazysizes-css-api4.html
Duc Anh Nguyen
cách lazy load ảnh và video
các tài liệu hướng dẫn tăng tốc của Google
dùng WordPress
dùng plugin
thân thiện với SEO
https://github.com/aFarkas/lazysizes
ẩn
Cách làm
Hỗ trợ ảnh đáp ứng (picture và/hoặc srcset)
Tại sao lazysizes được đánh giá rất cao
Tìm hiểu thêm về API
Các mẫu mã đánh dấu được khuyến khích hoặc có thể thực hiện
https://imagecompressor.com/
https://code.kiencang.net/lazysizes-demo-LQIP1.html
https://code.kiencang.net/lazysizes-demo1.html
chọn thiết bị muốn kiểm tra
chọn kích cỡ
tốc độ kết nối, điều kiện phần cứng
tải lúc ban đầu chỉ một số bức ảnh
tải ảnh còn lại về
chuyển ảnh chất lượng thấp
tắt JavaScript
lỗi không có javascript
ảnh không hiển thị do bị vô hiệu hóa JavaScript
ảnh đang tải
giới thiệu lazysizes phần 1