Skip to content

πŸ”Ž Intersection Observer API wrapper for Blazor applications

License

Notifications You must be signed in to change notification settings

springy76/BlazorIntersectionObserver

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

28 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

BlazorIntersectionObserver

Package Version NuGet Downloads License Build Status

A comprehensive wrapper around the Intersection Observer API, giving you all the goodness of observing intersections in a performant way.

This is a wrapper around the Intersection Observer API so that you can use it in Blazor. It has the same API structure with convenience methods and components for a better dev experience.

Get Started

1. Installation

Install BlazorIntersectionObserver through NuGet.

> dotnet add package BlazorIntersectionObserver

2. Register the service

Now you'll need to add the service to the service configuration.

using Blazor.IntersectionObserver;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddIntersectionObserver();
    }
}

3. Use it!

For the quickest setup, use the IntersectionObserve component. This provides an implicit context object which contains the observer entry! Easy!

Component setup

@using Blazor.IntersectionObserver.Components

<IntersectionObserve>
    <div>
        Hey... look I'm @(context?.IsIntersecting ? "intersecting!": "not intersecting!")
    </div>
</IntersectionObserve>

OR

Service setup

To directly use the service, you just need to inject it and observe the element(s).

@using Blazor.IntersectionObserver
@inject IntersectionObserverService ObserverService

<img ref="ImageElement" src="@(IsIntersecting ? "https://www.placecage.com/g/500/500" : "")"/>

@functions {
    public ElementRef ImageElement { get; set; }
    public bool IsIntersecting { get; set; }
    public bool HasObserver { get; set; }
    
    protected override void OnAfterRender() 
    {
        if (!HasObserver) 
        {
            SetupObserver();
        }
    }

    public async void SetupObserver()
    {
        HasObserver = true;

        await ObserverService.Observe(ImageElement, (entries) =>
        {
            var entry = entries.FirstOrDefault();
            IsIntersecting = entry.IsIntersecting;
            StateHasChanged();
        });
    }
}

Documentation and Usage

Options

You can pass through options to the ObserverService methods, these are the same as the Intersection Observer API options.

Example

var options = new IntersectionObserverOptions {
    Root = BodyRef, 
    Threshold = new List<double> { 0.25, 0.5, 1 },
    RootMargin = "10px 10px 10px 10px"
};

Service Methods

Observe

This a shorthand way of observing an element by providing:

  • The element you want to observe.
  • The callback to trigger on an intersection update.
  • The intersection observer options.

This returns an IntersectionObserver instance, allowing you to disconnect the observer or unobserve an element. Or if you wish, observe additional elements.

var observer = ObserverService.Observe(ElementRef, (entries) => {
    IsIntersecting = entries.FirstOrDefault().IsIntersecting;
    StateHasChanged();
}, options);

Create

The Create method follows the same approach as the Intersection Observer API, you create the observer and then pass elements you wish to observe by calling the Observe method on the observer instance. To create the observer, provide the following:

  • The callback to trigger on an intersection update.
  • The intersection observer options.

This returns an IntersectionObserver instance, allowing you to Observe elements. This also provides the ability to disconnect or unobserve the element.

var observer = ObserverService.Create((entries) => {
    IsIntersecting = entries.FirstOrDefault().IsIntersecting;
    StateHasChanged();
}, options);

observer.Observe(FirstImage);
observer.Unobserve(FirstImage);

IntersectionObserver Methods

Observe

To observe an element, provide the element reference to the IntersectionObserver instance by calling Observe.

observer.Observe(ElementRef);

Unobserve

To unobserve an element, provide the element reference to the IntersectionObserver instance by calling Unobserve.

observer.Unobserve(ElementRef);

Disconnect

To disconnect the observer, call Disconnect on the IntersectionObserver instance.

observer.Disconnect();

This is a useful method to clean up observers when components are disposed of, i.e.

@using Blazor.IntersectionObserver
@implements IDisposable
@inject IntersectionObserverService ObserverService

<div ref="NicolasCageRef"></div>

@functions {
    private IntersectionObserver Observer;
    @* Code... *@
    public void Dispose()
    {
        Observer.Disconnect();
    }
}

Component

<IntersectionObserve>

Rather than directly interfacing with the service, you can use this convenience component for quick and easy observing. You can access the observer entry through the implicit @context!

@* Injecting service... *@

<IntersectionObserve>
    <div>
        Hey... look I'm @(context?.IsIntersecting ? "intersecting!": "not intersecting!")
    </div>
</IntersectionObserve>

@* Component code... *@
Props
  • OnChange (EventCallback<IntersectionObserverEntry>) - When the intersection observer has a entry update.
  • IsIntersecting (bool) - Whether the element is intersecting - used for two-way binding.
  • Options (IntersectionObserverOptions) - The options for the observer.
  • Once (bool) - Only observe once for an intersection, then the instance disposes of itself.
  • Style (string) - The style for the element.
  • Class (string) - The class for the element.

Implementation Detail

To avoid creating an unnecessary number of observers for every element being observed, if a Blazor Observer shares exactly the same options as another, they will both use the same IntersectionObserver instance in JS. As each Blazor Observer has a unique id and callback, the elements that are being observed will still be passed to their respective Blazor Observer.

Feature Requests

There's so much that IntersectionObserver can do, so if you have any requests or you want better documentation and examples, feel free to make a pull request or create an issue!

Credit

  • Blazor Extensions - They have a great way of setting up a blazor library, check their repos out!

About

πŸ”Ž Intersection Observer API wrapper for Blazor applications

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 55.0%
  • TypeScript 42.9%
  • JavaScript 1.7%
  • HTML 0.4%