/* * jQuery.stickyPanel * ---------------------- * version: 1.4.1 * date: 7/21/11 * * Copyright (c) 2011 Donny Velazquez * http://donnyvblog.blogspot.com/ * http://code.google.com/p/sticky-panel/ * * Licensed under the Apache License 2.0 * */ (function ($) { $.fn.stickyPanel = function (options) { var options = $.extend({}, $.fn.stickyPanel.defaults, options); return this.each(function () { $(window).bind("scroll.stickyPanel", { selected: $(this), options: options }, Scroll); }); }; function Scroll(event) { var node = event.data.selected; var o = event.data.options; var isMobile = navigator.userAgent.toLowerCase().indexOf('mobile') > 0; var windowHeight = $(window).height(); var nodeHeight = node.outerHeight(true); var scrollTop = $(document).scrollTop(); // when top of window reaches the top of the panel detach if (!isMobile && scrollTop <= $(document).height() - windowHeight && // Fix for rubberband scrolling in Safari on Lion scrollTop > node.offset().top - o.topPadding) { // topPadding var newNodeTop = 0; if (o.topPadding != "undefined") { newNodeTop = newNodeTop + o.topPadding; } // get left before adding spacer var nodeLeft = node.offset().left; // save panels top node.data("PanelsTop", node.offset().top - newNodeTop); // MOVED: savePanelSpace before afterDetachCSSClass to handle afterDetachCSSClass changing size of node // savePanelSpace if (o.savePanelSpace == true) { var nodeWidth = node.outerWidth(true); var nodeCssfloat = node.css("float"); var nodeCssdisplay = node.css("display"); var randomNum = Math.ceil(Math.random() * 9999); /* Pick random number between 1 and 9999 */ node.data("PanelSpaceID", "stickyPanelSpace" + randomNum); node.before("
 
"); } // afterDetachCSSClass if (o.afterDetachCSSClass != "") { node.addClass(o.afterDetachCSSClass); } // save inline css node.data("Original_Inline_CSS", (!node.attr("style") ? "" : node.attr("style"))); // detach panel node.css({ "margin": 0, "left": nodeLeft, "top": newNodeTop, "position": "fixed" }); } // ADDED: css top check to avoid continuous reattachment if (scrollTop <= node.data("PanelsTop") && node.css("top") != "auto") { if (o.savePanelSpace == true) { $("#" + node.data("PanelSpaceID")).remove(); } // attach panel node.attr("style", node.data("Original_Inline_CSS")); if (o.afterDetachCSSClass != "") { node.removeClass(o.afterDetachCSSClass); } } }; $.fn.stickyPanel.defaults = { topPadding: 0, // Use this to set the top margin of the detached panel. afterDetachCSSClass: "", // This class is applied when the panel detaches. savePanelSpace: false // When set to true the space where the panel was is kept open. }; })(jQuery);