Unobtrusive page transitions with jQuery.

  • By Miguel Pérez
  • Last update: Jan 4, 2023
  • Comments: 11

smoothState.js

smoothState.js is a jQuery plugin that progressively enhances page loads to give us control over page transitions. If the user's browser doesn't have the required features, smoothState.js fades into the background and never runs.

demo of smoothstate

Build Status Gitter

Built with smoothState.js

Below are some cool sites built with smoothState.js. Feel free to submit a pull request with your own site, or tweet me with a link.

Contributor demos

Live Sites

Need help?

If you need a little help implementing smoothState there are a couple things you could do to get some support:

  1. Post on stackoverflow using the smoothState.js tag.
  2. Join the Gitter room and talk to some of the contributors.
  3. Contact Miguel directly, he provides pair-programing help billed by the hour

Please avoid creating a Github issue with personal support requests, to keep the tracker clear for bugs and pull requests.

Intro

Imagine, for a second, how disorienting it would be if touching a doorknob teleported you to the other side of the door. Navigating the web feels like using a teleporting doorknob. Layouts change, elements rearrange or disappear, and it takes time for the user to adjust. Smooth transitions reduce the effort it takes for users to get settled into a new environment.

Javascript SPA frameworks, sometimes referred to as MVC frameworks, are a common way to solve this issue. These frameworks often lose the benefits of unobtrusive code. Writing unobtrusive javascript gives us more resilience to errors, and improved performance and accessibility.

How does smoothState.js work?

smoothState.js provides hooks that can be used to choreograph how elements enter and exit the page during navigation. It uses the time the animations are running to fetch content via AJAX to inject into the page.

smoothState.js doesn't dictate how things on the page should be animated. It supports CSS animations, as well as JS animation libraries like velocity.js.

Design philosophy and requirements

The project's main goal is to allow developers to add page transitions without having to add any logic to the backend. We keep things unobtrusive at all times.

smoothState.js initializes on containers, not links. Think of a container as a small window object embedded in the page.

  1. Every URL on your site should return a full layout - not just an HTML fragment
  2. The smoothState container needs to have an id set - a unique hook to tell us what to update on the page
  3. All links and forms on the page should live within the container

These requirements makes the website resilient, since it smoothState.js can abort and simply redirect the user if an error occurs. Making each link return a full page also ensures that pages are created with progressive enhancement in mind.

Getting started

All we need to do to get started is:

  1. Include a copy of jQuery and jQuery.smoothState.js on your page
  2. Add a container with an id of #main and include some links inside of it
  3. Create a new js file and run $('#main').smoothState()
$(function() {
  $('#main').smoothState();
});

By default, smoothState.js will:

  • Prevent links and forms from triggering a full page load, if possible
  • Use AJAX to request pages and replace the content appropriately
  • Update URLs and browsing history so that browsing expectations aren't broken

smoothState.js will not add page transitions to pages. You'll need to define the animations you want to run using the hooks smoothState.js provides.

  • onBefore - Runs before a page load has been started
  • onStart - Runs once a page load has been activated
  • onProgress - Runs if the page request is still pending and the onStart animations have finished
  • onReady - Run once the requested content is ready to be injected into the page and the previous animations have finished
  • onAfter - Runs after the new content has been injected into the page and all animations are complete

Options

smoothState.js provides some options that allow customization of the plugin's functionality. The default options are overridden by passing an object into the smoothState function.

Options example

$(function(){
  'use strict';
  var options = {
    prefetch: true,
    cacheLength: 2,
    onStart: {
      duration: 250, // Duration of our animation
      render: function ($container) {
        // Add your CSS animation reversing class
        $container.addClass('is-exiting');

        // Restart your animation
        smoothState.restartCSSAnimations();
      }
    },
    onReady: {
      duration: 0,
      render: function ($container, $newContent) {
        // Remove your CSS animation reversing class
        $container.removeClass('is-exiting');

        // Inject the new content
        $container.html($newContent);

      }
    }
  },
  smoothState = $('#main').smoothState(options).data('smoothState');
});

debug

If set to true, smoothState.js will log useful debug information to the console, instead of aborting. For example, instead of redirecting the user to a page on an error, it might log:

No element with an id of “#main” in response from “/about.html”.
// Default
$('#main').smoothState({ debug: false });

anchors

A jQuery selector specifying which anchors within the smoothState element should be bound.

// Default
$('#main').smoothState({ anchors: 'a' });

hrefRegex

A regular expression to specify which anchor with a specific href property based on the regex smoothState should bind to. If empty, every href will be permitted.

