|
|
@@ -1,6 +1,17 @@
|
|
|
<template>
|
|
|
<view class="dmBody" :class="classes">
|
|
|
- <view class="dmContainer" id="dmContainer">
|
|
|
+ <div ref="dmContainer" class="dmContainer slotContainer" v-if="$slots.default">
|
|
|
+ <slot></slot>
|
|
|
+ <view
|
|
|
+ v-for="(item, index) of danmuListSlots"
|
|
|
+ :key="'danmu' + index"
|
|
|
+ :class="['dmitem', 'dmitem' + danmuList.length + index, 'move']"
|
|
|
+ :style="styleList[index]"
|
|
|
+ >
|
|
|
+ {{ item.length > 8 ? item.substr(0, 8) + '...' : item }}
|
|
|
+ </view>
|
|
|
+ </div>
|
|
|
+ <view class="dmContainer" id="dmContainer" v-else>
|
|
|
<view
|
|
|
v-for="(item, index) of danmuList"
|
|
|
:key="'danmu' + index"
|
|
|
@@ -13,18 +24,7 @@
|
|
|
</view>
|
|
|
</template>
|
|
|
<script lang="ts">
|
|
|
-import {
|
|
|
- computed,
|
|
|
- onMounted,
|
|
|
- ref,
|
|
|
- reactive,
|
|
|
- toRefs,
|
|
|
- watch,
|
|
|
- nextTick,
|
|
|
- onUnmounted,
|
|
|
- onDeactivated,
|
|
|
- getCurrentInstance
|
|
|
-} from 'vue';
|
|
|
+import { computed, onMounted, ref, reactive, watch, onUnmounted, onDeactivated, useSlots } from 'vue';
|
|
|
import { createComponent } from '@/packages/utils/create';
|
|
|
import Taro from '@tarojs/taro';
|
|
|
const { componentName, create } = createComponent('barrage');
|
|
|
@@ -41,7 +41,7 @@ export default create({
|
|
|
},
|
|
|
speeds: {
|
|
|
type: Number,
|
|
|
- default: 2000
|
|
|
+ default: 800
|
|
|
},
|
|
|
rows: {
|
|
|
type: Number,
|
|
|
@@ -58,9 +58,12 @@ export default create({
|
|
|
},
|
|
|
emits: ['click'],
|
|
|
|
|
|
- setup(props, { emit }) {
|
|
|
+ setup(props, { slots }) {
|
|
|
+ const slotDefault = !!useSlots().default;
|
|
|
+
|
|
|
const timeId = ref(new Date().getTime());
|
|
|
- const danmuList = ref<any[]>(props.danmu);
|
|
|
+ const danmuList = ref<any>(props.danmu);
|
|
|
+ const danmuListSlots = ref<any>([]);
|
|
|
const rows = ref<number>(props.rows);
|
|
|
const top = ref<number>(props.top);
|
|
|
const speeds = props.speeds;
|
|
|
@@ -74,7 +77,12 @@ export default create({
|
|
|
});
|
|
|
|
|
|
onMounted(() => {
|
|
|
- runStep();
|
|
|
+ if (slotDefault) {
|
|
|
+ danmuList.value = slots?.default?.();
|
|
|
+ runStep();
|
|
|
+ } else {
|
|
|
+ runStep();
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
@@ -87,7 +95,7 @@ export default create({
|
|
|
|
|
|
watch(
|
|
|
() => props.danmu,
|
|
|
- (newValue, oldVlaue) => {
|
|
|
+ (newValue) => {
|
|
|
danmuList.value = [...newValue];
|
|
|
}
|
|
|
);
|
|
|
@@ -96,8 +104,7 @@ export default create({
|
|
|
danmuList.value = [...danmuList.value, word];
|
|
|
runStep();
|
|
|
};
|
|
|
-
|
|
|
- const getNode = (index) => {
|
|
|
+ const getNode = (index: number) => {
|
|
|
const query = Taro.createSelectorQuery();
|
|
|
setTimeout(() => {
|
|
|
let width = 100;
|
|
|
@@ -106,36 +113,49 @@ export default create({
|
|
|
});
|
|
|
query
|
|
|
.select('.dmitem' + index)
|
|
|
- .boundingClientRect((recs: any) => {
|
|
|
+ .boundingClientRect((recs) => {
|
|
|
let height = recs.height;
|
|
|
let nodeTop = (index % rows.value) * (height + top.value) + 20 + 'px';
|
|
|
styleInfo(index, nodeTop, width);
|
|
|
})
|
|
|
.exec();
|
|
|
- // let ele = document.getElementsByClassName('dmitem'+index)[0];
|
|
|
- // let transitionFlag = false;
|
|
|
- // ele.addEventListener('animationend', (e:any) => {
|
|
|
- // if(e.target.id === e.currentTarget.id && transitionFlag) {
|
|
|
- // transitionFlag = false;
|
|
|
- // // deleteNode(index)
|
|
|
- // }else {
|
|
|
- // transitionFlag = true;
|
|
|
- // }
|
|
|
- // }, false);
|
|
|
}, 500);
|
|
|
};
|
|
|
|
|
|
const runStep = () => {
|
|
|
- danmuList.value.forEach((item, index) => {
|
|
|
- getNode(index);
|
|
|
+ danmuList.value.forEach((item, index: number) => {
|
|
|
+ let el = danmuList.value[index]?.el;
|
|
|
+ if (!el) {
|
|
|
+ danmuListSlots.value.push(item);
|
|
|
+ let l = slotDefault ? String(danmuList.value.length) : '';
|
|
|
+ let s = l + danmuListSlots.value.indexOf(item);
|
|
|
+ getNode(Number(s));
|
|
|
+ } else {
|
|
|
+ if (el?.classList.contains('dmitem')) {
|
|
|
+ el.classList.remove('dmitem');
|
|
|
+ }
|
|
|
+ if (el?.classList.contains('dmitem' + index)) {
|
|
|
+ el.classList.remove('dmitem' + index);
|
|
|
+ }
|
|
|
+ if (slotDefault && el) {
|
|
|
+ if (el?.classList.contains('move')) {
|
|
|
+ el.classList.remove('move');
|
|
|
+ }
|
|
|
+ el.classList.add('.move');
|
|
|
+ }
|
|
|
+ el.classList.add('.dmitem .dmitem' + index);
|
|
|
+ getNode(index);
|
|
|
+ }
|
|
|
});
|
|
|
};
|
|
|
- let styleList = reactive([]);
|
|
|
- const styleInfo = (index, nodeTop, width) => {
|
|
|
- let n = Math.floor(Math.random() * (10 - 5)) + 5;
|
|
|
+ const distance = ref('0');
|
|
|
+ let styleList: any[] = reactive([]);
|
|
|
+ const styleInfo = (index: number, nodeTop: string, width: number) => {
|
|
|
+ // let n = Math.floor(Math.random() * (10 - 5)) + 5;
|
|
|
let timeIndex = index - rows.value > 0 ? index - rows.value : 0;
|
|
|
let list = styleList;
|
|
|
let time = list[timeIndex] ? Number(list[timeIndex]['--time']) : 0;
|
|
|
+ distance.value = '-' + (speeds / 1000) * 200 + '%';
|
|
|
|
|
|
let obj = {
|
|
|
top: nodeTop,
|
|
|
@@ -145,10 +165,34 @@ export default create({
|
|
|
animationDelay: `${props.frequency * index + time}ms`,
|
|
|
'--move-distance': `-${width}px`
|
|
|
};
|
|
|
- styleList.push(obj);
|
|
|
+ if (slotDefault && danmuList.value[index]?.el) {
|
|
|
+ let orginalSty = danmuList.value[index].el.style;
|
|
|
+ danmuList.value[index].el.style = Object.assign(orginalSty, obj);
|
|
|
+ } else {
|
|
|
+ styleList.push(obj);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
- return { classes, danmuList, add, styleList };
|
|
|
+ return { classes, danmuList, add, styleList, distance, danmuListSlots };
|
|
|
}
|
|
|
});
|
|
|
</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+@keyframes moving {
|
|
|
+ from {
|
|
|
+ transform: translateX(100%);
|
|
|
+ }
|
|
|
+ to {
|
|
|
+ transform: translateX(v-bind('distance'));
|
|
|
+ }
|
|
|
+}
|
|
|
+@-webkit-keyframes moving {
|
|
|
+ from {
|
|
|
+ -webkit-transform: translateX(100%);
|
|
|
+ }
|
|
|
+ to {
|
|
|
+ transform: translateX(v-bind('distance'));
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|