jquery.liMarquee.js 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223
  1. /*
  2. * jQuery liMarquee v 4.6
  3. *
  4. * Copyright 2013, Linnik Yura | LI MASS CODE | http://masscode.ru
  5. * http://masscode.ru/index.php/k2/item/44-limarquee
  6. * Free to use
  7. *
  8. * Last Update 20.11.2014
  9. */
  10. (function ($) {
  11. var methods = {
  12. init: function (options) {
  13. var p = {
  14. direction: 'left', // Указывает направление движения содержимого контейнера (left | right | up | down)
  15. loop: -1, // Задает, сколько раз будет прокручиваться содержимое. "-1" для бесконечного воспроизведения движения
  16. scrolldelay: 0, // Величина задержки в миллисекундах между движениями
  17. scrollamount: 50, // Скорость движения контента (px/sec)
  18. circular: true, // Если "true" - строка непрерывная
  19. drag: true, // Если "true" - включено перетаскивание строки
  20. runshort: true, // Если "true" - короткая строка тоже "бегает", "false" - стоит на месте
  21. hoverstop: true, // true - строка останавливается при наведении курсора мыши, false - строка не останавливается
  22. inverthover: false, // false - стандартное поведение. Если "true" - строка начинает движение только при наведении курсора
  23. xml: false // Путь к xml файлу с нужным текстом
  24. }
  25. if (options) {
  26. $.extend(p, options)
  27. }
  28. return this.each(function () {
  29. var enterEvent = 'mouseenter'
  30. var leaveEvent = 'mouseleave'
  31. if (p.inverthover) {
  32. enterEvent = 'mouseleave'
  33. leaveEvent = 'mouseenter'
  34. }
  35. var
  36. loop = p.loop
  37. var strWrap = $(this).addClass('str_wrap').data({ scrollamount: p.scrollamount })
  38. var fMove = false
  39. var strWrapStyle = strWrap.attr('style')
  40. if (strWrapStyle) {
  41. var wrapStyleArr = strWrapStyle.split(';')
  42. var startHeight = false
  43. for (var i = 0; i < wrapStyleArr.length; i++) {
  44. var str = $.trim(wrapStyleArr[i])
  45. var tested = str.search(/^height/g)
  46. if (tested != -1) {
  47. startHeight = parseFloat(strWrap.css('height'))
  48. }
  49. }
  50. }
  51. var code = function () {
  52. strWrap.off('mouseleave')
  53. strWrap.off('mouseenter')
  54. strWrap.off('mousemove')
  55. strWrap.off('mousedown')
  56. strWrap.off('mouseup')
  57. if (!$('.str_move', strWrap).length) {
  58. strWrap.wrapInner($('<div>').addClass('str_move'))
  59. }
  60. var
  61. strMove = $('.str_move', strWrap).addClass('str_origin')
  62. var strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone')
  63. var time = 0
  64. if (!p.hoverstop) {
  65. strWrap.addClass('noStop')
  66. }
  67. var circCloneHor = function () {
  68. strMoveClone.clone().css({
  69. left: '100%',
  70. right: 'auto',
  71. width: strMove.width()
  72. }).appendTo(strMove)
  73. strMoveClone.css({
  74. right: '100%',
  75. left: 'auto',
  76. width: strMove.width()
  77. }).appendTo(strMove)
  78. }
  79. var circCloneVert = function () {
  80. strMoveClone.clone().css({
  81. top: '100%',
  82. bottom: 'auto',
  83. height: strMove.height()
  84. }).appendTo(strMove)
  85. strMoveClone.css({
  86. bottom: '100%',
  87. top: 'auto',
  88. height: strMove.height()
  89. }).appendTo(strMove)
  90. }
  91. if (p.direction == 'left') {
  92. strWrap.height(strMove.outerHeight())
  93. if (strMove.width() > strWrap.width()) {
  94. var leftPos = -strMove.width()
  95. if (p.circular) {
  96. if (!p.xml) {
  97. circCloneHor()
  98. leftPos = -(strMove.width() + (strMove.width() - strWrap.width()))
  99. }
  100. }
  101. if (p.xml) {
  102. strMove.css({
  103. left: strWrap.width()
  104. })
  105. }
  106. var
  107. strMoveLeft = strWrap.width()
  108. var k1 = 0
  109. var timeFunc1 = function () {
  110. var
  111. fullS = Math.abs(leftPos)
  112. var time = (fullS / strWrap.data('scrollamount')) * 1000
  113. if (parseFloat(strMove.css('left')) != 0) {
  114. fullS = (fullS + strWrap.width())
  115. time = (fullS - (strWrap.width() - parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000
  116. }
  117. return time
  118. }
  119. var moveFuncId1 = false
  120. var moveFunc1 = function () {
  121. if (loop != 0) {
  122. strMove.stop(true).animate({
  123. left: leftPos
  124. }, timeFunc1(), 'linear', function () {
  125. $(this).css({
  126. left: strWrap.width()
  127. })
  128. if (loop == -1) {
  129. moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay)
  130. } else {
  131. loop--
  132. moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay)
  133. }
  134. })
  135. }
  136. }
  137. strWrap.data({
  138. moveId: moveFuncId1,
  139. moveF: moveFunc1
  140. })
  141. if (!p.inverthover) {
  142. moveFunc1()
  143. }
  144. if (p.hoverstop) {
  145. strWrap.on(enterEvent, function () {
  146. $(this).addClass('str_active')
  147. clearTimeout(moveFuncId1)
  148. strMove.stop(true)
  149. }).on(leaveEvent, function () {
  150. $(this).removeClass('str_active')
  151. $(this).off('mousemove')
  152. moveFunc1()
  153. })
  154. if (p.drag) {
  155. strWrap.on('mousedown', function (e) {
  156. if (p.inverthover) {
  157. strMove.stop(true)
  158. }
  159. // drag
  160. var dragLeft
  161. var dir = 1
  162. var newX
  163. var oldX = e.clientX
  164. // drag
  165. strMoveLeft = strMove.position().left
  166. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  167. $(this).on('mousemove', function (e) {
  168. fMove = true
  169. // drag
  170. newX = e.clientX
  171. if (newX > oldX) {
  172. dir = 1
  173. } else {
  174. dir = -1
  175. }
  176. oldX = newX
  177. dragLeft = k1 + (e.clientX - strWrap.offset().left)
  178. if (!p.circular) {
  179. if (dragLeft < -strMove.width() && dir < 0) {
  180. dragLeft = strWrap.width()
  181. strMoveLeft = strMove.position().left
  182. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  183. }
  184. if (dragLeft > strWrap.width() && dir > 0) {
  185. dragLeft = -strMove.width()
  186. strMoveLeft = strMove.position().left
  187. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  188. }
  189. } else {
  190. if (dragLeft < -strMove.width() && dir < 0) {
  191. dragLeft = 0
  192. strMoveLeft = strMove.position().left
  193. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  194. }
  195. if (dragLeft > 0 && dir > 0) {
  196. dragLeft = -strMove.width()
  197. strMoveLeft = strMove.position().left
  198. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  199. }
  200. }
  201. strMove.stop(true).css({
  202. left: dragLeft
  203. })
  204. // drag
  205. }).on('mouseup', function () {
  206. $(this).off('mousemove')
  207. if (p.inverthover) {
  208. strMove.trigger('mouseenter')
  209. }
  210. setTimeout(function () {
  211. fMove = false
  212. }, 50)
  213. })
  214. return false
  215. })
  216. .on('click', function () {
  217. if (fMove) {
  218. return false
  219. }
  220. })
  221. } else {
  222. strWrap.addClass('no_drag')
  223. };
  224. }
  225. } else {
  226. if (p.runshort) {
  227. strMove.css({
  228. left: strWrap.width()
  229. })
  230. var
  231. strMoveLeft = strWrap.width()
  232. var k1 = 0
  233. var timeFunc = function () {
  234. time = (strMove.width() + strMove.position().left) / strWrap.data('scrollamount') * 1000
  235. return time
  236. }
  237. var moveFunc = function () {
  238. var leftPos = -strMove.width()
  239. strMove.animate({
  240. left: leftPos
  241. }, timeFunc(), 'linear', function () {
  242. $(this).css({
  243. left: strWrap.width()
  244. })
  245. if (loop == -1) {
  246. setTimeout(moveFunc, p.scrolldelay)
  247. } else {
  248. loop--
  249. setTimeout(moveFunc, p.scrolldelay)
  250. }
  251. })
  252. }
  253. strWrap.data({
  254. moveF: moveFunc
  255. })
  256. if (!p.inverthover) {
  257. moveFunc()
  258. }
  259. if (p.hoverstop) {
  260. strWrap.on(enterEvent, function () {
  261. $(this).addClass('str_active')
  262. strMove.stop(true)
  263. }).on(leaveEvent, function () {
  264. $(this).removeClass('str_active')
  265. $(this).off('mousemove')
  266. moveFunc()
  267. })
  268. if (p.drag) {
  269. strWrap.on('mousedown', function (e) {
  270. if (p.inverthover) {
  271. strMove.stop(true)
  272. }
  273. // drag
  274. var dragLeft
  275. var dir = 1
  276. var newX
  277. var oldX = e.clientX
  278. // drag
  279. strMoveLeft = strMove.position().left
  280. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  281. $(this).on('mousemove', function (e) {
  282. fMove = true
  283. // drag
  284. newX = e.clientX
  285. if (newX > oldX) {
  286. dir = 1
  287. } else {
  288. dir = -1
  289. }
  290. oldX = newX
  291. dragLeft = k1 + (e.clientX - strWrap.offset().left)
  292. if (dragLeft < -strMove.width() && dir < 0) {
  293. dragLeft = strWrap.width()
  294. strMoveLeft = strMove.position().left
  295. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  296. }
  297. if (dragLeft > strWrap.width() && dir > 0) {
  298. dragLeft = -strMove.width()
  299. strMoveLeft = strMove.position().left
  300. k1 = strMoveLeft - (e.clientX - strWrap.offset().left)
  301. }
  302. strMove.stop(true).css({
  303. left: dragLeft
  304. })
  305. }).on('mouseup', function () {
  306. if (p.inverthover) {
  307. strMove.trigger('mouseenter')
  308. }
  309. $(this).off('mousemove')
  310. setTimeout(function () {
  311. fMove = false
  312. }, 50)
  313. })
  314. return false
  315. })
  316. .on('click', function () {
  317. if (fMove) {
  318. return false
  319. }
  320. })
  321. } else {
  322. strWrap.addClass('no_drag')
  323. };
  324. }
  325. } else {
  326. strWrap.addClass('str_static')
  327. }
  328. };
  329. };
  330. if (p.direction == 'right') {
  331. strWrap.height(strMove.outerHeight())
  332. strWrap.addClass('str_right')
  333. strMove.css({
  334. left: -strMove.width(),
  335. right: 'auto'
  336. })
  337. if (strMove.width() > strWrap.width()) {
  338. var leftPos = strWrap.width()
  339. strMove.css({
  340. left: 0
  341. })
  342. if (p.circular) {
  343. if (!p.xml) {
  344. circCloneHor()
  345. // Определяем крайнюю точку
  346. leftPos = strMove.width()
  347. }
  348. }
  349. var
  350. k2 = 0
  351. timeFunc = function () {
  352. var
  353. fullS = strWrap.width() // крайняя точка
  354. var time = (fullS / strWrap.data('scrollamount')) * 1000 // время
  355. if (parseFloat(strMove.css('left')) != 0) {
  356. fullS = (strMove.width() + strWrap.width())
  357. time = (fullS - (strMove.width() + parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000
  358. }
  359. return time
  360. }
  361. var moveFunc = function () {
  362. if (loop != 0) {
  363. strMove.animate({
  364. left: leftPos
  365. }, timeFunc(), 'linear', function () {
  366. $(this).css({
  367. left: -strMove.width()
  368. })
  369. if (loop == -1) {
  370. setTimeout(moveFunc, p.scrolldelay)
  371. } else {
  372. loop--
  373. setTimeout(moveFunc, p.scrolldelay)
  374. };
  375. })
  376. };
  377. }
  378. strWrap.data({
  379. moveF: moveFunc
  380. })
  381. if (!p.inverthover) {
  382. moveFunc()
  383. }
  384. if (p.hoverstop) {
  385. strWrap.on(enterEvent, function () {
  386. $(this).addClass('str_active')
  387. strMove.stop(true)
  388. }).on(leaveEvent, function () {
  389. $(this).removeClass('str_active')
  390. $(this).off('mousemove')
  391. moveFunc()
  392. })
  393. if (p.drag) {
  394. strWrap.on('mousedown', function (e) {
  395. if (p.inverthover) {
  396. strMove.stop(true)
  397. }
  398. // drag
  399. var dragLeft
  400. var dir = 1
  401. var newX
  402. var oldX = e.clientX
  403. // drag
  404. strMoveLeft = strMove.position().left
  405. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  406. $(this).on('mousemove', function (e) {
  407. fMove = true
  408. // drag
  409. newX = e.clientX
  410. if (newX > oldX) {
  411. dir = 1
  412. } else {
  413. dir = -1
  414. }
  415. oldX = newX
  416. dragLeft = k2 + (e.clientX - strWrap.offset().left)
  417. if (!p.circular) {
  418. if (dragLeft < -strMove.width() && dir < 0) {
  419. dragLeft = strWrap.width()
  420. strMoveLeft = strMove.position().left
  421. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  422. }
  423. if (dragLeft > strWrap.width() && dir > 0) {
  424. dragLeft = -strMove.width()
  425. strMoveLeft = strMove.position().left
  426. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  427. }
  428. } else {
  429. if (dragLeft < -strMove.width() && dir < 0) {
  430. dragLeft = 0
  431. strMoveLeft = strMove.position().left
  432. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  433. }
  434. if (dragLeft > 0 && dir > 0) {
  435. dragLeft = -strMove.width()
  436. strMoveLeft = strMove.position().left
  437. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  438. }
  439. }
  440. strMove.stop(true).css({
  441. left: dragLeft
  442. })
  443. }).on('mouseup', function () {
  444. if (p.inverthover) {
  445. strMove.trigger('mouseenter')
  446. }
  447. $(this).off('mousemove')
  448. setTimeout(function () {
  449. fMove = false
  450. }, 50)
  451. })
  452. return false
  453. })
  454. .on('click', function () {
  455. if (fMove) {
  456. return false
  457. }
  458. })
  459. } else {
  460. strWrap.addClass('no_drag')
  461. };
  462. }
  463. } else {
  464. if (p.runshort) {
  465. var k2 = 0
  466. var timeFunc = function () {
  467. time = (strWrap.width() - strMove.position().left) / strWrap.data('scrollamount') * 1000
  468. return time
  469. }
  470. var moveFunc = function () {
  471. var leftPos = strWrap.width()
  472. strMove.animate({
  473. left: leftPos
  474. }, timeFunc(), 'linear', function () {
  475. $(this).css({
  476. left: -strMove.width()
  477. })
  478. if (loop == -1) {
  479. setTimeout(moveFunc, p.scrolldelay)
  480. } else {
  481. loop--
  482. setTimeout(moveFunc, p.scrolldelay)
  483. };
  484. })
  485. }
  486. strWrap.data({
  487. moveF: moveFunc
  488. })
  489. if (!p.inverthover) {
  490. moveFunc()
  491. }
  492. if (p.hoverstop) {
  493. strWrap.on(enterEvent, function () {
  494. $(this).addClass('str_active')
  495. strMove.stop(true)
  496. }).on(leaveEvent, function () {
  497. $(this).removeClass('str_active')
  498. $(this).off('mousemove')
  499. moveFunc()
  500. })
  501. if (p.drag) {
  502. strWrap.on('mousedown', function (e) {
  503. if (p.inverthover) {
  504. strMove.stop(true)
  505. }
  506. // drag
  507. var dragLeft
  508. var dir = 1
  509. var newX
  510. var oldX = e.clientX
  511. // drag
  512. strMoveLeft = strMove.position().left
  513. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  514. $(this).on('mousemove', function (e) {
  515. fMove = true
  516. // drag
  517. newX = e.clientX
  518. if (newX > oldX) {
  519. dir = 1
  520. } else {
  521. dir = -1
  522. }
  523. oldX = newX
  524. dragLeft = k2 + (e.clientX - strWrap.offset().left)
  525. if (dragLeft < -strMove.width() && dir < 0) {
  526. dragLeft = strWrap.width()
  527. strMoveLeft = strMove.position().left
  528. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  529. }
  530. if (dragLeft > strWrap.width() && dir > 0) {
  531. dragLeft = -strMove.width()
  532. strMoveLeft = strMove.position().left
  533. k2 = strMoveLeft - (e.clientX - strWrap.offset().left)
  534. }
  535. strMove.stop(true).css({
  536. left: dragLeft
  537. })
  538. }).on('mouseup', function () {
  539. if (p.inverthover) {
  540. strMove.trigger('mouseenter')
  541. }
  542. $(this).off('mousemove')
  543. setTimeout(function () {
  544. fMove = false
  545. }, 50)
  546. })
  547. return false
  548. })
  549. .on('click', function () {
  550. if (fMove) {
  551. return false
  552. }
  553. })
  554. } else {
  555. strWrap.addClass('no_drag')
  556. };
  557. }
  558. } else {
  559. strWrap.addClass('str_static')
  560. }
  561. };
  562. };
  563. if (p.direction == 'up') {
  564. strWrap.addClass('str_vertical')
  565. if (strMove.height() > strWrap.height()) {
  566. var topPos = -strMove.height()
  567. if (p.circular) {
  568. if (!p.xml) {
  569. circCloneVert()
  570. topPos = -(strMove.height() + (strMove.height() - strWrap.height()))
  571. }
  572. }
  573. if (p.xml) {
  574. strMove.css({
  575. top: strWrap.height()
  576. })
  577. }
  578. var
  579. k2 = 0
  580. timeFunc = function () {
  581. var
  582. fullS = Math.abs(topPos)
  583. var time = (fullS / strWrap.data('scrollamount')) * 1000
  584. if (parseFloat(strMove.css('top')) != 0) {
  585. fullS = (fullS + strWrap.height())
  586. time = (fullS - (strWrap.height() - parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000
  587. }
  588. return time
  589. }
  590. var moveFunc = function () {
  591. if (loop != 0) {
  592. strMove.animate({
  593. top: topPos
  594. }, timeFunc(), 'linear', function () {
  595. $(this).css({
  596. top: strWrap.height()
  597. })
  598. if (loop == -1) {
  599. setTimeout(moveFunc, p.scrolldelay)
  600. } else {
  601. loop--
  602. setTimeout(moveFunc, p.scrolldelay)
  603. };
  604. })
  605. };
  606. }
  607. strWrap.data({
  608. moveF: moveFunc
  609. })
  610. if (!p.inverthover) {
  611. moveFunc()
  612. }
  613. if (p.hoverstop) {
  614. strWrap.on(enterEvent, function () {
  615. $(this).addClass('str_active')
  616. strMove.stop(true)
  617. }).on(leaveEvent, function () {
  618. $(this).removeClass('str_active')
  619. $(this).off('mousemove')
  620. moveFunc()
  621. })
  622. if (p.drag) {
  623. strWrap.on('mousedown', function (e) {
  624. if (p.inverthover) {
  625. strMove.stop(true)
  626. }
  627. // drag
  628. var dragTop
  629. var dir = 1
  630. var newY
  631. var oldY = e.clientY
  632. // drag
  633. strMoveTop = strMove.position().top
  634. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  635. $(this).on('mousemove', function (e) {
  636. fMove = true
  637. // drag
  638. newY = e.clientY
  639. if (newY > oldY) {
  640. dir = 1
  641. } else {
  642. if (newY < oldY) {
  643. dir = -1
  644. }
  645. }
  646. oldY = newY
  647. dragTop = k2 + e.clientY - strWrap.offset().top
  648. if (!p.circular) {
  649. if (dragTop < -strMove.height() && dir < 0) {
  650. dragTop = strWrap.height()
  651. strMoveTop = strMove.position().top
  652. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  653. }
  654. if (dragTop > strWrap.height() && dir > 0) {
  655. dragTop = -strMove.height()
  656. strMoveTop = strMove.position().top
  657. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  658. }
  659. } else {
  660. if (dragTop < -strMove.height() && dir < 0) {
  661. dragTop = 0
  662. strMoveTop = strMove.position().top
  663. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  664. }
  665. if (dragTop > 0 && dir > 0) {
  666. dragTop = -strMove.height()
  667. strMoveTop = strMove.position().top
  668. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  669. }
  670. }
  671. strMove.stop(true).css({
  672. top: dragTop
  673. })
  674. // drag
  675. }).on('mouseup', function () {
  676. if (p.inverthover) {
  677. strMove.trigger('mouseenter')
  678. }
  679. $(this).off('mousemove')
  680. setTimeout(function () {
  681. fMove = false
  682. }, 50)
  683. })
  684. return false
  685. })
  686. .on('click', function () {
  687. if (fMove) {
  688. return false
  689. }
  690. })
  691. } else {
  692. strWrap.addClass('no_drag')
  693. };
  694. }
  695. } else {
  696. if (p.runshort) {
  697. strMove.css({
  698. top: strWrap.height()
  699. })
  700. var k2 = 0
  701. var timeFunc = function () {
  702. time = (strMove.height() + strMove.position().top) / strWrap.data('scrollamount') * 1000
  703. return time
  704. }
  705. var moveFunc = function () {
  706. var topPos = -strMove.height()
  707. strMove.animate({
  708. top: topPos
  709. }, timeFunc(), 'linear', function () {
  710. $(this).css({
  711. top: strWrap.height()
  712. })
  713. if (loop == -1) {
  714. setTimeout(moveFunc, p.scrolldelay)
  715. } else {
  716. loop--
  717. setTimeout(moveFunc, p.scrolldelay)
  718. };
  719. })
  720. }
  721. strWrap.data({
  722. moveF: moveFunc
  723. })
  724. if (!p.inverthover) {
  725. moveFunc()
  726. }
  727. if (p.hoverstop) {
  728. strWrap.on(enterEvent, function () {
  729. $(this).addClass('str_active')
  730. strMove.stop(true)
  731. }).on(leaveEvent, function () {
  732. $(this).removeClass('str_active')
  733. $(this).off('mousemove')
  734. moveFunc()
  735. })
  736. if (p.drag) {
  737. strWrap.on('mousedown', function (e) {
  738. if (p.inverthover) {
  739. strMove.stop(true)
  740. }
  741. // drag
  742. var dragTop
  743. var dir = 1
  744. var newY
  745. var oldY = e.clientY
  746. // drag
  747. strMoveTop = strMove.position().top
  748. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  749. $(this).on('mousemove', function (e) {
  750. fMove = true
  751. // drag
  752. newY = e.clientY
  753. if (newY > oldY) {
  754. dir = 1
  755. } else {
  756. if (newY < oldY) {
  757. dir = -1
  758. }
  759. }
  760. oldY = newY
  761. dragTop = k2 + e.clientY - strWrap.offset().top
  762. if (dragTop < -strMove.height() && dir < 0) {
  763. dragTop = strWrap.height()
  764. strMoveTop = strMove.position().top
  765. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  766. }
  767. if (dragTop > strWrap.height() && dir > 0) {
  768. dragTop = -strMove.height()
  769. strMoveTop = strMove.position().top
  770. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  771. }
  772. //* drag
  773. strMove.stop(true).css({
  774. top: dragTop
  775. })
  776. }).on('mouseup', function () {
  777. if (p.inverthover) {
  778. strMove.trigger('mouseenter')
  779. }
  780. $(this).off('mousemove')
  781. setTimeout(function () {
  782. fMove = false
  783. }, 50)
  784. })
  785. return false
  786. })
  787. .on('click', function () {
  788. if (fMove) {
  789. return false
  790. }
  791. })
  792. } else {
  793. strWrap.addClass('no_drag')
  794. };
  795. }
  796. } else {
  797. strWrap.addClass('str_static')
  798. }
  799. };
  800. };
  801. if (p.direction == 'down') {
  802. strWrap.addClass('str_vertical').addClass('str_down')
  803. strMove.css({
  804. top: -strMove.height(),
  805. bottom: 'auto'
  806. })
  807. if (strMove.height() > strWrap.height()) {
  808. var topPos = strWrap.height()
  809. if (p.circular) {
  810. if (!p.xml) {
  811. circCloneVert()
  812. topPos = strMove.height()
  813. }
  814. }
  815. if (p.xml) {
  816. strMove.css({
  817. top: -strMove.height()
  818. })
  819. }
  820. var
  821. k2 = 0
  822. timeFunc = function () {
  823. var
  824. fullS = strWrap.height() // крайняя точка
  825. var time = (fullS / strWrap.data('scrollamount')) * 1000 // время
  826. if (parseFloat(strMove.css('top')) != 0) {
  827. fullS = (strMove.height() + strWrap.height())
  828. time = (fullS - (strMove.height() + parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000
  829. }
  830. return time
  831. }
  832. var moveFunc = function () {
  833. if (loop != 0) {
  834. strMove.animate({
  835. top: topPos
  836. }, timeFunc(), 'linear', function () {
  837. $(this).css({
  838. top: -strMove.height()
  839. })
  840. if (loop == -1) {
  841. setTimeout(moveFunc, p.scrolldelay)
  842. } else {
  843. loop--
  844. setTimeout(moveFunc, p.scrolldelay)
  845. };
  846. })
  847. };
  848. }
  849. strWrap.data({
  850. moveF: moveFunc
  851. })
  852. if (!p.inverthover) {
  853. moveFunc()
  854. }
  855. if (p.hoverstop) {
  856. strWrap.on(enterEvent, function () {
  857. $(this).addClass('str_active')
  858. strMove.stop(true)
  859. }).on(leaveEvent, function () {
  860. $(this).removeClass('str_active')
  861. $(this).off('mousemove')
  862. moveFunc()
  863. })
  864. if (p.drag) {
  865. strWrap.on('mousedown', function (e) {
  866. if (p.inverthover) {
  867. strMove.stop(true)
  868. }
  869. // drag
  870. var dragTop
  871. var dir = 1
  872. var newY
  873. var oldY = e.clientY
  874. // drag
  875. strMoveTop = strMove.position().top
  876. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  877. $(this).on('mousemove', function (e) {
  878. fMove = true
  879. // drag
  880. newY = e.clientY
  881. if (newY > oldY) {
  882. dir = 1
  883. } else {
  884. if (newY < oldY) {
  885. dir = -1
  886. }
  887. }
  888. oldY = newY
  889. dragTop = k2 + e.clientY - strWrap.offset().top
  890. if (!p.circular) {
  891. if (dragTop < -strMove.height() && dir < 0) {
  892. dragTop = strWrap.height()
  893. strMoveTop = strMove.position().top
  894. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  895. }
  896. if (dragTop > strWrap.height() && dir > 0) {
  897. dragTop = -strMove.height()
  898. strMoveTop = strMove.position().top
  899. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  900. }
  901. } else {
  902. if (dragTop < -strMove.height() && dir < 0) {
  903. dragTop = 0
  904. strMoveTop = strMove.position().top
  905. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  906. }
  907. if (dragTop > 0 && dir > 0) {
  908. dragTop = -strMove.height()
  909. strMoveTop = strMove.position().top
  910. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  911. }
  912. }
  913. strMove.stop(true).css({
  914. top: dragTop
  915. })
  916. // drag
  917. }).on('mouseup', function () {
  918. if (p.inverthover) {
  919. strMove.trigger('mouseenter')
  920. }
  921. $(this).off('mousemove')
  922. setTimeout(function () {
  923. fMove = false
  924. }, 50)
  925. })
  926. return false
  927. })
  928. .on('click', function () {
  929. if (fMove) {
  930. return false
  931. }
  932. })
  933. } else {
  934. strWrap.addClass('no_drag')
  935. };
  936. }
  937. } else {
  938. if (p.runshort) {
  939. var k2 = 0
  940. var timeFunc = function () {
  941. time = (strWrap.height() - strMove.position().top) / strWrap.data('scrollamount') * 1000
  942. return time
  943. }
  944. var moveFunc = function () {
  945. var topPos = strWrap.height()
  946. strMove.animate({
  947. top: topPos
  948. }, timeFunc(), 'linear', function () {
  949. $(this).css({
  950. top: -strMove.height()
  951. })
  952. if (loop == -1) {
  953. setTimeout(moveFunc, p.scrolldelay)
  954. } else {
  955. loop--
  956. setTimeout(moveFunc, p.scrolldelay)
  957. };
  958. })
  959. }
  960. strWrap.data({
  961. moveF: moveFunc
  962. })
  963. if (!p.inverthover) {
  964. moveFunc()
  965. }
  966. if (p.hoverstop) {
  967. strWrap.on(enterEvent, function () {
  968. $(this).addClass('str_active')
  969. strMove.stop(true)
  970. }).on(leaveEvent, function () {
  971. $(this).removeClass('str_active')
  972. $(this).off('mousemove')
  973. moveFunc()
  974. })
  975. if (p.drag) {
  976. strWrap.on('mousedown', function (e) {
  977. if (p.inverthover) {
  978. strMove.stop(true)
  979. }
  980. // drag
  981. var dragTop
  982. var dir = 1
  983. var newY
  984. var oldY = e.clientY
  985. // drag
  986. strMoveTop = strMove.position().top
  987. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  988. $(this).on('mousemove', function (e) {
  989. fMove = true
  990. // drag
  991. newY = e.clientY
  992. if (newY > oldY) {
  993. dir = 1
  994. } else {
  995. if (newY < oldY) {
  996. dir = -1
  997. }
  998. }
  999. oldY = newY
  1000. dragTop = k2 + e.clientY - strWrap.offset().top
  1001. if (dragTop < -strMove.height() && dir < 0) {
  1002. dragTop = strWrap.height()
  1003. strMoveTop = strMove.position().top
  1004. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  1005. }
  1006. if (dragTop > strWrap.height() && dir > 0) {
  1007. dragTop = -strMove.height()
  1008. strMoveTop = strMove.position().top
  1009. k2 = strMoveTop - (e.clientY - strWrap.offset().top)
  1010. }
  1011. //* drag
  1012. strMove.stop(true).css({
  1013. top: dragTop
  1014. })
  1015. }).on('mouseup', function () {
  1016. if (p.inverthover) {
  1017. strMove.trigger('mouseenter')
  1018. }
  1019. $(this).off('mousemove')
  1020. setTimeout(function () {
  1021. fMove = false
  1022. }, 50)
  1023. })
  1024. return false
  1025. })
  1026. .on('click', function () {
  1027. if (fMove) {
  1028. return false
  1029. }
  1030. })
  1031. } else {
  1032. strWrap.addClass('no_drag')
  1033. };
  1034. }
  1035. } else {
  1036. strWrap.addClass('str_static')
  1037. }
  1038. };
  1039. };
  1040. }
  1041. if (p.xml) {
  1042. $.ajax({
  1043. url: p.xml,
  1044. dataType: 'xml',
  1045. success: function (xml) {
  1046. var xmlTextEl = $(xml).find('text')
  1047. var xmlTextLength = xmlTextEl.length
  1048. for (var i = 0; i < xmlTextLength; i++) {
  1049. var xmlElActive = xmlTextEl.eq(i)
  1050. var xmlElContent = xmlElActive.text()
  1051. var xmlItemEl = $('<span>').text(xmlElContent).appendTo(strWrap)
  1052. if (p.direction == 'left' || p.direction == 'right') {
  1053. xmlItemEl.css({ display: 'inline-block', textAlign: 'right' })
  1054. if (i > 0) {
  1055. xmlItemEl.css({ width: strWrap.width() + xmlItemEl.width() })
  1056. }
  1057. }
  1058. if (p.direction == 'down' || p.direction == 'up') {
  1059. xmlItemEl.css({ display: 'block', textAlign: 'left' })
  1060. if (i > 0) {
  1061. xmlItemEl.css({ paddingTop: strWrap.height() })
  1062. }
  1063. }
  1064. }
  1065. code()
  1066. }
  1067. })
  1068. } else {
  1069. code()
  1070. }
  1071. strWrap.data({
  1072. ini: code,
  1073. startheight: startHeight
  1074. })
  1075. })
  1076. },
  1077. update: function () {
  1078. var el = $(this)
  1079. var str_origin = $('.str_origin', el)
  1080. var str_move_clone = $('.str_move_clone', el)
  1081. str_origin.stop(true)
  1082. str_move_clone.remove()
  1083. el.data('ini')()
  1084. },
  1085. destroy: function () {
  1086. var el = $(this)
  1087. var elMove = $('.str_move', el)
  1088. var startHeight = el.data('startheight')
  1089. $('.str_move_clone', el).remove()
  1090. el.off('mouseenter')
  1091. el.off('mousedown')
  1092. el.off('mouseup')
  1093. el.off('mouseleave')
  1094. el.off('mousemove')
  1095. el.removeClass('noStop').removeClass('str_vertical').removeClass('str_active').removeClass('no_drag').removeClass('str_static').removeClass('str_right').removeClass('str_down')
  1096. var elStyle = el.attr('style')
  1097. if (elStyle) {
  1098. var styleArr = elStyle.split(';')
  1099. for (var i = 0; i < styleArr.length; i++) {
  1100. var str = $.trim(styleArr[i])
  1101. var tested = str.search(/^height/g)
  1102. if (tested != -1) {
  1103. styleArr[i] = ''
  1104. }
  1105. }
  1106. var newArr = styleArr.join(';')
  1107. var newStyle = newArr.replace(/;+/g, ';')
  1108. if (newStyle == ';') {
  1109. el.removeAttr('style')
  1110. } else {
  1111. el.attr('style', newStyle)
  1112. }
  1113. if (startHeight) {
  1114. el.css({ height: startHeight })
  1115. }
  1116. }
  1117. elMove.stop(true)
  1118. if (elMove.length) {
  1119. var context = elMove.html()
  1120. elMove.remove()
  1121. el.html(context)
  1122. }
  1123. },
  1124. pause: function () {
  1125. var el = $(this)
  1126. var elMove = $('.str_move', el)
  1127. elMove.stop(true)
  1128. },
  1129. play: function () {
  1130. var el = $(this)
  1131. $(this).off('mousemove')
  1132. el.data('moveF')()
  1133. }
  1134. }
  1135. $.fn.liMarquee = function (method) {
  1136. if (methods[method]) {
  1137. return methods[method].apply(this, Array.prototype.slice.call(arguments, 1))
  1138. } else if (typeof method === 'object' || !method) {
  1139. return methods.init.apply(this, arguments)
  1140. } else {
  1141. $.error('Метод ' + method + ' в jQuery.liMarquee не существует')
  1142. }
  1143. }
  1144. })(jQuery)