slider.html 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  5. <title>Document</title>
  6. <meta name="applicable-device" content="pc,mobile" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1" />
  8. <link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.css' />
  9. <link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css' />
  10. <style type="text/css">
  11. /* 显示元素设定 */
  12. .slider {
  13. position: absolute;
  14. left: 2%;
  15. width: 96%;
  16. height: 160px;
  17. border-radius: 18px;
  18. box-shadow: 0 20px 22px -25px black;
  19. }
  20. .slider-track {
  21. -webkit-transition: all 1s cubic-bezier(0.7, 0, 0.3, 1);
  22. transition: all 1s cubic-bezier(0.7, 0, 0.3, 1);
  23. }
  24. .pic {
  25. overflow: hidden;
  26. height: 160px;
  27. border-radius: 18px; /* 设定圆角大小 */
  28. position: relative;
  29. z-index: 1;
  30. }
  31. .pic img {
  32. width: 100%;
  33. height: 100%;
  34. -webkit-transition: all 1s cubic-bezier(0.7, 0, 0.3, 1);
  35. transition: all 1s cubic-bezier(0.7, 0, 0.3, 1);
  36. -webkit-transform: scale(1.2);
  37. transform: scale(1.2);
  38. }
  39. .pic.slick-active img {
  40. -webkit-transform: scale(1);
  41. transform: scale(1);
  42. }
  43. </style>
  44. <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  45. <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/slick-carousel/1.6.0/slick.min.js"></script>
  46. <script type="text/javascript">
  47. const SOGOU_URL = 'https://v.sogou.com/channel/movie';
  48. const HAIKUO_OPEN_URL = 'web://';
  49. const HAIKUO_SEARCH_URL = 'hiker://search?s=';
  50. const MAX_SLIDER_SIZE = 8; // 最大图片显示张数
  51. const TRANSITION_SPEED = 1000; // 图片切换动画时长
  52. const PLAY_SPEED = 3000; // 播放速度
  53. const PRESS_EVENT_TIMER = 1000; // 长按事件毫秒数
  54. const CACHE_TIMEOUT = 60 * 60 * 1000; // 缓存超时时间
  55. let timeOutEvent = 0;
  56. // 点击
  57. let imgClick = (title) => {
  58. location.href = HAIKUO_SEARCH_URL + title;
  59. };
  60. // 长按
  61. let imgTouch = (url) => {
  62. // location.href = HAIKUO_OPEN_URL + url;
  63. };
  64. let getCache = () => {
  65. let cache = localStorage.getItem("SOGOU_CACHE")
  66. return cache ? JSON.parse(cache) : null;
  67. };
  68. let readFromSogou = (callback) => {
  69. $.get(SOGOU_URL)
  70. .done(function (data) {
  71. let sliderData;
  72. try {
  73. let sougoudata = $(data.substring(data.indexOf('<script>window.__INITIAL_STATE__=')))[0].innerHTML;
  74. sougoudata = sougoudata.replace("window.__INITIAL_STATE__=", "").replace(';(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());', '');
  75. let sougouobj = JSON.parse(sougoudata);
  76. sliderData = sougouobj.channelMovie.itemData.scrollBox;
  77. } catch (e) {
  78. console.log(e);
  79. }
  80. if (!sliderData)
  81. callback();
  82. let cache = { time: new Date().getTime(), data: sliderData };
  83. localStorage.setItem('SOGOU_CACHE', JSON.stringify(cache));
  84. callback();
  85. })
  86. .fail(function () {
  87. callback();
  88. });
  89. };
  90. let getSogouData = (processDataCallback) => {
  91. let cache = getCache();
  92. let now = new Date().getTime();
  93. let doCallback = () => {
  94. cache = getCache();
  95. processDataCallback(cache ? cache.data : null);
  96. };
  97. if (!cache || now > cache.time + CACHE_TIMEOUT) {
  98. readFromSogou(() => {
  99. doCallback()
  100. });
  101. } else {
  102. doCallback();
  103. }
  104. };
  105. let processData = (data) => {
  106. if (!data) {
  107. $('.slider').html('出錯啦!');
  108. return;
  109. }
  110. for (let i = 0; i < MAX_SLIDER_SIZE && data.length > i; i++) {
  111. let image = $('<img>').attr('src', data[i].big_pic);
  112. let imgdiv = $('<div>').addClass('pic').append(image);
  113. $('.slider').append(imgdiv);
  114. image.on('touchstart', (target) => {
  115. timeOutEvent = setTimeout(() => {
  116. timeOutEvent = 0;
  117. // 长按事件
  118. imgTouch(data[i].playurl);
  119. }, PRESS_EVENT_TIMER);
  120. });
  121. image.on('touchmove', () => {
  122. clearTimeout(timeOutEvent);
  123. timeOutEvent = 0;
  124. });
  125. image.on('touchend', (target) => {
  126. clearTimeout(timeOutEvent);
  127. if (timeOutEvent != 0) {
  128. // 点击事件
  129. imgClick(data[i].title);
  130. }
  131. });
  132. }
  133. $('.slider').slick({
  134. cssEase: 'linear',
  135. autoplaySpeed: PLAY_SPEED,
  136. speed: TRANSITION_SPEED,
  137. cssEase: 'cubic-bezier(0.25,0.1,0.25,1)',
  138. centerPadding: '100',
  139. centerMode: true,
  140. draggable: true,
  141. autoplay: true,
  142. arrows: false,
  143. dots: true,
  144. fade: true,
  145. infinite: true,
  146. slidesToScroll: 1,
  147. pauseOnFocus: false,
  148. pauseOnHover: false,
  149. pauseOnDotsHover: false
  150. })
  151. };
  152. $(document).ready(function () {
  153. getSogouData((data) => processData(data));
  154. });
  155. </script>
  156. </head>
  157. <body>
  158. <div class="slider"></div>
  159. </body>
  160. </html>