Barrage.mjs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. var __async = (__this, __arguments, generator) => {
  2. return new Promise((resolve, reject) => {
  3. var fulfilled = (value) => {
  4. try {
  5. step(generator.next(value));
  6. } catch (e) {
  7. reject(e);
  8. }
  9. };
  10. var rejected = (value) => {
  11. try {
  12. step(generator.throw(value));
  13. } catch (e) {
  14. reject(e);
  15. }
  16. };
  17. var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
  18. step((generator = generator.apply(__this, __arguments)).next());
  19. });
  20. };
  21. import { defineComponent, onMounted, ref, nextTick, watch, createVNode as _createVNode } from "vue";
  22. import { useExpose } from "../composables/use-expose.mjs";
  23. import { createNamespace, makeArrayProp, makeNumberProp, makeNumericProp, truthProp } from "../utils/index.mjs";
  24. const barrageProps = {
  25. top: makeNumericProp(10),
  26. rows: makeNumericProp(4),
  27. duration: makeNumericProp(4e3),
  28. autoPlay: truthProp,
  29. delay: makeNumberProp(300),
  30. modelValue: makeArrayProp()
  31. };
  32. const [name, bem] = createNamespace("barrage");
  33. var stdin_default = defineComponent({
  34. name,
  35. props: barrageProps,
  36. emits: ["update:modelValue"],
  37. setup(props, {
  38. emit,
  39. slots
  40. }) {
  41. const barrageWrapper = ref();
  42. const className = bem("item");
  43. const total = ref(0);
  44. const barrageItems = [];
  45. const createBarrageItem = (text, delay = props.delay) => {
  46. const item = document.createElement("span");
  47. item.className = className;
  48. item.innerText = String(text);
  49. item.style.animationDuration = `${props.duration}ms`;
  50. item.style.animationDelay = `${delay}ms`;
  51. item.style.animationName = "van-barrage";
  52. item.style.animationTimingFunction = "linear";
  53. return item;
  54. };
  55. const isInitBarrage = ref(true);
  56. const isPlay = ref(props.autoPlay);
  57. const appendBarrageItem = ({
  58. id,
  59. text
  60. }, i) => {
  61. var _a;
  62. const item = createBarrageItem(text, isInitBarrage.value ? i * props.delay : void 0);
  63. if (!props.autoPlay && isPlay.value === false) {
  64. item.style.animationPlayState = "paused";
  65. }
  66. (_a = barrageWrapper.value) == null ? void 0 : _a.append(item);
  67. total.value++;
  68. const top = (total.value - 1) % +props.rows * item.offsetHeight + +props.top;
  69. item.style.top = `${top}px`;
  70. item.dataset.id = String(id);
  71. barrageItems.push(item);
  72. item.addEventListener("animationend", () => {
  73. emit("update:modelValue", [...props.modelValue].filter((v) => String(v.id) !== item.dataset.id));
  74. });
  75. };
  76. const updateBarrages = (newValue, oldValue) => {
  77. const map = new Map(oldValue.map((item) => [item.id, item]));
  78. newValue.forEach((item, i) => {
  79. if (map.has(item.id)) {
  80. map.delete(item.id);
  81. } else {
  82. appendBarrageItem(item, i);
  83. }
  84. });
  85. map.forEach((item) => {
  86. const index = barrageItems.findIndex((span) => span.dataset.id === String(item.id));
  87. if (index > -1) {
  88. barrageItems[index].remove();
  89. barrageItems.splice(index, 1);
  90. }
  91. });
  92. isInitBarrage.value = false;
  93. };
  94. watch(() => props.modelValue.slice(), (newValue, oldValue) => updateBarrages(newValue != null ? newValue : [], oldValue != null ? oldValue : []), {
  95. deep: true
  96. });
  97. const rootStyle = ref({});
  98. onMounted(() => __async(this, null, function* () {
  99. var _a;
  100. rootStyle.value["--move-distance"] = `-${(_a = barrageWrapper.value) == null ? void 0 : _a.offsetWidth}px`;
  101. yield nextTick();
  102. updateBarrages(props.modelValue, []);
  103. }));
  104. const play = () => {
  105. isPlay.value = true;
  106. barrageItems.forEach((item) => {
  107. item.style.animationPlayState = "running";
  108. });
  109. };
  110. const pause = () => {
  111. isPlay.value = false;
  112. barrageItems.forEach((item) => {
  113. item.style.animationPlayState = "paused";
  114. });
  115. };
  116. useExpose({
  117. play,
  118. pause
  119. });
  120. return () => {
  121. var _a;
  122. return _createVNode("div", {
  123. "class": bem(),
  124. "ref": barrageWrapper,
  125. "style": rootStyle.value
  126. }, [(_a = slots.default) == null ? void 0 : _a.call(slots)]);
  127. };
  128. }
  129. });
  130. export {
  131. barrageProps,
  132. stdin_default as default
  133. };