// Default
$('#main').smoothState({ hrefRegex: '' });

forms

A jQuery selector specifying which forms within the smoothState element should be bound.

// Default
$('#main').smoothState({ forms: 'form' });

allowFormCaching

Controls whether or not form submission responses are preserved in the cache. If set to true, smoothState will store form responses in the cache. This should be set to false unless you understand how caching form results will affect your website's behaviour very well.

// Default
$('#main').smoothState({ allowFormCaching: false });

repeatDelay

The minimum number of milliseconds between click/submit events. User events ignored beyond this rate are ignored. This can be used to ignore double-clicks so that the user's browser history won't become cluttered by incompleted page loads.

// Default
$('#main').smoothState({ repeatDelay: 500 });

blacklist

A jQuery selector specifying which elements within the smoothState element should be ignored. This includes both form and anchor elements.

// Default
$('#main').smoothState({ blacklist: '.no-smoothState' });

prefetch

There is a 200ms to 300ms delay between the time that a user hovers over a link and the time they click it. On touch screens, the delay between the touchstart and touchend is even greater. If the prefetch option is set to true, smoothState.js will begin to preload the contents of the URL during that delay. This technique will increase the perceived performance of the site.

// Default
$('#main').smoothState({ prefetch: false });

prefetchOn

The name of the events to listen to from anchors when prefetching.

// Default
$('#main').smoothState({ prefetchOn: 'mouseover touchstart' });

If you would like to throttle the prefetch, do so by firing custom events.

Libraries like @tristen's hoverintent can be used to throttle prefetching based on the user's intent, by triggering a custom intent event. To use it with smoothState.js, set intent as the prefetchOn option.

$('#main').smoothState({ prefetchOn: 'intent' });

Or, for the opposite effect, use something like @cihadturhan's jQuery.aim and add spider sense-like prefetching to smoothState.js.

$('#main').smoothState({ prefetchOn: 'aim' });

locationHeader

A field name to lookup among the headers from the HTTP response to alert smoothState.js of any redirected URL.

smoothState.js makes AJAX requests using XMLHttpRequest, which silently follows redirects. This transparence prevents smoothState.js from knowing if a request resulted in a redirection.

For example, when you visit /about and the server redirects you to /about/company, smoothState.js is only ever informed of a successful response from /about. The locationHeader option gives smoothState.js a HTTP response header to consult and replace the browser's history entry with the real URI.

$('#main').smoothState({ locationHeader: 'X-SmoothState-Location' });

cacheLength

The number of pages to cache. smoothState.js can cache pages in memory, avoiding the user having to request pages more than once. Cached pages will load instantaneously.

// Default
$('#main').smoothState({ cacheLength: 0 });

loadingClass

The class to apply to the body while a page is still loading, unless the page is received before the animations are complete.

// Default
$('#main').smoothState({ loadingClass: 'is-loading' });

scroll

Scroll to top after onStart and scroll to hash after onReady. This is default behavior, if you want to implement your own scroll behavior, set scroll: false

// Default
$('#main').smoothState({ scroll: true });

alterRequest

A function to alter a request's AJAX settings before it is called. This can be used to alter the requested URL, for example.

// Default
$('#main').smoothState({
  // Param `request` is an `Object` that is currently set to be used
  alterRequest: function(request) {
    // Must return and `Object` that will be used to make the request
    return request;
  }
});

alterChangeState

A function to alter a history entry's state object before it is modified or added to the browser's history. This can be used to attach serializable data to the history entry, for example.

// Default
$('#main').smoothState({
  // Param `state` is an `Object` that contains the container ID, by default
  alterChangeState: function(state) {
    // Must return a serializable `Object` that is associated with the history entry
    return state;
  }
});

onBefore

The function to run before a page load is started.

// Default
$('#main').smoothState({
  // `$currentTarget` is a `jQuery Object` of the element, anchor or form, that triggered the load
  // `$container` is a `jQuery Object` of the the current smoothState container
  onBefore: function($currentTarget, $container) {}
});

onStart

The function to run once a page load has been activated. This is an ideal time to animate elements that exit the page and set up for a loading state.

// Default
$('#main').smoothState({
  onStart: {
    // How long this animation takes
    duration: 0,
    // A function that dictates the animations that take place
    render: function ($container) {}
  }
});

onProgress

The function to run only if the page request is still pending and onStart has finished animating. This is a good place to add something like a loading indicator.

// Default
$('#main').smoothState({
  onProgress: {
    // How long this animation takes
    duration: 0,
    // A function that dictates the animations that take place
    render: function ($container) {}
  }
});

onReady

