Infinitum — Examples

Infinite loop of HTML elements. Designed primarily for tab-like navigations.

Example 1 — Tab Navigation (start mode)

<div class="example1__infinitum"><!-- required -->
    <ul class="example1__track"><!-- required -->
        <li class="example1__item"><!-- required -->
            <a class="example1__tab-title" href="#">Animals</a><!-- not required -->
        </li>
        …
    </ul>
</div>

<ul class="example1__tabs">
    <li class="example1__tab example1__tab--active">
        <img src="http://lorempixel.com/512/512/animals/10/" alt="" class="example1__img">
        …
    </li>
    …
</ul>
.example1__track {
    display: flex;
    flex-flow: row nowrap;
}

    .example1__item {
        /*must be non-breakable*/
        /*must not have transform, transition and opacity property*/
        /*there must not be any space between items*/
    }

        .example1__item .example1__tab-title {
            color: #aaa;
        }

        .example1__track:not(.infinitum__track--moving) .example1__item:hover .example1__tab-title {
            color: darkslategray;
        }

        .infinitum__item--possible-current .example1__tab-title,
        .example1__track:not(.infinitum__track--dragging) .infinitum__item--current .example1__tab-title {
            color: #444;
        }
var example1 = new Infinitum(".example1__infinitum");

var $tabs = $(".example1__tab");

example1.on("change", function (event) {

    var $item = $(event.target);

    $tabs.removeClass("example1__tab--active")
        .eq($item.index())
        .addClass("example1__tab--active");
});

Example 2 — Filter (center mode)

This example is using Filterizr.

<div class="example2__infinitum">
    <ul class="example2__track">
        <li class="example2__item" data-category="all">
            <a class="example2__filter-title" href="#">All</a>
        </li>
        …
    </ul>
</div>

<div class="example2__images">
    <div class="example2__image filtr-item" data-category="2">
        <img src="http://lorempixel.com/512/512/city/4/" alt="" class="example2__img" width="256" height="256">
    </div>
    …
</div>
.example2__track {
    font-size: 0;
    white-space: nowrap;
}

    .example2__item {
        /*still must be aligned to the left*/
        display: inline-block;
    }

        .example2__item .example2__filter-title {
            color: #aaa;
        }

        .example2__track:not(.infinitum__track--moving) .example2__item:hover .example2__filter-title {
            color: darkslategray;
        }

        .infinitum__item--possible-current .example2__filter-title,
        .example2__track:not(.infinitum__track--dragging) .infinitum__item--current .example2__filter-title {
            color: #444;
        }
var example2 = new Infinitum({
    selector: ".example2__infinitum",
    mode: Infinitum.POSITION.CENTER,
    current: 0 //current item will be the first element (.example2__item)
});

var $images = $(".example2__images");

example2.on("change", function (event) {

    var $item = $(event.target);

    $images.filterizr("filter", $item.data("category"));
});

Example 3 — Live (end mode)

<div class="example3__infinitum">
    <ul class="example3__track">
        <li class="example3__item">
            <a class="example3__tab-title" href="#">Animals</a>
        </li>
        …
    </ul>
</div>

<ul class="example3__tabs">
    <li class="example3__tab example3__tab--active">
        <img src="http://lorempixel.com/512/512/animals/10/" alt="" class="example3__img">
        …
    </li>
    …
</ul>
.example3__track {
    display: flex;
    flex-flow: row nowrap;
}

    .example3__item {
        /*still must be aligned to the left*/
    }

        .example3__item .example3__tab-title {
            color: #aaa;
        }

        .example3__track:not(.infinitum__track--moving) .example3__item:hover .example3__tab-title {
            color: darkslategray;
        }

        .infinitum__item--possible-current .example3__tab-title,
        .example3__track:not(.infinitum__track--dragging) .infinitum__item--current .example3__tab-title {
            color: #444;
        }
var example3 = new Infinitum({
    el: $(".example3__infinitum"),
    mode: Infinitum.POSITION.END,
    endBreak: Infinitum.POSITION.END, //breaks end item immediately after its right edge overflows
    current: 0 //current item will be the first element (.example3__item)
});

var $tabsWrapper = $(".example3__tabs"),
    $tabs = $tabsWrapper.find(".example3__tab");

