vtubers.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. const data = [
  2. {
  3. "id": "0",
  4. "name": "凡笙弦語",
  5. "intro": "台灣新人Vtuber鹹魚翻身後依然是條鹹魚以歌唱與歌曲創作為主!",
  6. "img": "https://i.imgur.com/1Oahh38.jpg",
  7. "style": ["可愛"],
  8. "tags": ["#FS鹹魚", "#魚塭", "#TWVtuber" ],
  9. "contact": "",
  10. "follow": "",
  11. "mp4": null
  12. },
  13. {
  14. "id": "1",
  15. "name": "小烏龜-Yui",
  16. "intro": "lorem",
  17. "img": "https://i.imgur.com/iHtiCpP.jpg",
  18. "style": ["可愛"],
  19. "tags": ["#小烏龜yui"],
  20. "contact": "",
  21. "follow": "",
  22. "mp4": null
  23. },
  24. {
  25. "id": "2",
  26. "name": "柚餓幽窮",
  27. "intro": "lorem",
  28. "img": "https://i.imgur.com/g00i7Ji.jpg",
  29. "style": ["奶兇"],
  30. "tags": [],
  31. "contact": "",
  32. "follow": "",
  33. "mp4": null
  34. },
  35. {
  36. "id": "3",
  37. "name": "花御いしき",
  38. "intro": "lorem",
  39. "img": "https://i.imgur.com/e0Nl0FW.png",
  40. "style": ["溫柔可愛", "人格分裂", "配音系"],
  41. "tags": ["#擴散希望", "#男vtuber", " #虛擬youtuber", "#新人VTuber"],
  42. "contact": "",
  43. "follow": "",
  44. "mp4": "https://www.mboxdrive.com/%E8%81%B2%E9%9F%B3%E7%9B%92%E5%AD%901%20-%20ishiki%20hanao.mp4"
  45. },
  46. {
  47. "id": "4",
  48. "name": "Ikusen(小千)",
  49. "intro": "lorem",
  50. "img": "https://i.imgur.com/GXHDTcd.png",
  51. "style": ["御姊"],
  52. "tags": ["#台V", "#いくせん", "#VTuber ", "#TWvtuber"],
  53. "contact": "",
  54. "follow": "",
  55. "mp4": null
  56. },
  57. {
  58. "id": "5",
  59. "name": "迷途小喵",
  60. "intro": "lorem",
  61. "img": "https://i.imgur.com/YnSPyv7.jpg",
  62. "style": ["御姊", "多聲線"],
  63. "tags": ["#台V", "#いくせん", "#VTuber ", "#TWvtuber"],
  64. "contact": "",
  65. "follow": "",
  66. "mp4": null
  67. },
  68. {
  69. "id": "6",
  70. "name": "左翌設計 ZoeL Design",
  71. "intro": "lorem",
  72. "img": "https://www.tcbla.org.tw//img/16198905052188k1OnWjcRae.jpg",
  73. "style": ["御姊", "多聲線"],
  74. "tags": ["#台V", "#いくせん", "#VTuber ", "#TWvtuber"],
  75. "contact": "",
  76. "follow": "",
  77. "mp4": null
  78. },
  79. ];
  80. function getVtuber() {
  81. if(window.location.pathname.match('vtuber')) {
  82. console.log('vtuber list');
  83. let result = [...data];
  84. console.log(result);
  85. let str = '';
  86. for(let i = 0; i < result.length; i++){
  87. let style = '';
  88. for(let j = 0; j < result[i].style.length; j++){
  89. style += `<span class="vt-style">${result[i].style[j]}</span>`;
  90. console.log(result[i].style.length);
  91. }
  92. str += `<div class="col-6 col-sm-4 col-md-3">
  93. <div class="card" style="width: 100%;">
  94. <div class="vt-ribbon"><p>Vtuber</p></div>
  95. <div class="card-img-fr" style="background-image:url(${result[i].img})"></div>
  96. <div class="card-body">
  97. <h5 class="card-title">${result[i].name}</h5>
  98. ${style}
  99. <button class="card-link" data-toggle="modal" data-target="#more1Modal" data-id="${result[i].id}" >查看更多></button>
  100. </div>
  101. </div>
  102. </div>`;
  103. }
  104. $('.vt-list .vt-content').html(str);
  105. $('.vt-content .card-link').click(function(){
  106. const music = document.querySelector('.modal-body-sample audio');
  107. const progressBar = document.querySelector('#progress-bar');
  108. const progressZone = document.querySelector('.music-progress');
  109. let selected = result.filter(item =>
  110. item.id == $(this).data('id')
  111. )[0];
  112. console.log(selected);
  113. $('#more1Modal .modal-title').text(selected.name);
  114. $('#more1Modal .modal-imgfr').css('background-image', `url(${selected.img})`);
  115. $('#more1Modal p').text(selected.intro);
  116. if(selected.mp4 == null) {
  117. $('.modal-body-sample').css('display', 'none');
  118. } else {
  119. $('.modal-body-sample audio').attr('src', selected.mp4);
  120. }
  121. let hashtagStr = "";
  122. for(let i = 0; i < selected.tags.length; i++){
  123. hashtagStr+= `<span class="hashtag-pill">${selected.tags[i]}</span>`;
  124. };
  125. $('#more1Modal .modal-hashtag').html(hashtagStr);
  126. let isPlaying = false;
  127. $('.modal-body-toggleplay').click(function(){
  128. //isPlaying? pauseMusic(music) : playMusic(music)
  129. if(isPlaying) {
  130. music.pause();
  131. $('.modal-body-toggleplay').attr("src", "https://i.imgur.com/gYst9TQ.png");
  132. isPlaying = false;
  133. } else {
  134. music.play();
  135. $('.modal-body-toggleplay').attr("src", "https://i.imgur.com/f5PWQUb.png");
  136. isPlaying = true;
  137. }
  138. console.log(isPlaying);
  139. });
  140. $('[data-dismiss="modal"]').click(function() {
  141. music.pause();
  142. $('.modal-body-toggleplay').attr("src", "https://i.imgur.com/gYst9TQ.png");
  143. isPlaying = false;
  144. });
  145. music.addEventListener('timeupdate', updateProgress);
  146. progressZone.addEventListener('click', setProgress);
  147. })
  148. }
  149. }
  150. getVtuber();
  151. const updateProgress = (e) => {
  152. const music = document.querySelector('.modal-body-sample audio');
  153. const progressBar = document.querySelector('#progress-bar');
  154. const progressZone = document.querySelector('.music-progress');
  155. const {
  156. duration,
  157. currentTime
  158. } = e.srcElement;
  159. const progressPercent = (currentTime / duration) * 100
  160. progressBar.style.width = `${progressPercent}%`
  161. if(progressPercent == 100) {
  162. music.pause();
  163. $('.modal-body-toggleplay').attr("src", "https://i.imgur.com/gYst9TQ.png");
  164. isPlaying = false;
  165. console.log('test');
  166. }
  167. }
  168. function setProgress(e) {
  169. const music = document.querySelector('.modal-body-sample audio');
  170. const width = this.clientWidth;
  171. const setPoint = e.offsetX;
  172. const duration = music.duration;
  173. music.currentTime = (setPoint / width) * duration;
  174. }