floatingAd.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * Description: 漂浮广告
  3. * Author: jjc
  4. * Date: 2012.07.04
  5. */
  6. ;(function ( $, window, document, undefined ) {
  7. var pluginName = 'floatingAd';
  8. var defaults = {
  9. step: 1,
  10. delay: 50,
  11. isLinkClosed: false,
  12. onClose: function(elem){}
  13. };
  14. var ads = {
  15. linkUrl: '#',
  16. 'z-index': '100',
  17. 'closed-icon': '',
  18. imgHeight: '',
  19. imgWidth: '',
  20. title: '',
  21. img: '#',
  22. linkWindow: '_blank',
  23. headFilter: 0.2
  24. };
  25. function Plugin(element, options) {
  26. this.element = element;
  27. this.options = $.extend(
  28. {},
  29. defaults,
  30. options,
  31. {
  32. width: $(window).width(),
  33. height: $(window).height(),
  34. xPos: this.getRandomNum(0, $(window).width() - $(element).innerWidth()),
  35. yPos: this.getRandomNum(0, 300),
  36. yOn: this.getRandomNum(0, 1),
  37. xOn: this.getRandomNum(0, 1),
  38. yPath: this.getRandomNum(0, 1),
  39. xPath: this.getRandomNum(0, 1),
  40. hOffset: $(element).innerHeight(),
  41. wOffset: $(element).innerWidth(),
  42. fn: function(){},
  43. interval: 0
  44. }
  45. );
  46. this._defaults = defaults;
  47. this._name = pluginName;
  48. this.init();
  49. }
  50. Plugin.prototype = {
  51. init: function () {
  52. var elem = $(this.element);
  53. var defaults = this.options;
  54. var p = this;
  55. var xFlag = 0;
  56. var yFlag = 0;
  57. elem.css({"left": defaults.xPos + p.scrollX(), "top": defaults.yPos + p.scrollY()});
  58. defaults.fn = function(){
  59. defaults.width = $(window).width();
  60. defaults.height = $(window).height();
  61. if(xFlag == p.scrollX() && yFlag == p.scrollY()){
  62. elem.css({"left": defaults.xPos + p.scrollX(), "top": defaults.yPos + p.scrollY()});
  63. if (defaults.yOn)
  64. defaults.yPos = defaults.yPos + defaults.step;
  65. else
  66. defaults.yPos = defaults.yPos - defaults.step;
  67. if (defaults.yPos <= 0) {
  68. defaults.yOn = 1;
  69. defaults.yPos = 0;
  70. }
  71. if (defaults.yPos >= (defaults.height - defaults.hOffset)) {
  72. defaults.yOn = 0;
  73. defaults.yPos = (defaults.height - defaults.hOffset);
  74. }
  75. if (defaults.xOn)
  76. defaults.xPos = defaults.xPos + defaults.step;
  77. else
  78. defaults.xPos = defaults.xPos - defaults.step;
  79. if (defaults.xPos <= 0) {
  80. defaults.xOn = 1;
  81. defaults.xPos = 0;
  82. }
  83. if (defaults.xPos >= (defaults.width - defaults.wOffset)) {
  84. defaults.xOn = 0;
  85. defaults.xPos = (defaults.width - defaults.wOffset);
  86. }
  87. }
  88. yFlag = $(window).scrollTop();
  89. xFlag = $(window).scrollLeft();
  90. };
  91. this.run(elem, defaults);
  92. },
  93. run: function(elem, defaults){
  94. this.start(elem, defaults);
  95. this.adEvent(elem,defaults);
  96. },
  97. start: function(elem, defaults){
  98. elem.find('div.close').hide();
  99. defaults.interval = window.setInterval(defaults.fn, defaults.delay);
  100. window.setTimeout(function(){elem.show();}, defaults.delay);
  101. },
  102. getRandomNum: function (Min, Max){
  103. var Range = Max - Min;
  104. var Rand = Math.random();
  105. return(Min + Math.round(Rand * Range));
  106. },
  107. getPath: function(on){
  108. return on ? 0 : 1;
  109. },
  110. clear: function(elem, defaults){
  111. elem.find('div.close').show();
  112. window.clearInterval(defaults.interval);
  113. },
  114. close: function(elem, defaults, isClose){
  115. //elem.unbind('hover');
  116. elem.unbind("mouseenter mouseleave");
  117. elem.hide();
  118. if(isClose)
  119. defaults.onClose.call(elem);
  120. },
  121. adEvent: function(elem, defaults){
  122. var obj = {
  123. elem: this,
  124. fn_close: function() {
  125. this.elem.close(elem, defaults, true);
  126. },
  127. fn_clear: function() {
  128. if(this.elem.options.isLinkClosed)
  129. this.elem.close(elem, defaults, false);
  130. }
  131. };
  132. elem.find('div.button').bind('click', jQuery.proxy(obj, "fn_close"));
  133. elem.find('a').bind('click', jQuery.proxy(obj, "fn_clear"));
  134. var stop = {
  135. elem: this,
  136. over: function(){
  137. this.elem.clear(elem, defaults);
  138. },
  139. out: function(){
  140. this.elem.start(elem, defaults);
  141. }
  142. };
  143. elem.bind("mouseenter", jQuery.proxy(stop, "over"));
  144. elem.bind("mouseleave", jQuery.proxy(stop, "out"));
  145. /*
  146. elem.hover(
  147. jQuery.proxy(stop, "over"),
  148. jQuery.proxy(stop, "out")
  149. );
  150. */
  151. },
  152. scrollX: function(){
  153. var de = document.documentElement;
  154. return self.pageXOffset || (de && de.scrollLeft) || document.body.scrollLeft;
  155. },
  156. scrollY: function(){
  157. var de = document.documentElement;
  158. return self.pageYOffset || (de && de.scrollTop) || document.body.scrollTop;
  159. }
  160. };
  161. $.fn.floatingAd = function(options) {
  162. return this.children("div").each(function (i, elem) {
  163. if (!$.data(this, 'plugin_' + pluginName)) {
  164. $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
  165. }
  166. });
  167. };
  168. $.floatingAd = function(options){
  169. if(options){
  170. if(options.ad){
  171. var adDiv = $('#' + pluginName);
  172. if(adDiv.length <= 0)
  173. adDiv = $('<div>', {
  174. 'id': pluginName,
  175. 'class': pluginName
  176. }).appendTo('body');
  177. for(var i in options.ad){
  178. var ad = options.ad[i];
  179. ad = $.extend({}, ads, ad);
  180. //漂浮层
  181. var div = $('<div>', {
  182. 'class': 'ad'
  183. });
  184. div.css("z-index", ad['z-index']);
  185. //关闭层
  186. var closeDiv = $('<div>', {
  187. 'class': 'close'
  188. });
  189. $('<div>', {
  190. 'class': 'opacity',
  191. 'style': 'opacity: ' + ad.headFilter + ';filter: alpha(opacity = ' + ad.headFilter*100 + ');'
  192. }).appendTo(closeDiv);
  193. $('<div>', {
  194. 'class': 'text'
  195. }).append(
  196. $('<div>', {
  197. 'class': 'title',
  198. 'text': ad.title
  199. })
  200. ).append(
  201. $('<div>', {
  202. 'class': 'button',
  203. 'style': ad['closed-icon'] ? 'background:url("' + ad['closed-icon'] + '") no-repeat;' : ''
  204. })
  205. ).appendTo(closeDiv);
  206. closeDiv.appendTo(div);
  207. //内容层
  208. var content = $('<div>');
  209. $('<a>', {
  210. href: ad.linkUrl,
  211. target: ad.linkWindow,
  212. title: ad.title
  213. }).append(
  214. $('<img>', {
  215. 'src': ad.img,
  216. 'style': (ad.imgHeight ? 'height:' + ad.imgHeight + 'px;' : '') +
  217. (ad.imgWidth ? 'width:' + ad.imgWidth + 'px;' : '')
  218. })
  219. ).appendTo(content);
  220. content.appendTo(div);
  221. div.appendTo(adDiv);
  222. }
  223. delete options.ad;
  224. $('#' + pluginName).floatingAd(options);
  225. }
  226. }
  227. else
  228. $.error('漂浮广告错误!');
  229. };
  230. })(jQuery, window, document);