You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

446 lines
19 KiB

  1. (function ($) {
  2. $.fn.extend({
  3. vinnyFollow: function (options) {
  4. var defaults = {
  5. wrapper: 1260,
  6. class: 'vinny-line',
  7. zindex: 20,
  8. width: 1,
  9. lineWidth: 2,
  10. color: '#ffffff',
  11. alignClass: null,
  12. maxHeight: 200,
  13. flowColor: '#5cff00',
  14. flowTop: 230,
  15. responsiveOffset: 50
  16. };
  17. options = $.extend(defaults, options);
  18. var vinnyFollow = $(this);
  19. var lineContinueX = null;
  20. var winWidth = $(window).width();
  21. // RESET LINES FOR WINDOW RESIZE
  22. var reset = function () {
  23. lineContinueX = null;
  24. winWidth = $(window).width();
  25. };
  26. // CREATE LINES
  27. var init = function () {
  28. vinnyFollow.each(function () {
  29. // INIT VARS
  30. var element = $(this);
  31. var color = options.color;
  32. var offsetTop = 0;
  33. var offsetLeft = 'auto';
  34. var offsetBottom = 0;
  35. var offsetRight = 'auto';
  36. var angle = 0;
  37. var origin = '0 0';
  38. var offsetBottom2 = 0;
  39. var angle2 = 0;
  40. var line2 = false;
  41. var followOn = false;
  42. var horizontal = false;
  43. var horizontalTop = 0;
  44. var horizOffsetRight = 'auto';
  45. var offsetBottom3 = 0;
  46. var angle3 = 0;
  47. var line3 = false;
  48. var diagLeft = false;
  49. var responsive = false;
  50. // UPDATE VARS WITH DATA ELEMENTS
  51. if (element.data('offset-top') != undefined) {
  52. offsetTop = parseInt(element.data('offset-top'));
  53. }
  54. if (element.data('offset-left') != undefined) {
  55. offsetLeft = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('offset-left')) + 'px)';
  56. if (winWidth <= 550) {
  57. offsetLeft = '-' + parseInt(element.data('offset-left')) * 4 + 'px';
  58. }
  59. }
  60. if (element.data('offset-bottom') != undefined) {
  61. offsetBottom = parseInt(element.data('offset-bottom'));
  62. }
  63. if (element.data('offset-right') != undefined) {
  64. offsetRight = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('offset-right')) + 'px)';
  65. }
  66. if (element.data('angle') != undefined) {
  67. angle = parseInt(element.data('angle'));
  68. }
  69. if (element.data('origin') === 'bottom') {
  70. origin = '0 100%';
  71. }
  72. if (element.data('color') != undefined) {
  73. color = element.data('color');
  74. }
  75. if (element.data('follow-on') != undefined) {
  76. followOn = element.data('follow-on');
  77. }
  78. if (element.data('2-line') != undefined) {
  79. line2 = element.data('2-line');
  80. }
  81. if (element.data('follow-on') != undefined) {
  82. offsetRight = lineContinueX;
  83. }
  84. if (element.data('horizontal') != undefined) {
  85. horizontal = true;
  86. }
  87. if (element.data('horizontal-top') != undefined) {
  88. horizontalTop = parseInt(element.data('horizontal-top'));
  89. if (winWidth <= 767) {
  90. horizontalTop = options.responsiveOffset;
  91. }
  92. offsetBottom = 'calc(100% - ' + horizontalTop + 'px)';
  93. }
  94. if (element.data('horizontal-offsetx') != undefined) {
  95. horizOffsetRight = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('horizontal-offsetx')) + 'px)'
  96. }
  97. if (element.data('3-line') != undefined) {
  98. line3 = element.data('3-line');
  99. }
  100. if (element.data('diag-left-follow') != undefined) {
  101. diagLeft = true;
  102. }
  103. if (element.data('responsive') != undefined) {
  104. responsive = true;
  105. }
  106. // CREATE LINE 1
  107. var html = '<div class="' + options.class + '"></div>';
  108. if (!$(this).find('.' + options.class).length) {
  109. $(this).append(html)
  110. }
  111. $(this).find('.' + options.class + ':not(.line-horiz)').css({
  112. 'width': options.lineWidth + 'px',
  113. 'position': 'absolute',
  114. 'z-index': options.zindex,
  115. 'top': offsetTop,
  116. 'left': offsetLeft,
  117. 'bottom': offsetBottom,
  118. 'right': offsetRight,
  119. '-webkit-transform': 'skewX(' + angle + 'deg)',
  120. '-moz-transform': 'skewX(' + angle + 'deg)',
  121. '-ms-transform': 'skewX(' + angle + 'deg)',
  122. '-o-transform': 'skewX(' + angle + 'deg)',
  123. 'transform': 'skewX(' + angle + 'deg)',
  124. '-webkit-transform-origin': origin,
  125. '-moz-transform-origin': origin,
  126. '-ms-transform-origin': origin,
  127. '-o-transform-origin': origin,
  128. 'transform-origin': origin,
  129. 'overflow': 'hidden'
  130. });
  131. if (angle != 0) {
  132. $(this).find('.' + options.class + ':not(.line-horiz)').attr('skewed', '1');
  133. }
  134. // ALIGNMENT FOR ELEMENTS UNDERNEATH
  135. if (options.alignClass != null && element.data('align-offset')) {
  136. var alignOffset = parseInt(element.data('align-offset'));
  137. if (winWidth <= 1250) {
  138. alignOffset = 20;
  139. }
  140. var vinnyLine = element.find('.' + options.class);
  141. var posRight = (winWidth - (vinnyLine.offset().left + vinnyLine.height())) - ((winWidth - options.wrapper) / 2);
  142. element.find(options.alignClass).css({
  143. 'width': 'calc(((100vw - ' + options.wrapper + 'px) / 2) - ' + alignOffset + 'px + ' + posRight + 'px)'
  144. })
  145. }
  146. // CREATE HORIZONTAL LINE
  147. if (horizontal === true) {
  148. var lastElem = $(element).find('.' + options.class + ':last-child');
  149. var horizontalStart = (lastElem.offset().left + lastElem.height());
  150. var horizontalOffsetLeft = 'calc(' + horizontalStart + 'px + ' + ((options.lineWidth / 2)) + 'px)';
  151. horizOffsetRight = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('horizontal-offsetx')) + 'px + ' + ((options.lineWidth / 2)) + 'px)';
  152. var html = '<div class="' + options.class + ' line-horiz"></div>';
  153. if (!$(this).find('.line-horiz.' + options.class).length) {
  154. $(this).append(html)
  155. }
  156. offsetBottom = 'calc(100% - ' + horizontalTop + 'px - ' + ((options.lineWidth / 2)) + 'px)';
  157. $(this).find('.line-horiz.' + options.class).css({
  158. 'height': options.lineWidth + 'px',
  159. 'position': 'absolute',
  160. 'z-index': options.zindex,
  161. 'right': horizOffsetRight,
  162. 'bottom': offsetBottom,
  163. 'left': horizontalOffsetLeft,
  164. 'overflow': 'hidden'
  165. });
  166. }
  167. // CREATE LINE 2
  168. if (line2 === true) {
  169. if (element.data('2-offset-bottom') != undefined) {
  170. offsetBottom2 = element.data('2-offset-bottom');
  171. offsetTop = 'calc(100% - ' + offsetBottom + 'px)'
  172. }
  173. if (element.data('2-offset-right') != undefined) {
  174. offsetRight = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('2-offset-right')) + 'px)';
  175. }
  176. if (element.data('2-offset-top') != undefined) {
  177. offsetTop = element.data('2-offset-top');
  178. }
  179. if (element.data('2-angle') != undefined) {
  180. angle2 = element.data('2-angle');
  181. }
  182. var html = '<div class="' + options.class + ' line-2"></div>';
  183. if (!$(this).find('.line-2.' + options.class).length) {
  184. $(this).append(html)
  185. }
  186. $(this).find('.line-2.' + options.class).css({
  187. 'width': options.lineWidth + 'px',
  188. 'position': 'absolute',
  189. 'z-index': options.zindex,
  190. 'top': offsetTop,
  191. 'left': offsetLeft,
  192. 'bottom': offsetBottom2,
  193. 'right': offsetRight,
  194. '-webkit-transform': 'skewX(' + angle2 + 'deg)',
  195. '-moz-transform': 'skewX(' + angle2 + 'deg)',
  196. '-ms-transform': 'skewX(' + angle2 + 'deg)',
  197. '-o-transform': 'skewX(' + angle2 + 'deg)',
  198. 'transform': 'skewX(' + angle2 + 'deg)',
  199. '-webkit-transform-origin': '0 0',
  200. '-moz-transform-origin': '0 0',
  201. '-ms-transform-origin': '0 0',
  202. '-o-transform-origin': '0 0',
  203. 'transform-origin': '0 0',
  204. 'overflow': 'hidden'
  205. });
  206. if (angle2 != 0) {
  207. $(this).find('.line-2.' + options.class).attr('skewed', '1');
  208. }
  209. }
  210. if (followOn === true) {
  211. var lastElem = $(element).find('.' + options.class + ':last-child');
  212. lineContinueX = (winWidth - (lastElem.offset().left + lastElem.height()) - options.lineWidth)
  213. }
  214. // CREATE LINE 3
  215. if (line3 === true) {
  216. if (element.data('3-offset-bottom') != undefined) {
  217. offsetBottom3 = element.data('3-offset-bottom');
  218. offsetTop = 'calc(100% - ' + offsetBottom2 + 'px)'
  219. }
  220. if (element.data('3-offset-right') != undefined) {
  221. offsetRight = 'calc(((100vw - ' + options.wrapper + 'px) / 2) + ' + parseInt(element.data('3-offset-right')) + 'px)';
  222. }
  223. if (element.data('3-offset-top') != undefined) {
  224. offsetTop = element.data('3-offset-top');
  225. }
  226. if (element.data('3-angle') !== undefined) {
  227. angle3 = element.data('3-angle');
  228. }
  229. var html = '<div class="' + options.class + ' line-3"></div>';
  230. if (!$(this).find('.line-3.' + options.class).length) {
  231. $(this).append(html)
  232. }
  233. $(this).find('.line-3.' + options.class).css({
  234. 'width': options.lineWidth + 'px',
  235. 'position': 'absolute',
  236. 'z-index': options.zindex,
  237. 'top': offsetTop,
  238. 'left': offsetLeft,
  239. 'bottom': offsetBottom3,
  240. 'right': offsetRight,
  241. '-webkit-transform': 'skewX(' + angle3 + 'deg)',
  242. '-moz-transform': 'skewX(' + angle3 + 'deg)',
  243. '-ms-transform': 'skewX(' + angle3 + 'deg)',
  244. '-o-transform': 'skewX(' + angle3 + 'deg)',
  245. 'transform': 'skewX(' + angle3 + 'deg)',
  246. '-webkit-transform-origin': '0 0',
  247. '-moz-transform-origin': '0 0',
  248. '-ms-transform-origin': '0 0',
  249. '-o-transform-origin': '0 0',
  250. 'transform-origin': '0 0',
  251. 'overflow': 'hidden',
  252. 'border-radius': '2px'
  253. });
  254. if (angle3 !== 0) {
  255. $(this).find('.line-3.' + options.class).attr('skewed', '1');
  256. }
  257. }
  258. // ALIGNMENT FOR DIAGONAL BACKGROUND
  259. if (diagLeft === true) {
  260. var next = element.next();
  261. var lastElem = $(element).find('.' + options.class + ':last-child');
  262. var diagOffset = (winWidth - (lastElem.offset().left + lastElem.height()) - options.lineWidth);
  263. next.find('.diag-left').css({
  264. width: diagOffset + 'px'
  265. })
  266. }
  267. })
  268. };
  269. // INIT LINES
  270. init();
  271. $(window).on('resize', function () {
  272. reset();
  273. init();
  274. });
  275. // CREATE COLOR
  276. var html = '<div class="vinnycolor"></div>';
  277. var vinnyLine = $('.vinny-line');
  278. vinnyLine.append(html);
  279. var vinnyV = $('.vinny-line:not(.line-horiz) .vinnycolor');
  280. var vinnyH = $('.line-horiz .vinnycolor');
  281. vinnyV.css({
  282. 'position': 'absolute',
  283. 'left': '0',
  284. 'right': '0',
  285. 'top': '0',
  286. 'bottom': '0',
  287. 'margin': '0 auto',
  288. 'width': options.width + 'px',
  289. 'background': options.color
  290. });
  291. vinnyH.css({
  292. 'position': 'absolute',
  293. 'left': '0',
  294. 'right': '0',
  295. 'top': '0',
  296. 'bottom': '0',
  297. 'margin': 'auto 0',
  298. 'height': options.width + 'px',
  299. 'background': options.color
  300. });
  301. $('#main-banner .vinnycolor').css('top', '1px');
  302. // CREATE FLOW
  303. var html = '<div class="vinnyflow"></div>';
  304. vinnyLine.append(html);
  305. var vinnyFlow = $('.vinny-line:not(.line-horiz) .vinnyflow');
  306. var vinnyHoriz = $('.line-horiz .vinnyflow');
  307. var distanceOffset = 0;
  308. vinnyLine.each(function () {
  309. if ($(this).closest('.vinnyfollow').data('offset-reset') !== undefined) {
  310. distanceOffset = 0;
  311. }
  312. $(this).find('.vinnyflow').attr('data-distance-offset', distanceOffset);
  313. if ($(this).hasClass('line-horiz')) {
  314. distanceOffset += 200;
  315. }
  316. });
  317. var skewWidth;
  318. vinnyLine.each(function () {
  319. var element = $(this);
  320. if (element.attr('skewed') === 1) {
  321. skewWidth = options.lineWidth / 2;
  322. } else {
  323. skewWidth = options.lineWidth / 4;
  324. }
  325. if (!element.hasClass('line-horiz')) {
  326. element.find('.vinnyflow').css({
  327. 'width': skewWidth + 'px',
  328. 'border': skewWidth + 'px solid ' + options.flowColor,
  329. });
  330. } else {
  331. element.find('.vinnyflow').css({
  332. 'height': skewWidth + 'px',
  333. 'border': skewWidth + 'px solid ' + options.flowColor,
  334. });
  335. }
  336. });
  337. vinnyFlow.css({
  338. 'position': 'absolute',
  339. 'left': '0',
  340. 'right': '0',
  341. 'margin': '0 auto',
  342. 'height': options.maxHeight + 'px',
  343. 'max-height': options.maxHeight + 'px',
  344. 'background': options.flowColor,
  345. });
  346. vinnyHoriz.css({
  347. 'position': 'absolute',
  348. 'top': '0',
  349. 'bottom': '0',
  350. 'margin': 'auto 0',
  351. 'width': '100%',
  352. 'max-width': '100%',
  353. 'background': options.flowColor,
  354. });
  355. vinnyFollow.each(function () {
  356. var element = $(this)
  357. if (element.data('color') !== undefined) {
  358. var color = element.data('color');
  359. element.find('.vinnycolor').css('background', color);
  360. }
  361. });
  362. var flowAnim = function () {
  363. vinnyLine.each(function () {
  364. var scrollTop = $(window).scrollTop();
  365. var distanceOffset = parseInt($(this).find('.vinnyflow').data('distance-offset'));
  366. var elementOffset = $(this).offset().top;
  367. var distance = -(elementOffset - scrollTop) + options.flowTop - distanceOffset;
  368. $(this).find('.vinnyflow').css('top', distance + 'px');
  369. if ($(this).hasClass('line-horiz')) {
  370. var horizDistance = 'calc(' + distance + 'px * (' + ($(this).width() + (options.flowTop / 2)) / options.flowTop + '))';
  371. $(this).find('.vinnyflow').css({
  372. 'left': horizDistance,
  373. 'top': '0'
  374. })
  375. }
  376. })
  377. };
  378. flowAnim();
  379. $(window).on('scroll resize', function () {
  380. flowAnim();
  381. });
  382. }
  383. });
  384. })(jQuery);