I'm pretty new to client side scripting and I'm still learning.
I've written this JS plugin which animates blocks of HTML (fade-in from left/top/right/bottom) as you scroll down the page.
Everything seems to be works correctly, but was just wondering if there is anyone who could suggest how I can improve on this?
e.g:
- Reduce the size of the code.
- Structure the plugin better.
- Stop repetitive code.
- Increase browser compatibility.
- Make better use of jQuery keywords.
Really, just doing the same thing, but, written better!
CSS:
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/css/bootstrap.css" media="all" rel="stylesheet" type="text/css">
<style type="text/css">
body {
height: 100%;
overflow-x: hidden;
}
.animate {
position: relative;
}
.bg-info {
padding: 10px;
text-align: center;
}
HTML:
<div class="container">
<div class="row">
<div class="col-xs-3">
<div class="animate bg-info" data-animation="left" data-distance="200" data-speed="1000" data-delay="0" data-offset="80" data-easing="easeInOutBack">Nulla vel varius dolor. In pellentesque mi ac congue pulvinar. Sed cursus tincidunt condimentum. Curabitur vel velit leo. Nulla condimentum dolor dui, nec convallis elit congue eu.</div>
</div>
<div class="col-xs-3">
<div class="animate bg-info" data-animation="top" data-distance="200" data-speed="1000" data-delay="500" data-offset="80" data-easing="easeInOutBack">Nulla vel varius dolor. In pellentesque mi ac congue pulvinar. Sed cursus tincidunt condimentum. Curabitur vel velit leo. Nulla condimentum dolor dui, nec convallis elit congue eu.</div>
</div>
<div class="col-xs-3">
<div class="animate bg-info" data-animation="bottom" data-distance="200" data-speed="1000" data-delay="1000" data-offset="80" data-easing="easeInOutBack">Nulla vel varius dolor. In pellentesque mi ac congue pulvinar. Sed cursus tincidunt condimentum. Curabitur vel velit leo. Nulla condimentum dolor dui, nec convallis elit congue eu.</div>
</div>
<div class="col-xs-3">
<div class="animate bg-info" data-animation="right" data-distance="200" data-speed="1000" data-delay="1500" data-offset="80" data-easing="easeInOutBack">Nulla vel varius dolor. In pellentesque mi ac congue pulvinar. Sed cursus tincidunt condimentum. Curabitur vel velit leo. Nulla condimentum dolor dui, nec convallis elit congue eu.</div>
</div>
</div>
JavaScript:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js"></script>
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.4/jquery-ui.js" ></script>
<script type="text/javascript">
(function ($) {
$.fn.animateSliders = function(options) {
var style = { opacity: "0", "-ms-opacity": "0" };
var settings = $.extend({
offset: 80,
distance : 200,
animation: "left",
easing: "easeInOutBack",
speed: 1000,
delay: 0
}, options);
$(".animate").each(function () {
loadvalues($(this));
if (settings.animation == 'left') {
$(this).css({ left: -settings.distance + 'px' }).css(style);
}
if (settings.animation == 'top') {
$(this).css({ top: -settings.distance + 'px' }).css(style);
}
if (settings.animation == 'right') {
$(this).css({ right: -settings.distance + 'px' }).css(style);
}
if (settings.animation == 'bottom') {
$(this).css({ bottom: -settings.distance + 'px' }).css(style);
}
});
$(window).on("scroll load", function() {
$(".animate").each(function () {
loadvalues($(this));
var i = parseFloat(settings.offset) / 100;
var trigger = $(window).height() * i + $(window).scrollTop();
var position = $(this).offset().top;
if (settings.animation == 'bottom') {
position = position - settings.distance;
}
if (settings.animation == 'top') {
position = position + settings.distance;
}
if (position < trigger) {
if (settings.animation == 'left') {
$(this).delay(settings.delay).animate({ 'left': '0px', opacity: 1 }, settings.speed, settings.easing);
}
if (settings.animation == 'top') {
$(this).delay(settings.delay).animate({ 'top': '0px', opacity: 1 }, settings.speed, settings.easing);
}
if (settings.animation == 'right') {
$(this).delay(settings.delay).animate({ 'right': '0px', opacity: 1 }, settings.speed, settings.easing);
}
if (settings.animation == 'bottom') {
$(this).delay(settings.delay).animate({ 'bottom': '0px', opacity: 1 }, settings.speed, settings.easing);
}
};
});
});
function loadvalues(obj) {
if (obj.attr('data-animation')) {
settings.animation = obj.data("animation");
};
if (obj.attr('data-offset')) {
settings.offset = obj.data("offset");
};
if (obj.attr('data-distance')) {
settings.distance = obj.data("distance");
};
if (obj.attr('data-easing')) {
settings.easing = obj.data("easing");
};
if (obj.attr('data-speed')) {
settings.speed = obj.data("speed");
};
if (obj.attr('data-delay')) {
settings.delay = obj.data("delay");
};
}
};
}(jQuery));
$(document).ready(function () {
$.fn.animateSliders({offset : 200});
});
</script>