Skip to content

Viewport Check

A utility component that monitors whether an element is in the viewport and triggers events accordingly. This component is useful for implementing features like lazy loading, animations that trigger when elements come into view, or tracking when users see specific content.

  • Metro UI Core
  • Metro Utils (for inViewport function)
<div data-role="viewport-check" id="my-element">
Content to monitor
</div>
<div data-role="viewport-check"
data-on-viewport="onViewport"
data-on-viewport-enter="onViewportEnter"
data-on-viewport-leave="onViewportLeave">
Content to monitor
</div>
function onViewport(event, data) {
console.log("Viewport state changed:", data.state);
}
function onViewportEnter() {
console.log("Element entered the viewport");
}
function onViewportLeave() {
console.log("Element left the viewport");
}
ParameterTypeDefaultDescription
onViewportfunctionMetro.noopCallback when viewport state changes. Receives event object and data with current state.
onViewportEnterfunctionMetro.noopCallback when element enters the viewport.
onViewportLeavefunctionMetro.noopCallback when element leaves the viewport.
onViewportCheckCreatefunctionMetro.noopCallback when component is created.
EventDataDescription
viewport-check-create{}Fired after component creation
viewport{state: boolean}Fired when viewport state changes
viewport-enter{}Fired when element enters the viewport
viewport-leave{}Fired when element leaves the viewport
var check = $("#my-element").data("viewport-check");
  • state() - Returns a boolean indicating whether the element is currently in the viewport.
var check = $("#my-element").data("viewport-check");
if (check.state()) {
console.log("Element is in viewport");
}

You can globally configure the viewport-check component using the Metro.viewportCheckSetup method:

Metro.viewportCheckSetup({
onViewport: function() {
console.log("Default behavior for all viewport-check components");
}
});
<img data-role="viewport-check"
data-on-viewport-enter="loadImage"
data-src="path/to/image.jpg"
src="placeholder.jpg">
function loadImage(event) {
var img = $(event.target);
var src = img.attr("data-src");
if (src) {
img.attr("src", src);
img.removeAttr("data-src");
}
}
<div class="animated-element"
data-role="viewport-check"
data-on-viewport-enter="startAnimation">
Content to animate
</div>
function startAnimation(event) {
$(event.target).addClass("animate");
}
<section id="important-content" data-role="viewport-check" data-on-viewport-enter="trackView">
Important content
</section>
function trackView(event) {
var elementId = $(event.target).attr("id");
// Send analytics event
analytics.track("Content Viewed", {
elementId: elementId
});
// Optional: Remove the tracking after first view
var component = $(event.target).data("viewport-check");
component.destroy();
}