From 364d225b1ac32f94a41737adf46a0018feada996 Mon Sep 17 00:00:00 2001 From: JoeQuery Date: Sun, 2 Jan 2011 03:25:09 -0600 Subject: [PATCH] First commit --- .gitignore | 6 + GetSet.js | 152 +++++++++++++++++++++++ StickScroller.zip | Bin 0 -> 8576 bytes StickyScroller.js | 277 ++++++++++++++++++++++++++++++++++++++++++ StickyScroller.min.js | 6 + demo.css | 41 +++++++ demo.php | 68 +++++++++++ demo2.css | 49 ++++++++ demo2.php | 71 +++++++++++ diagram.jpg | Bin 0 -> 27181 bytes readme.txt | 24 ++++ 11 files changed, 694 insertions(+) create mode 100644 .gitignore create mode 100644 GetSet.js create mode 100644 StickScroller.zip create mode 100644 StickyScroller.js create mode 100644 StickyScroller.min.js create mode 100644 demo.css create mode 100644 demo.php create mode 100644 demo2.css create mode 100644 demo2.php create mode 100644 diagram.jpg create mode 100644 readme.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee630a0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +#Ignore komodo project files +.komodotools +stickyscroller.komodoproject +diagram.psd +easing.js +nonweb/ diff --git a/GetSet.js b/GetSet.js new file mode 100644 index 0000000..400cf5c --- /dev/null +++ b/GetSet.js @@ -0,0 +1,152 @@ +/************************************************************/ +//Class GetSet +//Purpose: Creates dynamic getters and setters +/************************************************************/ + +var GetSet = {}; + +//=========================================================// +//Public Method override +//Purpose: Override default values through iteration +//Parameters: +// obj: The object whose default values will be overridden +//Postcondition: options Object is altered +//=========================================================// +GetSet.override = function(options, defaults) +{ + //Store this scope + var $this = options; + + + for (var i in defaults) + { + if(!($this[i])) + { + $this[i] = defaults[i]; + } + } +}; + +//=========================================================// +//Public getFunctions +//Purpose: Copies one objects functions to another +//Parameters: +// template: The object whose method will be copied +// recepient: The object receiving the template methods +//Postcondition: recepient object is altered +//=========================================================// +GetSet.getFunctions = function(template, recepient) +{ + for (var i in template) + { + if(template[i].constructor == Function) + { + recepient[i] = template[i]; + } + } +}; + + +//=========================================================// +//Public Method gettters +//Purpose: Dynamically creates accessor methods(getters) +//Parameters: +// scope: The scope in which the accessor methods will be +// applied +// prefix: Goes before the property. i.e. (get)Name +// camel: whether to induce camel case +// obj: Accessors +//Postcondition: scope has been altered to include +//accessor methods +//=========================================================// +GetSet.getters = function(options) +{ + //Over-ride default values + var defaults = + { + prefix: "get", + camel: true + }; + + //Override defaults values + GetSet.override(options, defaults); + + //If prefix is set to 'none', force blank. A blank string as a parameter + //evaluates to null for some reason. + options.prefix = (options.prefix === "none") ? "" : options.prefix; + + //Iterate through the properties of the object + var str; + for ( var i in options.obj ) + { + //If camel case is enabled and no blank prefix + if(options.camel && options.prefix != "") + { + str = i.charAt(0).toUpperCase() + i.substr(1); + } + else + { + str = i; + } + (function(i) + { + // Dynamically create an accessor method + options.scope[ options.prefix + str ] = function() + { + return options.obj[i]; + }; + })(i); + } +}; + +//=========================================================// +//Public Method setters +//Purpose: Dynamically creates muator methods(setters) +//Parameters: +// scope: The scope in which the mutator methods will be +// applied +// prefix: Goes before the property. i.e. (set)Name +// camel: whether to induce camel case +// obj: The object that will have mutators +//Postcondition: scope has been altered to include mutator +//methods +//=========================================================// +GetSet.setters = function(options) +{ + //Over-ride default values + var defaults = + { + prefix: "set", + camel: true + }; + + //Override defaults values + GetSet.override(options, defaults); + + //If prefix is set to 'none', force blank. A blank string as a parameter + //evaluates to null for some reason. + options.prefix = (options.prefix === "none") ? "" : options.prefix; + + //Iterate through the properties of the object + var str; + for ( var i in options.obj ) + { + //If camel case is enabled and no blank prefix + if(options.camel && options.prefix != "") + { + str = i.charAt(0).toUpperCase() + i.substr(1); + } + else + { + str = i; + } + (function(i) + { + // Dynamically create an accessor method + options.scope[ options.prefix + str ] = function(val) + { + options.obj[i] = val; + }; + })(i); + } +}; \ No newline at end of file diff --git a/StickScroller.zip b/StickScroller.zip new file mode 100644 index 0000000000000000000000000000000000000000..8a5d27ce3c8f13de4a5df320e6784d74c4c1385f GIT binary patch literal 8576 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 literal 0 HcmV?d00001 diff --git a/StickyScroller.js b/StickyScroller.js new file mode 100644 index 0000000..7ce61fb --- /dev/null +++ b/StickyScroller.js @@ -0,0 +1,277 @@ +/*****************************************************************************/ +// Class Scroller +// Purpose: Create a fixed scroller +// Parameters: +// obj: The object that will be scrolling +// start: What distance from the top (in px) the effect starts +// end: What distance from the top (in px) the effect ends +// interval: What scroll distance triggers the callback +// range: How many pixels after the +// margin: Margin from the top of the browser +// Dependencies: +// GetSet class. Included in Vert Library @ http://vertstudios.com/vertlib.js +/******************************************************************************/ + +function StickyScroller(obj, options) +{ + //Keep track of how many scrollers we have + if ( typeof StickyScroller.counter === 'undefined' ) + { + StickyScroller.counter = 0; + } + else + { + StickyScroller.counter++; + } + + //Store function scope + var $this = this; + + //Store initial top and left/right values + var top = $(obj).css('top'); + var left = $(obj).css('left'); + var right = $(obj).css('right'); + + var scroll = 0; + var tempScroll = 0; + + //------------------------------------------------------------ + // Set default property values + //------------------------------------------------------------ + var defaults = { + start: 0, + end: 10000, + interval: $(obj).height(), + margin: parseInt(top, 10), + range: $(obj).height() + }, settings = jQuery.extend(defaults,options); + obj = $(obj); + + settings.index = 0; + settings.oldIndex = 0; + + //Accessors for settings + GetSet.getters({scope: $this, obj: settings}); + + //------------------------------------------------------------// + // Callback Functions // + //------------------------------------------------------------// + var Callback = {}; + + Callback.newIndex = function(){}; //When the index changes + Callback.limbo = function(){}; //When scroller not in range + Callback.scroll = function(){}; //On window scroll + + //Get setters for Callback functions + GetSet.setters({scope: this, prefix: "on", obj: Callback}); + + //=========================================================// + //Public distanceFrom + //Purpose: Determines the distance in pixels between + // the scroller and an index + //Parameters: + // index: The index whose distance from scroller will be calculated + //Postcondition: Returns an integer + //=========================================================// + this.distanceFrom = function(index) + { + //Check for both references: "Top" of the range and "bottom" + var top = index*settings.interval + settings.start + var bottom = index*settings.interval + settings.range + settings.start + + var distanceFromTop = Math.abs(scroll-top); + var distanceFromBottom = Math.abs(scroll-bottom); + + //Return the smallest distance + if(distanceFromTop < distanceFromBottom) + { + return distanceFromTop; + } + else + { + return distanceFromBottom; + } + }; + + //=========================================================// + //Public closestIndex + //Purpose: Determines the closest index + //Postcondition: Returns the closest index as an integer + //=========================================================// + this.closestIndex = function() + { + //If index is 0, automatically return 1 + if(settings.index === 0) + { + return 1; + } + + //Distance from next/previous index + var dPrev = this.distanceFrom(settings.index-1); + var dNext = this.distanceFrom(settings.index+1); + + //Return the index associated with the smallest distance + if(dPrev <= dNext) + { + return settings.index-1; + } + else + { + return settings.index+1; + } + }; + + //=========================================================// + //Private getIndex + //Purpose: returns index + //=========================================================// + var getIndex = function() + { + //Make sure movement would be in the bounds + if(scroll > settings.start && scroll < settings.end) + { + //Possible new index + tempIndex = Math.floor((scroll-settings.start)/settings.interval); + + //Make sure the index is different before reassigning + //or executing the callback + if(tempIndex !== settings.index) + { + //Store old index + settings.oldIndex = settings.index; + + //Assign new index + settings.index = tempIndex; + } + } + //If scroll goes beyond end mark, set distance at end mark + else if(scroll >= settings.end) + { + settings.oldIndex = settings.index; + settings.index = Math.floor((settings.end-settings.start)/settings.interval); + } + //If scroll goes beyond beginning mark, set distance at start + else + { + settings.oldIndex = settings.index; + settings.index = 0; + } + }; + + //=========================================================// + //Public firstIndex + //Purpose: Returns first index + //Postcondition: Returns an integer + //=========================================================// + this.firstIndex = function() + { + return 0; + }; + + //=========================================================// + //Public lastIndex + //Purpose: Returns last index + //Postcondition: Returns an integer + //=========================================================// + this.lastIndex = function() + { + return Math.floor((settings.end-settings.start+settings.margin)/settings.interval); + }; + + //=========================================================// + //Public inRange + //Purpose: Determines if the scroller is in interval range + //Postcondition: Returns boolean + //=========================================================// + this.inRange = function() + { + var upperbound = settings.index * settings.interval + settings.start; + var lowerbound = settings.index * settings.interval + settings.start + settings.range; + var inRange = (scroll >= upperbound ) && (scroll <= lowerbound); + return inRange; + }; + + + //------------------------------------------------------------// + // On Browser Scroll // + //------------------------------------------------------------// + var wrap = $('
').css( + { + width: obj.width(), + height: obj.height(), + position: "absolute", + top: top, + left: left, + right: right + }); + + obj.wrap(wrap); + + $(window).scroll(function() + { + scroll = $(window).scrollTop(); + + //Get the current index + getIndex(); + + //If scroll less than beginning, set back to beginning + if(scroll < settings.start) + { + $(obj).css({ + position : 'absolute', + top: 0, + left: 0, + right: 0}); + + $("#scrollcontainer"+ StickyScroller.counter).css({ + position : 'absolute', + top: settings.start+settings.margin, + left: left, + right: right}); + } + + //If scroll greater than ending position, set to end + else if(scroll > settings.end) + { + $(obj).css({ + position : 'absolute', + top: 0, + left: 0, + right: 0}); + + $("#scrollcontainer"+ StickyScroller.counter).css({ + position : 'absolute', + top: settings.end+settings.margin, + left: left, + right: right}); + + } + + //Make sure we stay in the specified boundaries + else + { + //Put back to fixed + $(obj).css({ + position : 'fixed', + top: settings.margin, + left: left, + right: right}); + } + + //If in the specified range and a new index, do the callback + if(settings.oldIndex !== settings.index) + { + Callback.newIndex(settings.index); + } + + //Do the "limbo" call back, which is a callback that executes when + //the scroller is not in the range, but still between start and end + if( !$this.inRange() && scroll > settings.start && scroll < settings.end ) + { + Callback.limbo(settings.index); + } + + //Do the scroll callback regardless of what happens + Callback.scroll(settings.index); + }); +} \ No newline at end of file diff --git a/StickyScroller.min.js b/StickyScroller.min.js new file mode 100644 index 0000000..31f65fc --- /dev/null +++ b/StickyScroller.min.js @@ -0,0 +1,6 @@ +/************************************************************/ +// Class StickyScroller +// Purpose: Create a fixed scroller +/************************************************************/ + +function StickyScroller(f,g){if(typeof StickyScroller.counter==='undefined'){StickyScroller.counter=0;}else{StickyScroller.counter++;}var h=this;var i=$(f).css('top');var j=$(f).css('left');var k=$(f).css('right');var l=0;var m=0;var n={start:0,end:10000,interval:$(f).height(),margin:parseInt(i,10),range:$(f).height()},settings=jQuery.extend(n,g);f=$(f);settings.index=0;settings.oldIndex=0;GetSet.getters({scope:h,obj:settings});var o={};o.newIndex=function(){};o.limbo=function(){};o.scroll=function(){};GetSet.setters({scope:this,prefix:"on",obj:o});this.distanceFrom=function(a){var b=a*settings.interval+settings.start;var c=a*settings.interval+settings.range+settings.start;var d=Math.abs(l-b);var e=Math.abs(l-c);if(dsettings.start&&l=settings.end){settings.oldIndex=settings.index;settings.index=Math.floor((settings.end-settings.start)/settings.interval);}else{settings.oldIndex=settings.index;settings.index=0;}};this.firstIndex=function(){return 0;};this.lastIndex=function(){return Math.floor((settings.end-settings.start+settings.margin)/settings.interval);};this.inRange=function(){var a=settings.index*settings.interval+settings.start;var b=settings.index*settings.interval+settings.start+settings.range;var c=(l>=a)&&(l<=b);return c;};var q=$('
').css({width:f.width(),height:f.height(),position:"absolute",top:i,left:j,right:k});f.wrap(q);$(window).scroll(function(){l=$(window).scrollTop();p();if(lsettings.end){$(f).css({position:'absolute',top:0,left:0,right:0});$("#scrollcontainer"+StickyScroller.counter).css({position:'absolute',top:settings.end+settings.margin,left:j,right:k});}else{$(f).css({position:'fixed',top:settings.margin,left:j,right:k});}if(settings.oldIndex!==settings.index){o.newIndex(settings.index);}if(!h.inRange()&&l>settings.start&&l + + + Sticky Scroller + + + + + + + + + + + +
+
Index 0
+
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/demo2.css b/demo2.css new file mode 100644 index 0000000..d175531 --- /dev/null +++ b/demo2.css @@ -0,0 +1,49 @@ +#main{ +margin-top: 0px; +margin-left: 30px; +} + #scrollbox{ + position: fixed; + top: 100px; + left: 50px; + width: 100px; + background-color: #FF0000; + height: 100px; + } + + #code{ + position: fixed; + top: 85px; + left: 400px; + width: 400px; + height: 200px; + } + + #blocks{ + margin-top: 100px; + } + + .block{ + margin: 0px 0px 100px 130px; + height: 200px; + width: 200px; + background-color: #000000; + } + + #blankspace{ + height: 1000px; + } + + .blue{ + background-color: #000099; + } + + #info{ + position: absolute; + top: 0px; + left: 250px; + } + + .blue{ + background-color: #000099; + } \ No newline at end of file diff --git a/demo2.php b/demo2.php new file mode 100644 index 0000000..2bb7cb5 --- /dev/null +++ b/demo2.php @@ -0,0 +1,71 @@ + + + + Sticky Scroller + + + + + + + + + + + +
+
Index 0
+
+        var options = {
+            start: 0,
+            end: 1200,
+            interval: 300
+        }
+        var scroller = new StickyScroller("#scrollbox", options);
+        var code = new StickyScroller("#code", options);
+                        
+        scroller.onNewIndex(function(index)
+        {
+            $("#scrollbox").html("Index " + index);
+        });
+        
+ +
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/diagram.jpg b/diagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd44cb09914ead53a47d5c7907c9894a3745952b GIT binary patch literal 27181 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�jP{}H@U+$la13O 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 literal 0 HcmV?d00001 diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..0976955 --- /dev/null +++ b/readme.txt @@ -0,0 +1,24 @@ +//------------------------------------------ +// jQuery Sticky Scroller +//------------------------------------------ + +Example call: +var scroller = new StickyScroller("#scrollbox", +{ + start: 300, + end: 1800, + interval: 300, + range: 100, + margin: 100 +}); + +Property descriptions. +start: At what vertical position of the scrollbar the object will actually begin scrolling (in pixels) +end: At what vertical position of the scrollbar the object will stop scrolling (in pixels) +margin: How many pixels below the browser window the object will be fixed while scrolling (in pixels) +interval: The length of each index (in pixels) +range: Length of a range of pixels starting at the top of interval. Convenient for callbacks. + +To see full documentation, head over to +http://www.vertstudios.com/blog/jquery-sticky-scroller-position-fixed-plugin/ +