纽威
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.

1308 lines
35 KiB

1 year ago
  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. strWrap = $(this).addClass('str_wrap').data({scrollamount:p.scrollamount}),
  38. 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. strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone'),
  63. 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. k1 = 0,
  109. timeFunc1 = function () {
  110. var
  111. fullS = Math.abs(leftPos),
  112. 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. moveFuncId1 = false,
  120. 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. k1 = 0,
  233. 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. 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. 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. 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);