The function to run when the requested content is ready to be injected into the page. This is when the page's contents should be updated.

// Default
$('#main').smoothState({
  onReady: {
    duration: 0,
    // `$container` is a `jQuery Object` of the the current smoothState container
    // `$newContent` is a `jQuery Object` of the HTML that should replace the existing container's HTML.
    render: function ($container, $newContent) {
      // Update the HTML on the page
      $container.html($newContent);
    }
  }
});

onAfter

The function to run when the new content has been injected into the page and all animations are complete. This is when to re-initialize any plugins needed by the page.

// Default
$('#main').smoothState({
  onAfter: function($container, $newContent) {}
});

Methods and properties

smoothState provides some methods and properties, made accessible through the element's data property.

// Access smoothState
var smoothState = $('#main').smoothState().data('smoothState');

// Run method
smoothState.load('/newPage.html');

Properties

href

The URL of the content that is currently displayed.

cache

An object containing the cached pages after they are requested.

Methods

load(url)

This loads the contents of a URL into our container.

fetch(url)

This fetches the contents of a URL and caches it.

clear(url)

This clears a given page from the cache. If no URL is provided it will clear the entire cache.

restartCSSAnimations()

This restarts any CSS animations applying to elements within the smoothState container.

FAQ

Help! My $(document).ready() plugins work fine when I refresh but break on the second page load.

smoothState.js provides the onAfter callback function that allows you to re-run your plugins. This can be tricky if you're unfamiliar with how AJAX works.

When you run a plugin on $(document).ready(), it's going to register only on elements that are currently on the page. Since we're injecting new elements every load, we need to run the plugins again, scoping it to just the new stuff.

A good way to do this is to wrap your plugin initializations in a function that we call on both $.fn.ready() and onAfter. You'll want to specify the context each time you initialize the plugins so that you don't double-bind them. This is called a "module execution controller".

Contribute

We're always looking for:

  • Bug reports, especially those for aspects with a reduced test case
  • Pull requests for features, spelling errors, clarifications, etc.
  • Ideas for enhancements
  • Demos and links to sites built with smoothState.js

Github

https://github.com/miguel-perez/smoothState.js