example3.on("change possiblechange", function (event, infinitum) {

    //do not change tabs when "possiblechange" is not called by dragging the track
    if (event.type === "possiblechange" && !infinitum.dragging()) {

        return;
    }

    var $item = $(event.target);

    $tabs.removeClass("example3__tab--active")
        .eq($item.index())
        .addClass("example3__tab--active");
});

var lastEvent = Date.now();

//speed up tab switching when scrolling, dragging or keys are used
example3.on("scroll key tap dragging dragend", function (event) {

    if (event.type.match(/tap|dragend/) || Date.now() - lastEvent > 500) {

        $tabsWrapper.removeClass("speed-up");

    } else {

        $tabsWrapper.addClass("speed-up");
    }

    lastEvent = Date.now();
});

Example 4 — Number selector

It's possible to use both at the same time (multi-touch).

<div class="example4__infinitum example4__infinitum--1">
    <ol class="example4__track">
        <li class="example4__item">
            <a class="example4__number" href="#">1</a>
        </li>
        …
    </ol>
</div>
.example4__infinitum {
    overflow: hidden;
}

    .example4__track {
        font-size: 0;
        white-space: nowrap;
    }

        .example4__item {
            /*still must be aligned to the left*/
            display: inline-block;
        }

            .example4__item .example4__number {
                color: #aaa;
            }

            .example4__track:not(.infinitum__track--moving) .example4__item:hover .example4__number {
                color: darkslategray;
            }

            .infinitum__item--possible-current .example4__number,
            .example4__track:not(.infinitum__track--dragging) .infinitum__item--current .example4__number {
                transform: scale(1.25);

                color: #444;
            }
var example4 = new Infinitum({
    selector: ".example4__infinitum--1",
    mode: Infinitum.POSITION.CENTER,
    fade: false, //no fade effect (won't be visible)
    currentIn: Infinitum.CURRENT.STILL_INSIDE, //as current will be used the item, which is in the center of the widget; Infinitum.CURRENT.FULL has the same effect
    currentOut: Infinitum.CURRENT.STILL_INSIDE, //not necessary; it will use value from the currentIn option, because mode is Infinitum.POSITION.CENTER
    current: 0,

    keyThrottle: 60,
    wheelThrottle: 25
});

Example 5 — Methods

<div class="example5__infinitum">
    <ul class="example5__track">
        <li class="example5__item">
            <a href="#" class="example5__image">
                <img src="http://lorempixel.com/512/512/animals/10/" alt="" class="example5__img">
            </a>
        </li>
        …
    </ul>
</div>
.example5__track {
    display: flex;
    flex-flow: row nowrap;
}

    .example5__item {
        width: 25%;
        flex-shrink: 0;
    }

        .example5__item .example5__image {
            padding: 4px 2px;
        }

            .example5__item .example5__img {
                opacity: 0.8;
                filter: grayscale(1);
            }

            .example5__track:not(.infinitum__track--moving) .example5__item:hover .example5__img {
                opacity: 1;
            }

            .infinitum__item--possible-current .example5__img,
            .example5__track:not(.infinitum__track--dragging) .infinitum__item--current .example5__img {
                filter: grayscale(0);
                opacity: 1;
            }
var example5 = new Infinitum({
    selector: ".example5__infinitum",
    breakAll: true, //always moves all item
    clearEdge: false, //items may remain on the left
    currentIn: Infinitum.CURRENT.FULL //as current will be used item, which is fully inside the widget (if moving in the direction — left)
});

var $buttons = $(".example5__button"),
    $select = $(".example5__select");

$buttons.on("click touchend", function (event) {

    event.preventDefault();

    var moveMethod = this.className.match(/--(prev|next)/);

    if (moveMethod) {

        //example5.next();
        //example5.prev();
        example5[moveMethod[1]]();

        return;
    }

    example5[example5.disabled ? "enable" : "disable"]();

    this.innerText = example5.disabled ? "Enable" : "Disable";
    this.title = example5.disabled ? "example5.enable()" : "example5.disable()";
});

$select.on("change", function () {

    example5.setCurrent(Number(this.value));
});

example5.on("change", function (event) {

    $select.val($(event.target).index());
});