)]}'
{"id": 5200068565139456, "name": "Lazy loading for video and audio elements", "summary": "Adds the loading attribute to <video> and <audio> elements, allowing developers to defer media resource loading until the element is near the viewport using loading=\"lazy\". This matches the existing lazy loading behavior for <img> and <iframe>\n elements, improving page load performance and reducing data usage.\n\n\nCL: https://chromium-review.googlesource.com/c/chromium/src/+/7511253\n\n\n", "markdown_fields": [], "blink_components": ["Blink>Media"], "star_count": 85, "search_tags": [], "created": {"by": "hjanuschka@gmail.com", "when": "2026-01-25 21:40:30.463739"}, "updated": {"by": "hjanuschka@gmail.com", "when": "2026-04-01 15:19:21.803646"}, "category": "Multimedia", "category_int": 4, "feature_notes": "", "web_feature": "loading-lazy-media", "is_official_web_feature": true, "webdx_usecounter_enum": null, "enterprise_feature_categories": [], "enterprise_product_category": 0, "is_releasenotes_content_reviewed": false, "is_releasenotes_publish_ready": false, "stages": [{"id": 5191722248306688, "created": "2026-01-25 21:40:30.960459", "feature_id": 5200068565139456, "stage_type": 110, "display_name": null, "intent_stage": 7, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 4849402684506112, "created": "2026-01-25 21:40:31.030510", "feature_id": 5200068565139456, "stage_type": 120, "display_name": null, "intent_stage": 1, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAFmjHKSFVWGyOWV%2BKymVmsaro9YbXoN5YYGbnNpnLo1KLe4dCQ%40mail.gmail.com", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5093434807418880, "created": "2026-01-25 21:40:31.154855", "feature_id": 5200068565139456, "stage_type": 130, "display_name": null, "intent_stage": 2, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": 147, "android_first": 147, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 6317443779788800, "created": "2026-01-25 21:40:31.225324", "feature_id": 5200068565139456, "stage_type": 140, "display_name": null, "intent_stage": 4, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5158346191667200, "created": "2026-01-25 21:40:31.267326", "feature_id": 5200068565139456, "stage_type": 150, "display_name": null, "intent_stage": 3, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5187269038309376, "created": "2026-01-25 21:40:31.469126", "feature_id": 5200068565139456, "stage_type": 160, "display_name": null, "intent_stage": 5, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAFmjHKSvRRYgqOhJmPfKMoRsE6dx6d2oALfhzAg_2Zk7EO6yug%40mail.gmail.com", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": 148, "android_first": 148, "ios_first": 148, "webview_first": 148, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}], "accurate_as_of": "2026-03-13 20:47:19.707288", "creator_email": "hjanuschka@gmail.com", "updater_email": "hjanuschka@gmail.com", "owner_emails": ["hjanuschka@gmail.com"], "editor_emails": ["barrypollard@google.com"], "cc_emails": [], "spec_mentor_emails": [], "unlisted": false, "deleted": false, "editors": ["barrypollard@google.com"], "cc_recipients": [], "spec_mentors": [], "creator": "hjanuschka@gmail.com", "feature_type": "New or changed feature", "feature_type_int": 0, "intent_stage": "None", "intent_stage_int": 0, "active_stage_id": 5187269038309376, "bug_url": "https://issues.chromium.org/issues/469111735", "launch_bug_url": null, "new_crbug_url": "https://bugs.chromium.org/p/chromium/issues/entry?components=Blink>Media&blocking=469111735&cc=hjanuschka@gmail.com", "screenshot_links": [], "first_enterprise_notification_milestone": null, "enterprise_impact": 1, "breaking_change": false, "confidential": false, "shipping_year": 2026, "flag_name": null, "finch_name": "LazyLoadVideoAndAudio", "non_finch_justification": null, "ongoing_constraints": null, "rollout_plan": 0, "rollout_plan_displayname": "Will ship enabled for all users", "motivation": "Web developers frequently need to defer loading of video and audio resources to improve page load performance and reduce data usage, especially on pages with multiple media elements below the fold. Without native support, developers must implement custom JavaScript solutions using Intersection Observer to detect when media elements enter the viewport and then dynamically set the src attribute. This approach is error-prone, adds complexity, and cannot integrate with the browser's preload scanner.\n\nThe loading attribute already exists for <img> and <iframe> elements, and developers expect the same declarative API for media elements. Native lazy loading allows the browser to optimize resource loading with network-aware thresholds, properly handle the interaction with autoplay and preload attributes, and avoid blocking window.onload for offscreen media.\n", "devtrial_instructions": null, "activation_risks": "None. This feature has minimal activation risk due to its simplicity and familiarity.\n\nEase of adoption:\n   - Developers simply add loading=\"lazy\" to <video> or <audio> elements\u2014no JavaScript required.\n   - The pattern is already well-known from <img> and <iframe> lazy loading, which has been supported since 2019.\n   - Works as progressive enhancement; browsers without support simply ignore the attribute and load eagerly.", "measurement": "UseCounters added in https://chromium-review.git.corp.google.com/c/chromium/src/+/7665925", "availability_expectation": "Feature is available on Web Platform Baseline within 12 months of launch in Chrome.\n\nOther implementations are already under way (see above).", "adoption_expectation": "Feature is considered a best practice for some use case within 12 months of reaching Web Platform baseline.", "adoption_plan": "MDN updates are in progress.\nChrome DevRel engaged to update their own guidance.", "initial_public_proposal_url": "https://github.com/whatwg/html/pull/11980", "explainer_links": ["https://scottjehl.com/posts/lazy-media"], "requires_embedder_support": false, "spec_link": "https://github.com/whatwg/html/pull/11980", "api_spec": true, "automation_spec": true, "interop_compat_risks": "Low risk. This is a new opt-in feature that follows an established pattern, the loading attribute already exists for <img> and <iframe> elements and is interoperable across browsers.\n\nCompatibility: Since this is an additive, opt-in feature, there is no risk to existing content. Pages that do not use loading=\"lazy\" on media elements will see no change in behavior. Browsers that do not support the attribute will simply ignore it and load media eagerly (the default behavior), providing graceful degradation.\n", "all_platforms": true, "all_platforms_descr": null, "non_oss_deps": "None", "anticipated_spec_changes": "None", "security_risks": "None. This feature does not introduce new security considerations.\n\n  - No new permissions or capabilities: The feature only controls the timing of media resource loading, not what can be loaded.\n  - Same security boundaries: Media loading continues to follow existing CORS and Content Security Policy rules regardless of the loading attribute value.\n  - No new data exposure: The feature does not expose any new information to web pages.", "ergonomics_risks": "None. The feature improves ergonomics by providing a declarative alternative to manual JavaScript-based lazy loading solutions.\n\n   Related APIs:\n   - The loading attribute interacts with the preload attribute; loading=\"lazy\" takes precedence over preload, which is intuitive and matches developer expectations.\n   - The autoplay attribute works correctly with lazy loading; autoplay is queued until the element enters the viewport, then triggered automatically.\n   - The poster attribute on video elements is also deferred when loading=\"lazy\" is set.\n\n   Performance:\n   - The feature is entirely asynchronous and does not block the main thread.\n   - Uses the existing Intersection Observer infrastructure internally, which is already well-optimized.\n   - Network-aware viewport margins automatically adjust for connection speed, improving perceived performance on slow networks.\n   - Lazy media explicitly does not block window.onload, ensuring page load metrics are not negatively impacted.", "wpt": true, "wpt_descr": "New Web Platform Tests are added with this implementation. Since the spec is not yet merged, tests are marked as tentative.\n\nVideo element tests:\n  - html/semantics/embedded-content/the-video-element/video-loading-attr-reflect.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-lazy-in-viewport.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-lazy-window-onload.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-lazy-poster-preload.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-lazy-to-eager.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-lazy-load-when-visible.tentative.html\n  - html/semantics/embedded-content/the-video-element/video-loading-eager.tentative.html\n\nAudio element tests:\n  - html/semantics/embedded-content/the-audio-element/audio-loading-attr-reflect.tentative.html\n  - html/semantics/embedded-content/the-audio-element/audio-loading-lazy-in-viewport.tentative.html\n  - html/semantics/embedded-content/the-audio-element/audio-loading-lazy-load-when-visible.tentative.html\n  - html/semantics/embedded-content/the-audio-element/audio-loading-lazy-to-eager.tentative.html", "webview_risks": "None", "devrel_emails": ["barrypollard@google.com", "devrel-chromestatus-all@google.com"], "debuggability": "Supported with existing DevTools features; no special tooling required.", "doc_links": [], "sample_links": ["https://scottjehl.com/posts/lazy-media"], "prefixed": null, "tags": [], "tag_review": "This is extending an existing attribution that was already reviewed by TAG (https://github.com/w3ctag/design-reviews/issues/361) so we have not requested a further review.", "tag_review_status": "Not applicable", "tag_review_status_int": 4, "security_review_status": "Pending", "security_review_status_int": 1, "privacy_review_status": "Pending", "privacy_review_status_int": 1, "security_continuity_id": null, "security_launch_issue_id": null, "updated_display": null, "resources": {"samples": ["https://scottjehl.com/posts/lazy-media"], "docs": []}, "comments": "", "ff_views": 3, "safari_views": 3, "web_dev_views": 2, "browsers": {"chrome": {"bug": "https://issues.chromium.org/issues/469111735", "blink_components": ["Blink>Media"], "devrel": ["barrypollard@google.com", "devrel-chromestatus-all@google.com"], "owners": ["hjanuschka@gmail.com"], "origintrial": false, "prefixed": null, "flag": false, "status": {"text": "Proposed", "val": 2, "milestone_str": "Proposed"}, "announced": true, "desktop": 148, "android": 148, "webview": 148, "ios": 148}, "ff": {"view": {"url": "https://github.com/mozilla/standards-positions/issues/1325", "notes": "Implementation under way: https://phabricator.services.mozilla.com/D278547", "text": "Positive", "val": 3}}, "safari": {"view": {"url": "https://github.com/WebKit/standards-positions/issues/586", "notes": "Implementation under way:\nhttps://github.com/WebKit/WebKit/pull/58220", "text": "Support", "val": 3}}, "webdev": {"view": {"text": "Positive", "val": 2, "url": "https://github.com/web-platform-dx/developer-signals/issues/534", "notes": null}}, "other": {"view": {"text": null, "val": null, "url": null, "notes": null}}}, "standards": {"spec": "https://github.com/whatwg/html/pull/11980", "maturity": {"text": "Specification currently under development in a Working Group", "short_text": "Working draft", "val": 4}}, "is_released": false, "is_enterprise_feature": false, "experiment_timeline": null, "ai_test_eval_report": null, "ai_test_eval_run_status": null, "ai_test_eval_status_timestamp": null}