Comments(11)

  • 1

    How to integrate SmoothState with Wordpress at all?

    There are few problems with that.

    There is one of you that have a complete and serious guide?

    For example: I use in my Wordpress both "Visualizer" plugin (that visualize Google Charts in my pages) and "DataTables" plugin of jQuery.

    Both aren't working when I use SmoothState.

    When I call a page in wordpress that contain one of these from my home page nothing works. The page is blank. Without code. If I refresh browser on that page then everything works.

    I suppose the problem is with ajax call of the plugins, but I'll never find a solution. That's why I'm here asking you...

    HOW TO?

  • 2

    Update DOM elements outside of $container

    smoothState.js version tested:

    • Version 0.5.1

    Description

    On the website I'm building now I have information attached to <body> such as id, classes and styles. Like below:

    <body id="project-name" class="project single theme-dark" style="background:white">

    ..in order to control the page's:

    • background color
    • color theme (dark/white).

    I initialize smoothState on a div #main and when I click a link everything under #main gets updated. The problem is that body not gets updated.

    Possible solution:

    My first approach to fix this was to use the callback onEnd, but none of the variables passed to the render function (url, $container, $content) holds any information about the <body>. At least to my knowledge – am I missing something?

    Since I couldn't solve this with the callback functions I made changes to jquery.smoothState.js. What I did was to extend the storePageIn function, adding information to the object variable with a new key meta. See code below:

    storePageIn: function (object, url, $html) {
        $html = ($html instanceof jQuery) ? $html : utility.htmlDoc($html);
        // Add meta information
        // Added by @pudgereyem
        var meta = {}
        meta.bodyId = $html.find( 'body' ).attr( 'id' );
        meta.bodyClasses = $html.find( 'body' ).attr( 'class' );
        meta.bodyCSS = $html.find( 'body' ).attr( 'style' );
    
        object[url] = { // Content is indexed by the url
            status: "loaded",
            title: $html.find("title").text(), // Stores the title of the page
            html: $html, // Stores the contents of the page
            meta: meta
        };
        return object;
    },
    

    ..and then I also extended the function updateContent to actually update body:

    /** Updates the contents from cache[url] */
    updateContent = function (url) {
        // If the content has been requested and is done:
        var containerId = '#' + $container.prop('id'),
            $content    = utility.getContentById(containerId, cache[url].html);
    
        if($content) {
            document.title = cache[url].title;
    
            // Update body ID, classes and style
            // Added by @pudgereyem
            $body.removeClass().addClass(cache[url].meta.bodyClasses);
            $body.attr('id', cache[url].meta.bodyId);
            $body.attr('style', cache[url].meta.bodyCSS);
    ...
    

    Discussion

    • Wouldn't it make sense if the callbacks provided offer the complete ajax response from the page that gets fetched? So users have greater freedom and not having to change the actual code of this script.
    • What do you think about extending the code with meta information about the page being fetched like I suggested above?
  • 3

    Integrate SmoothState with Wordpress at all.

    I opened a new space blank and clean here:

    http://ginolon.altervista.org

    I've put here Wordpress 3.9.1 and followed this guide: http://www.parsonsprojects.co.uk/smoothstate-wordpress/

    I've changed every "$" to "jQuery" because of a lot of errors.

    Everything works except some plugins like "Visualizer" and "Inline Google Spreadsheet" that work only if I open the page that contain them or if I refresh the page (you can try now in the live site).

    After this I followed the guide of @miguel-perez to fix this issue, that you can find it here: https://github.com/weblinc/jquery.smoothState.js/issues/64#issuecomment-54657406, without success.

    I have an error:

    "Uncaught TypeError: Cannot read property 'apply' of undefined"

    You can try from yourself on the live site.

    The question is: HOW TO? Where I'm doing wrong?

  • 4

    [FEATURE] Replace meta and link tags

    This update replaces meta and link tags of the active document if its "body"-content is replaced by the cached "body"-content.

    There are to new default options for this, metaTags and linkTags. So you can define your own tags.

    What do you think about this?

  • 5

    not updating correctly in Chrome</h3> <article class="markdown-body text-wrap ctag"> <p>Just have to say, this is awesome! But the title is not updating correctly in Chrome (v 36.0.1985.143). Instead of the given title-tag it sets the url (this is the correct url though) as the title. Any ideas?</p> <p>Works perfect in Firefox and Safari.</p> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#070f60),to(#0071dc));background-image: linear-gradient(to right,#070f60,#0071dc);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">6</div> <h3>Clunky transitions on slow connection speeds</h3> <article class="markdown-body text-wrap ctag"> <p>My client is experiencing very clunky transitions on page loads. I suspect this is a caching issue, so I am wondering if there you have a suggestion for how we could remedy this. I see there is a caching option in the documentation, so I am wondering if this will help remedy this issue. You can see the site in question at: http://bobby.gramacy.com/</p> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#ffc221),to(#ffc221));background-image: linear-gradient(to right,#ffc221,#ffc221);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">7</div> <h3>Automatic Google Analytics Integration</h3> <article class="markdown-body text-wrap ctag"> <p>I think it would be great if Google Analytics would automatically be tiggered if available.</p> <p>So adding something like this:</p> <pre><code>if (window.ga) { window.ga('send', 'pageview', window.location.pathname || url); } </code></pre> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#070f60),to(#0071dc));background-image: linear-gradient(to right,#070f60,#0071dc);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">8</div> <h3>Redrawing of element creates flickering</h3> <article class="markdown-body text-wrap ctag"> <p><strong>smoothState.js version tested:</strong></p> <ul> <li>Version 0.5.2</li> </ul> <p><strong>Browser versions or Packager version tested against:</strong></p> <ul> <li>IE11</li> <li>Chrome</li> <li>Safari</li> </ul> <p><strong>Description:</strong></p> <ul> <li>The plugin triggers as part of triggerAllAnimationEndEvent on line 271 a redraw of the main element. But this creates a flickering on the page on my site. Disabling this line removes the flicker. Any idea how to fix this?</li> </ul> <p><strong>The result that was expected:</strong></p> <ul> <li>Smooth transition between pages</li> </ul> <p><strong>The result that occurs instead:</strong></p> <ul> <li>Transition causes ugly flickering</li> </ul> <p>Why is the redraw needed?</p> <p>Thanks, Roland</p> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#ffc221),to(#ffc221));background-image: linear-gradient(to right,#ffc221,#ffc221);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">9</div> <h3>smoothState and slick not working</h3> <article class="markdown-body text-wrap ctag"> <p>If i use smoothState and Slick slider together, i take that error <img src="https://cloud.githubusercontent.com/assets/11390039/14758596/2f570598-090e-11e6-8758-e6c5b4fb3aa7.png" alt="img-2016-04-23-04-45-05" /> It happens when I'm doing some switching between pages. Sorry for my english, how fix it? My JS code</p> <pre><code>$(function(){ 'use strict'; var $page = $('#main'), options = { anchors: '.header__logo, .stolkovo-link ', debug: true, prefetch: true, cacheLength: 5, onStart: { duration: 1000, // Duration of our animation render: function ($container) { // Add your CSS animation reversing class $container.addClass('slideOutLeft'); // Restart your animation smoothState.restartCSSAnimations(); } }, onReady: { duration: 1000, render: function ($container, $newContent) { // Remove your CSS animation reversing class $container.addClass('slideInRight') $container.removeClass('slideOutLeft'); // Inject the new content $container.html($newContent); } }, onAfter: function($container, $newContent) { fn(); } }, smoothState = $page.smoothState(options).data('smoothState'); }); function fn () { $('.banner-carousel').slick({ arrows: false, dots: false, autoplay: true, autoplaySpeed: 3000, }); $('.new-banner').slick({ arrows: false, dots: false, autoplay: true, autoplaySpeed: 3000, }); $('#main-partners').slick({ arrows: false, dots: true, autoplay: false, autoplaySpeed: 2000, slidesToScroll: 4, slidesToShow: 4, responsive: [ { breakpoint: 1070, settings: { slidesToScroll: 3, slidesToShow: 3 } }, { breakpoint: 800, settings: { slidesToScroll: 2, slidesToShow: 2 } }, { breakpoint: 600, settings: { slidesToScroll: 1, slidesToShow: 1 } } ] }); $('.partners__block-slider').slick({ arrows: false, dots: true, autoplay: false, autoplaySpeed: 2000, slidesToScroll: 1, slidesToShow: 1 }); // $('.under-menu__ul > li > a').click(function() { // $('title').append(' - Новый тайтл');; // }); $('.tr.no-time').slideUp(); $('.tr.section.have-child').click(function() { $(this).next().slideToggle(); }) }; fn(); </code></pre> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#070f60),to(#0071dc));background-image: linear-gradient(to right,#070f60,#0071dc);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">10</div> <h3>Cross - Browser Problem</h3> <article class="markdown-body text-wrap ctag"> <p>First of all: Great idea and great script, but i am experiencing issues with browsers other than Chrome.</p> <p>In Firefox the following happens: <img src="https://cloud.githubusercontent.com/assets/5417518/4008132/93b7e880-29d2-11e4-8639-df2a5734ca27.gif" alt="firefox-issue" /></p> <p>In Safari / Webkit the animations do not trigger at all (this may be for me being a noob).</p> <p>System is OS X 10.9.4 with Chrome 36, Firefox 31, Safari 7.0.6</p> <p>Sorry if those issues are my failure.</p> </article> <li> <div style="font-size: 17px;width: 40px;height: 40px;line-height: 40px;color: #fff;background-image: -webkit-gradient(linear,left top,right top,from(#ffc221),to(#ffc221));background-image: linear-gradient(to right,#ffc221,#ffc221);text-align: center;border-radius: 50px;position: absolute;top: 30px;left: 0;font-weight: bold;">11</div> <h3>Foundation plugins and smoothState.js</h3> <article class="markdown-body text-wrap ctag"> <p>Hi there, I am using the foundation framework and want to use smoothState.js. Does anybody know how to re-initialize foundation plugins with smoothstate.js? They only work if I hit browser refresh. All the other jQuery plugins seem to work - just foundation is giving me a headache... I think an example/demo would be really helpful, maybe the same for the other famous css framework Bootstrap?</p> <p>I tried this:</p> <p><strong>Adding Plugins After Page Load</strong> http://foundation.zurb.com/sites/docs/javascript.html#adding-plugins-after-page-load</p> <p>and this:</p> <p><strong>Adding Content to Plugins</strong> http://foundation.zurb.com/sites/docs/javascript.html#adding-content-to-plugins</p> <p>...without success. I guess I just don't really when to use onAfter and onReady? And then I was given the link by @miguel-perez but I also do not understand how to include that. https://gist.github.com/miguel-perez/476046a42d229251fec3</p> <p>thank you!</p> </article> </ul> </div> </div> </div> <div class="col-lg-4"> <div class="side-bar-area"> <div class="search-widget"> <form class="search-form" action="/search"> <input type="search" class="form-control" placeholder="Search..."> <button type="submit"><i class="bx bx-search"></i></button> </form> </div> <div class="side-bar-widget"> <h3 class="title">Popular Tag</h3> <ul class="side-bar-widget-tag"> <li><a href="/tag/bulma-css" >bulma-css</a></li> <li><a href="/tag/stylesheets" >stylesheets</a></li> <li><a href="/tag/vuex" >vuex</a></li> <li><a href="/tag/node" >node</a></li> <li><a href="/tag/bootstrap-4" >bootstrap-4</a></li> <li><a href="/tag/portfolio" >portfolio</a></li> <li><a href="/tag/buttons" >buttons</a></li> <li><a href="/tag/gnome" >gnome</a></li> <li><a href="/tag/vue-router" >vue-router</a></li> <li><a href="/tag/gtk3-theme" >gtk3-theme</a></li> </ul> </div> <div class="side-bar-widget"> <h3 class="title">Related</h3> <div class="widget-popular-post"> <article class="item"> <a href="/lib/blivesta-animsition" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/3160395?v=4" alt="A simple and easy jQuery plugin for CSS animated page transitions." /></a> <div class="info"> <h4 class="h6"><a href="/lib/blivesta-animsition" >A simple and easy jQuery plugin for CSS animated page transitions.</a></h4> <p><i class='bx bx-time-five' ></i> Jan 2, 2023</p> </div> </article> <article class="item"> <a href="/lib/codrops-NotificationStyles" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/310036?v=4" alt="Various simple ideas and effects for unobtrusive notifications on a website." /></a> <div class="info"> <h4 class="h6"><a href="/lib/codrops-NotificationStyles" >Various simple ideas and effects for unobtrusive notifications on a website.</a></h4> <p><i class='bx bx-time-five' ></i> Dec 31, 2022</p> </div> </article> <article class="item"> <a href="/lib/a-lightweight-unobtrusive-and-styleagnostic-css-framework-aimed-for-practical-use-cases-comes-with-a-small-footprint-and-zero-bullshit" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/1101002?v=4" alt="A lightweight, unobtrusive and style-agnostic, CSS framework aimed for practical use cases. Comes with a small footprint and zero bullshit." /></a> <div class="info"> <h4 class="h6"><a href="/lib/a-lightweight-unobtrusive-and-styleagnostic-css-framework-aimed-for-practical-use-cases-comes-with-a-small-footprint-and-zero-bullshit" >A lightweight, unobtrusive and style-agnostic, CSS framework aimed for practical use cases. Comes with a small footprint and zero bullshit.</a></h4> <p><i class='bx bx-time-five' ></i> Oct 5, 2022</p> </div> </article> <article class="item"> <a href="/lib/abhishekjnvk-jquery-simple-alert" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/16479428?v=4" alt="Simple Jquery Alert is a jquery based, mobile-ready & highly customizable Alert Box" /></a> <div class="info"> <h4 class="h6"><a href="/lib/abhishekjnvk-jquery-simple-alert" >Simple Jquery Alert is a jquery based, mobile-ready & highly customizable Alert Box</a></h4> <p><i class='bx bx-time-five' ></i> Sep 18, 2020</p> </div> </article> <article class="item"> <a href="/lib/codrops-PageRevealEffects" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/310036?v=4" alt="Some ideas for modern multi-layer page transitions using CSS Animations" /></a> <div class="info"> <h4 class="h6"><a href="/lib/codrops-PageRevealEffects" >Some ideas for modern multi-layer page transitions using CSS Animations</a></h4> <p><i class='bx bx-time-five' ></i> Nov 1, 2022</p> </div> </article> <article class="item"> <a href="/lib/joaopereirawd-fakeLoader-js" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/2126300?v=4" alt="fakeLoader.js is a lightweight jQuery plugin that helps you create an animated spinner with a fullscreen loading mask to simulate the page preloading effect." /></a> <div class="info"> <h4 class="h6"><a href="/lib/joaopereirawd-fakeLoader-js" >fakeLoader.js is a lightweight jQuery plugin that helps you create an animated spinner with a fullscreen loading mask to simulate the page preloading effect.</a></h4> <p><i class='bx bx-time-five' ></i> Dec 6, 2022</p> </div> </article> <article class="item"> <a href="/lib/this-is-a-conference-page-for-a-conference-the-page-was-build-to-only-navigate-to-the-about-page-the-website-was-build-using-html-css-and-javascript" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://github.com/estebanmual/First-Capstone-Projects/raw/master/mockup-readme.jpg" alt="This is a conference page for a conference. The page was build to only navigate to the About page. The website was build using HTML5, CSS3 and JavaScript." /></a> <div class="info"> <h4 class="h6"><a href="/lib/this-is-a-conference-page-for-a-conference-the-page-was-build-to-only-navigate-to-the-about-page-the-website-was-build-using-html-css-and-javascript" >This is a conference page for a conference. The page was build to only navigate to the About page. The website was build using HTML5, CSS3 and JavaScript.</a></h4> <p><i class='bx bx-time-five' ></i> Mar 5, 2022</p> </div> </article> <article class="item"> <a href="/lib/h5bp-Effeckt-css" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://camo.githubusercontent.com/2be8550e1c9013c55be41e081fd68c47aff85cbcbbb1445ee574d6a25b7d14dc/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f33393139312f3732353432362f61613361663338632d653036372d313165322d383265342d3236393038366362383435642e706e67" alt="A Performant Transitions and Animations Library " /></a> <div class="info"> <h4 class="h6"><a href="/lib/h5bp-Effeckt-css" >A Performant Transitions and Animations Library </a></h4> <p><i class='bx bx-time-five' ></i> Jan 2, 2023</p> </div> </article> <article class="item"> <a href="/lib/sea-reel-Pure-CSS-Carousel" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/3667366?v=4" alt="Rich slide (text/images/whatever) carousel with fade transitions, without any javascript" /></a> <div class="info"> <h4 class="h6"><a href="/lib/sea-reel-Pure-CSS-Carousel" >Rich slide (text/images/whatever) carousel with fade transitions, without any javascript</a></h4> <p><i class='bx bx-time-five' ></i> Apr 5, 2022</p> </div> </article> <article class="item"> <a href="/lib/RafaelEchart-React_USACovid19Tracker" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://github.com/RafaelEchart/React_USACovid19Tracker/raw/development/src/assets/app_1.gif" alt="USA Covid-19 Tracker is a mobile-first application built with React and Redux to give precise information about the virus behavior in the United States. Great transitions and user feedback made with plain CSS." /></a> <div class="info"> <h4 class="h6"><a href="/lib/RafaelEchart-React_USACovid19Tracker" >USA Covid-19 Tracker is a mobile-first application built with React and Redux to give precise information about the virus behavior in the United States. Great transitions and user feedback made with plain CSS.</a></h4> <p><i class='bx bx-time-five' ></i> Oct 25, 2022</p> </div> </article> <article class="item"> <a href="/lib/marcodpt-vue-over-body" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/7243947?v=4" alt="Create modals, sidebars, notifications, pop ups with css transitions!" /></a> <div class="info"> <h4 class="h6"><a href="/lib/marcodpt-vue-over-body" >Create modals, sidebars, notifications, pop ups with css transitions!</a></h4> <p><i class='bx bx-time-five' ></i> Jun 28, 2022</p> </div> </article> <article class="item"> <a href="/lib/Edmund1645-vue-transitions-css" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars3.githubusercontent.com/u/34762800?v=4" alt="A lightweight CSS library for adding transitions to Vue components" /></a> <div class="info"> <h4 class="h6"><a href="/lib/Edmund1645-vue-transitions-css" >A lightweight CSS library for adding transitions to Vue components</a></h4> <p><i class='bx bx-time-five' ></i> Aug 29, 2022</p> </div> </article> <article class="item"> <a href="/lib/azimgd-react-image-slider" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://github.com/azimgd/react-image-slider/raw/master/docs/slider.gif?raw=true" alt="Responsive, css transitions based image slider/gallery/carousel for react.js" /></a> <div class="info"> <h4 class="h6"><a href="/lib/azimgd-react-image-slider" >Responsive, css transitions based image slider/gallery/carousel for react.js</a></h4> <p><i class='bx bx-time-five' ></i> Apr 13, 2022</p> </div> </article> <article class="item"> <a href="/lib/wikiwi-react-css-transition" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/19619892?v=4" alt="Take Control of Your CSS Transitions" /></a> <div class="info"> <h4 class="h6"><a href="/lib/wikiwi-react-css-transition" >Take Control of Your CSS Transitions</a></h4> <p><i class='bx bx-time-five' ></i> Nov 23, 2022</p> </div> </article> <article class="item"> <a href="/lib/Stanko-react-animate-height" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/776788?v=4" alt="Lightweight React component for animating height using CSS transitions" /></a> <div class="info"> <h4 class="h6"><a href="/lib/Stanko-react-animate-height" >Lightweight React component for animating height using CSS transitions</a></h4> <p><i class='bx bx-time-five' ></i> Dec 27, 2022</p> </div> </article> <article class="item"> <a href="/lib/zurb-motion-ui" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://user-images.githubusercontent.com/9939075/40385796-108879b6-5e08-11e8-8a12-3bbe7d0bc631.png" alt="💎 The powerful Sass library for creating CSS transitions and animations" /></a> <div class="info"> <h4 class="h6"><a href="/lib/zurb-motion-ui" >💎 The powerful Sass library for creating CSS transitions and animations</a></h4> <p><i class='bx bx-time-five' ></i> Dec 21, 2022</p> </div> </article> <article class="item"> <a href="/lib/christophery-pushy" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/1683361?v=4" alt="Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions." /></a> <div class="info"> <h4 class="h6"><a href="/lib/christophery-pushy" >Pushy is a responsive off-canvas navigation menu using CSS transforms & transitions.</a></h4> <p><i class='bx bx-time-five' ></i> Dec 22, 2022</p> </div> </article> <article class="item"> <a href="/lib/foundation-motion-ui" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://user-images.githubusercontent.com/9939075/40385796-108879b6-5e08-11e8-8a12-3bbe7d0bc631.png" alt="💎 The powerful Sass library for creating CSS transitions and animations" /></a> <div class="info"> <h4 class="h6"><a href="/lib/foundation-motion-ui" >💎 The powerful Sass library for creating CSS transitions and animations</a></h4> <p><i class='bx bx-time-five' ></i> Dec 21, 2022</p> </div> </article> <article class="item"> <a href="/lib/Rich-Harris-ramjet" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://cloud.githubusercontent.com/assets/1162160/7279487/5d668dea-e8ea-11e4-9b0d-a9ba2f1165cc.gif" alt="Morph DOM elements from one state to another with smooth animations and transitions" /></a> <div class="info"> <h4 class="h6"><a href="/lib/Rich-Harris-ramjet" >Morph DOM elements from one state to another with smooth animations and transitions</a></h4> <p><i class='bx bx-time-five' ></i> Dec 21, 2022</p> </div> </article> <article class="item"> <a href="/lib/ebow-bespoke-fx" class="thumb"><img class="lazy full-image cover rounded" style="max-height: 60px;max-width: 60px" data-original="https://avatars.githubusercontent.com/u/12644?v=4" alt="CSS slide transitions for Bespoke.js" /></a> <div class="info"> <h4 class="h6"><a href="/lib/ebow-bespoke-fx" >CSS slide transitions for Bespoke.js</a></h4> <p><i class='bx bx-time-five' ></i> Feb 18, 2022</p> </div> </article> </div> </div> </div> </div> </div> </div> </div> <footer class="footer-area footer-bg"> <div class="container"> <div class="footer-top pt-50 pb-50"> <div class="row"> <div class="col-lg-12 col-sm-12"> <div class="footer-widget"> <div class="footer-logo"><a href="/"><img src="/assets/images/logo_cssrepo.png" alt="CssRepo" width="100px" height="43px"></a> <ul style="list-style: none;display: flex;" > <li> <a href="/about">About</a>   </li> <li> <a href="/contact">Contact Us</a>   </li> <li> <a href="/dmca">DMCA</a>   </li> <li> <a href="/disclaimer">Disclaimer</a>   </li> <li> <a href="/privacypolicy">Privacy Policy</a>   </li> </ul> </div> <p>List of awesome CSS frameworks. </p> </div> </div> </div> </div> </div> </footer> <!-- Bootstrap core JavaScript --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha512-bnIvzh6FU75ZKxp0GXLH9bewza/OIw6dLVh9ICg0gogclmYGguQJWl8U30WpbsGTqbIiAwxTsbe76DErLq5EDQ==" crossorigin="anonymous"></script>--> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.bundle.min.js" integrity="sha512-Oy5BruJdE3gP9+LMJ11kC5nErkh3p4Y0GawT1Jrcez4RTDxODf3M/KP3pEsgeOYxWejqy2SPnj+QMpgtvhDciQ==" crossorigin="anonymous"></script> <!-- Custom --> <script src="/assets/csstem/js/meanmenu.js"></script> <script src="/assets/csstem/js/custom.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></script> <script> $(function() { $("img.lazy").lazyload({ threshold :180, failurelimit :20, effect : "fadeIn" }); }); </script> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.5.0/highlight.min.js"></script> <script> hljs.initHighlightingOnLoad(); </script> </body> </html><script defer src="https://static.cloudflareinsights.com/beacon.min.js/v84a3a4012de94ce1a686ba8c167c359c1696973893317" integrity="sha512-euoFGowhlaLqXsPWQ48qSkBSCFs3DPRyiwVu3FjR96cMPx+Fr+gpWRhIafcHwqwCqWS42RZhIudOvEI+Ckf6MA==" data-cf-beacon='{"rayId":"8314e27d5eb50815","version":"2023.10.0","r":1,"token":"c8adddad9fc144468018da94b4c1db86","b":1}' crossorigin="anonymous"></script>