vue3实现video视频+弹幕评论

vue3实现视频加评论

之前写了一篇博客使用了弹幕插件http://t.csdnimg.cn/616mlvue3 使用弹幕插件,今天对这个页面进行了升级

变成了

vue3使用video

这个没有使用插件,昨天看了好多,没发现有用的插件,下载了几个都没办法使用就用了原生

javascript 复制代码
<video controls class="backgroundImg">
          <source src="../../assets/image/book.mp4" type="video/mp4" />
          你的浏览器不支持视频标签。
        </video>

vue3使用弹幕

弹幕还是用了之前那个文章里面的插件

注意

1.使用弹幕的时候记得层级关系,弹幕的层级一定是高于视频的,否则视频就会压着弹幕,弹幕显示不出来,所以把弹幕的层级提高就好了,

2.弹幕的范围一定是小于视频的,既然弹幕的层级高了,那么就是压着视频的,如果弹幕的范围和视频的范围一样大或者视频的范围小于弹幕,那么鼠标就触碰不到视频了,所以弹幕的范围一定是小于视频的吗

隐藏弹幕的实现

之前是通过button来实现隐藏,现在通过switch开关实现,那么就没办法直接调用官方文档的方法,只能曲线调动通过watch监测滑块的开关,来判断是调用哪个方法,但是有个缺点,使用watch,第一次改变值,无法自动调用函数,没发现哪里我写错了,于是我在onMounted的时候自己调用了一次,后面就监视到了,就能调用函数了

javascript 复制代码
onMounted(() => {
  
  value1.value = true;
});


watch(value1, (newValue, OldValue, onCleanup) => {
  console.log(newValue);
  onCleanup(() => {
    console.log("111111");
    if (!newValue) {
      // 如果 newValue 为 false
      danmaku.value.show();
    } else {
      danmaku.value.hide();
    }
  });
});

控制弹幕速度那里我偷了一个懒,没有改变弹幕的详细速度,滑块的速度改变时假的,弹幕的速度虽然改变了,但是改变的不够精细,我让滑块大于50的时候速度+20,小于50了速度-20,没有实现确切的弹幕速度控制,有人想要写的话,可以帮忙改进一下

javascript 复制代码
watch(speed, (newValue, OldValue, onCleanup) => {
  onCleanup(() => {
    if (newValue > 50) {
      // 如果 newValue 为 false
      addspeeds();
    } else {
      jianspeeds();
    }
  });
});


//弹幕加速
const addspeeds = () => {
  speeds.value += 20;
  console.log(speeds.value);
};
//弹幕减速
const jianspeeds = () => {
  speeds.value -= 20;
  console.log(speeds.value);
};

页面完整代码

javascript 复制代码
<template>
  <div class="big">
    <el-card shadow="always">
      <div>
        <video controls class="backgroundImg">
          <source src="../../assets/image/book.mp4" type="video/mp4" />
          你的浏览器不支持视频标签。
        </video>
      </div>

      <vue-danmaku
        v-model:danmus="danmus"
        loop
        style="height: 25rem; width: 78rem;   
            color: white; /* 白色文字 */  
            text-shadow:   
                -1px -1px 0 black,  
                1px -1px 0 black,  
                -1px 1px 0 black,  
                1px 1px 0 black; /* 黑色边缘 */  
            font-size: 40px; /* 字体大小 */  
        } "
        ref="danmaku"
        :speeds="speeds"
      ></vue-danmaku>
      <div class="buts">
        <el-popover :visible="visible" placement="top-start" :width="200">
          <span class="demonstration">弹幕速度控制</span>
          <el-slider v-model="speed" />
          <template #reference>
            <el-icon style="font-size: 28px" @click="hide()"><Setting /></el-icon>
          </template>
        </el-popover>

        
      </div>
      <div class="left">
        <el-input
          v-model="input"
          style="width: 200px; margin-right: 10px"
          placeholder="快来发表你的评论吧"
        />
        <el-button round @click="addComment" style="margin-right: 20px">发表</el-button>

        <el-switch v-model="value1" />
        <br />
      </div>
    </el-card>
  </div>
</template>

<script setup>
import vueDanmaku from "vue3-danmaku";
import { ref, onMounted, reactive, watch } from "vue";
import { getComments, postComments } from "../../api/api";

const speed = ref(50);
const speeds = ref(150);
//内容
const danmus = ref([]);
const value1 = ref(false);

onMounted(() => {
  getdata();
  value1.value = true;
});

const input = ref("");

const visible = ref(false);
//弹幕组件
const danmaku = ref(null);

watch(value1, (newValue, OldValue, onCleanup) => {
  console.log(newValue);
  onCleanup(() => {
    console.log("111111");
    if (!newValue) {
      // 如果 newValue 为 false
      danmaku.value.show();
    } else {
      danmaku.value.hide();
    }
  });
});

watch(speed, (newValue, OldValue, onCleanup) => {
  onCleanup(() => {
    if (newValue > 50) {
      // 如果 newValue 为 false
      addspeeds();
    } else {
      jianspeeds();
    }
  });
});
//继续播放弹幕
const dplay = () => {
  danmaku.value.play();
};
//暂停播放弹幕
const pause = () => {
  danmaku.value.pause();
};
//显示弹幕
const show = () => {
  danmaku.value.show();
};
//隐藏弹幕
const hide = () => {
  visible.value = !visible.value;
};
//弹幕加速
const addspeeds = () => {
  speeds.value += 20;
  console.log(speeds.value);
};
//弹幕减速
const jianspeeds = () => {
  speeds.value -= 20;
  console.log(speeds.value);
};
const getdata = () => {
  getComments()
    .then(res => {
      danmus.value = res.data.map(message => {
        return message.commentMessage;
        // 返回每个消息的 commentMessage 属性
      });
      console.log(res.data, "111");
      ElMessage({
        message: "获取信息成功",
        type: "success",
      });
    })
    .catch(err => {
      console.log(err, "err");
      ElMessage.error("获取信息失败");
    });
};

const addComment = () => {
  let comment = {
    commentMessage: input.value,
  };

  postComments(comment)
    .then(res => {
      console.log(res.data, "111");
      input.value = " ";
      ElMessage({
        message: "发布评论成功",
        type: "success",
      });
    })
    .catch(err => {
      console.log(err, "err");
      ElMessage.error("发布失败");
    });
  getdata();
};
</script>

<style scoped>
.big {
  position: relative;
}
.backgroundImg {
  position: absolute;
  height: 30rem;
  width: 77rem;
}
.buts {
  position: absolute;
  right: 50px;
  margin-top: 95px;
}
.left {
  margin-top: 95px;
}
</style>
相关推荐
美狐美颜SDK开放平台1 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
Csvn1 小时前
运行时性能
前端
Never_every992 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
企业数字化笔记3 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
paopaokaka_luck3 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖3 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
昨日之日20064 小时前
MiniMax-H3 V7(FastH3 Omni):8步生成带声视频,比原版快近10倍。参考图、视频、声音全都能用!
人工智能·计算机视觉·音视频·1024程序员节
欣欣之王来了5 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒5 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师5 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端