更新记录

3.1.0(2023-11-15)

超高性能稳定版 支持安卓及ios


平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.6.0 app-nvue × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

基于 uniapp 开发的仿抖音小程序组件(超高性能)APP双端

  • GIF 帧率不够,实际真机效果非常丝滑

  • 实测,不管加载多少数据也能丝滑滚动

  • 适用于 vue3,vue2 请自行修

  • 自动预加载视频

  • 首次渲染优化

快速开始,下载插件后请按照此方法运行调试

参考 API

属性 类型 默认值 说明
videoList Array - 视频列表,数组对象 {src: string, poster?: string, objectFit?: string}
autoObjectFit Boolean true 是否开启视频频自动自适应平铺模式,竖屏全屏覆盖,横屏自适应居中, 此参数优先级低于 videoList 中的 objectFit
loop Boolean true 是否循环播放视频
controls Boolean false 显示原生控制栏
autoplay Boolean true 是否自动播放
autoChange Boolean false 是否自动滚动播放
loadMoreOffsetCount Number 2 滚动加载阈值(即播放到剩余多少个之后触发加载更多
@play EventHandle - 当开始/继续播放时触发 play 事件
@error EventHandle - 视频播放出错时触发
@ended EventHandle - 当播放到末尾时触发 ended 事件
@loadMore EventHandle - 当滚动到最后第 N 条数据后,需要加载更多时触发
@change EventHandle - 切换视频时触发
@click EventHandle - 点击整个视频区域触发
@controlstoggle EventHandle - 控制栏状态变化触发

Slots 插槽

属性 默认值 说明
default - 自定义内容,覆盖到视频上方的所有自定义内容 v-slot="data" 为当前渲染数据,请参照使用示例

使用示例


<template>
  <div class="video-container">
    <mTikTok
      ref="mTikTokRef"
      :video-list="state.videoList"
      @loadMore="loadMore"
      @change="change"
    >
      <!-- 此处为用户完全自定义 data 中的数据为当前渲染的数据 -->
      <template v-slot="data">
        <view class="video-side-right">
          <view class="action-item action-item-user">
            <image
              class="shop-logo"
              src="https://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?imageMogr2/crop/180x180/gravity/center"
            />
            <view class="action-btn">
              <text class="iconfont">+</text>
            </view>
            <text class="action-item-text"></text>
          </view>
          <view class="action-item">
            <text class="iconfont icon-star11beifen">❤</text>
            <text class="action-item-text">{{ data.item.id }}</text>
          </view>
          <view class="action-item">
            <text class="iconfont icon-share">☝</text>
            <text class="action-item-text">分享</text>
          </view>
        </view>
        <view class="video-bottom-area">
          <view class="shop-name"> @{{ data.item.name }} </view>
          <view class="shop-card">{{ data.item.desc }}</view>
        </view>
      </template>
    </mTikTok>
  </div>
</template>
<script lang="ts" setup>
import { onMounted, reactive, ref } from "vue";
// 导入组件
import mTikTok from "@/components/mTikTok.vue";

const mTikTokRef = ref<InstanceType<typeof mTikTok>>();

const state = reactive({
  videoList: [
    {
      src: "https://xjc.demo.hongcd.com/uploads/20230214/84e165388f5bfdb1550522f50f5a57bb.mp4",
      id: "1",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20230214/3f26d950ac286eecedba49f5295f0819.mp4",
      id: "2",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20230215/8b5ac0420fe61e2f9660d7b8af998f7b.mp4",
      id: "3",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20210128/d932b2d78cebb0a8cb8f9a6216790dfb.mp4",
      id: "4",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20210128/0c64cbeea28b10c06eee8728c762449e.mp4",
      id: "5",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20210327/1b72e1b6153cd29df07f5449991e8083.mp4",
      id: "6",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
    {
      src: "https://xjc.demo.hongcd.com/uploads/20230214/7e1a0baaebc4e656bbbfbc44d7a55a60.mp4",
      id: "7",
      name: "开玩笑的鸡毛",
      desc: "这里是简介内容",
    },
  ],
});

const loadMore = () => {
  // 触发加载更多
  console.log("加载更多");
};

// 切换视频触发,返回当前播放的内容
const change = (e: any) => {
  console.log("🚀 ~ file: index.vue:53 ~ change ~ data:", e);
};

// 播放第几个
const playIndex = (index: number) => {
  mTikTokRef.value?.initSwiperData(index);
};

onMounted(() => {
  // 直接播放第3个
  // playIndex(3);
});
</script>
<style lang="scss">
.video-layer {
  position: absolute;
  right: 12px;
  bottom: 120px;
  color: #fff;
}
.video-bottom-area {
  position: absolute;
  left: 20px;
  bottom: 40px;
  z-index: 999;
  .shop-name {
    color: #fff;
    margin-bottom: 6px;
  }
  .shop-card {
    width: 160px;
    height: 80px;
    background-color: rgba(255, 255, 255, 0.5);
  }
}
.video-side-right {
  position: absolute;
  right: 12px;
  bottom: 120px;
  color: #fff;
  z-index: 999;
  .action-item {
    position: relative;
    margin-bottom: 20px;
    text-align: center;
    .shop-logo {
      width: 40px;
      height: 40px;
      border-radius: 50%;
      overflow: hidden;
    }
    .iconfont {
      display: block;
      font-size: 28px;
    }
    .action-item-text {
      display: block;
      font-size: 12px;
    }
    .action-btn {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
      bottom: -8px;
      width: 20px;
      height: 20px;
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      background-color: #f60;
      .iconfont {
        font-size: 16px;
      }
    }
  }
  .action-item-user {
    margin-bottom: 40px;
  }
}
</style>
item.name).join(' ') }, showActionMenu() { return this.action_menu; }, staticPath() { return _data.staticCircle(); } }, created() { this.init() //隐藏subnvue // uni.getSubNVueById('comment').hide() // uni.getSubNVueById('input-box').hide() }, async mounted() { //this.videoPlay(this.index) // await this.pushVideoList() // this.$nextTick(() => { // this.videoPlay(this.index) // }) // this.$nextTick(() => { // this.videoList.push({ // src:'../../../static/video-test/video_1.mp4', // content:'测试视频1', // flag:true, // check:false, // like:'10w', // comment:'1045', // avater:'http://img.kaiyanapp.com/e44ed5fcfa424ba35761ce5f1339bc16.jpeg?imageMogr2/quality/60/format/jpg', // initialTime:10, // at:'Dcloud', // duration:841, // objectFit:'fill', // produce:'测试视频1' // } // }) uni.getSystemInfo({ success: (res) => { this.Mtscreen = res.windowHeight / 2 + 'px' } }); }, onReady() { plus.navigator.setStatusBarStyle("light"); //只支持dark和light this.selfTop = (uni.getSystemInfoSync().windowHeight / 2) + 150 }, onLoad(e) { this.topNavigate = plus.navigator.hasNotchInScreen() ? '110rpx' : '65rpx' this.user_id = _data.data('user_info').id this.getVideoInfo() this.animation = uni.createAnimation() // 创建动画实例 }, onShow() { this.videoPlay(this.index) }, onHide() { for (let item of this.videoList) { item.flag = false } }, methods: { //设置参数 init() { this.typeX = false //开启左右滑动 this.playCount = 0 //剩余多少视频加载视频列表 this.startDistance = 5 //判断左右上下拖动的启动距离 px this.minTime = 200 //判断快速滑动的时间,该时间内无视回弹距离判断 this.backDistance = 200 //判断上下滑动的回弹距离 px }, getVideoInfo() { const videoUrl = 'http://im.4o1.net/im/circle/getCircleOrds' const params = { _token: uni.getStorageSync('token'), page: this.page } uni.request({ url: videoUrl, data: params, header: { 'Content-Type': 'application/json', //自定义请求头信息 }, method: 'POST', //请求方式,必须为大写 success: (res) => { let getData = res.data console.log(getData); if (getData.msg == 1) { //正常 getData.data.forEach((item, index) => { if (this.isPlay && index == 0) { item.flag = true } else { item.flag = false } item.src = this.staticPath + item.content.video_path item.avatarUrl = 'http://im.4o1.net/' + item.content.value }) this.videoList = [...this.videoList, ...getData.data] console.log(this.videoList); setTimeout(() => { //初始化滑动区域 uni.createSelectorQuery().in(this).selectAll('#coverleft_0') .boundingClientRect((rects) => { if (this.$refs.prodeceProduct_0 == undefined) { this.coverLeftHeight = rects.height - 20 } else { this.coverLeftHeight = rects.height } }).exec(); }, 1000) } } }) }, pushVideoList() { // this.uuid = '' this.page++ this.isPlay = false this.getVideoInfo() }, backListBtn(e) { e.stopPropagation(); uni.navigateBack() }, slideHideView(e) { //滑动隐藏多余区域 this.showSliderControlView = e == 0 ? true : false }, replayActionVideo() { //真正操作重播 clearTimeout(this.isRecommendVideo) }, tapLove(index, uuid) { if (this.distanceX != 0) return const params = { userId: uni.getStorageSync("userId"), uuid } let url = this.videoList[index].likeStatus == 1 ? 'video/cancelLike' : 'video/addLike' getApp().globalData.actionRequest(params, url).then(res => { if (res.data.resultCode == 1) { this.videoList[index].likeStatus = res.data.data.likeStatus this.videoList[index].likeCount = res.data.data.likeCount } else if (res.data.errCode == 401) { this.showDisread = true } }) }, tapAvater(index, item) { if (this.distanceX != 0) return const params = { fanId: uni.getStorageSync("userId"), //当前用户ID userId: item.userId //视频发布者ID } if (item.followStatus == 1) { uni.showModal({ title: '确认不再关注?', content: '', success: res => { if (res.confirm) { getApp().globalData.actionRequest(params, 'user/cancelFollow').then(res => { if (res.data.resultCode == 1) { this.videoList[index].followStatus = res.data.data.followStatus } else if (res.data.errCode == 401) { this.showDisread = true } }) } } }) } else { getApp().globalData.actionRequest(params, 'user/addFollow').then(res => { if (res.data.resultCode == 1) { // item.followStatus = res.data.data.followStatus this.videoList[index].followStatus = res.data.data.followStatus } else if (res.data.errCode == 401) { this.showDisread = true } }) } }, tapMsg(index, uuid) { if (this.distanceX != 0) return if (!this.showComment) { // this.showComment = true this.commentIndex = index this.commentUuid = uuid animation.transition(this.$refs.showComment, { styles: { transform: `translate(0px, 0px)`, }, duration: 200, //ms timingFunction: 'ease-in-out', delay: 0 //ms }, () => { this.showComment = true }) } else { // this.showComment = false animation.transition(this.$refs.showComment, { styles: { transform: `translate(0px, 1000rpx)`, }, duration: 200, //ms timingFunction: 'ease-in-out', delay: 0 //ms }, () => { this.showComment = false }) } }, collectionHandle(video_index, item) { //收藏 const params = { userId: uni.getStorageSync('userId'), uuid: item.uuid } let sendUrl = null if (item.collectionStatus && item.collectionStatus == 1) { sendUrl = 'video/cancelCollection' } else { sendUrl = 'video/addCollection' } getApp().globalData.actionRequest(params, sendUrl).then(res => { if (res.data.resultCode == 1) { this.videoList[video_index].collectionStatus = res.data.data.collectionStatus this.running(res.data.data.collectionStatus) } else if (res.data.errCode == 401) { this.showDisread = true } }) }, tapShare(index, item) { if (this.isPlayCtontrol || this.distanceX != 0) return this.shareInfo(index, item) }, openLabelList(item) { //标签列表 uni.navigateTo({ url: '/pages/index/labelList/labelList?id=' + item.id, animationType: 'slide-in-right', animationDuration: 200 }) }, openHomePage(userId) { const pages = getCurrentPages() if (pages.length > 2) { uni.redirectTo({ //查看更多必须关闭当前页面 url: '/pages/myself/homepage/homepage?userId=' + userId, animationType: 'slide-in-right', animationDuration: 200 }); } else { uni.navigateTo({ url: '/pages/myself/homepage/homepage?userId=' + userId, animationType: 'slide-in-right', animationDuration: 200 }) } }, openAttachDetail(item, type) { //产品 if (this.distanceX != 0) return this.videoPlay(this.index) //暂停视频 this.showDisread = false if (type == 0) { //了解活动 if (uni.getStorageSync("userId") == '') { this.showDisread = true return } setTimeout(() => { uni.navigateTo({ url: '/pages/activity/detail/detail?&uuid=' + item.activityId, animationType: 'slide-in-right', animationDuration: 200 }) }, 200) } else { //了解更多 this.answerBody = false const params = { userId: uni.getStorageSync("userId"), //视频发布者ID productId: item.productId, //产品ID typeId: item.uuid, //媒介ID(比如视频ID,活动ID) type: 0 //媒介类型(0:视频;1:活动) } getApp().globalData.actionRequest(params, 'video/deal').then(res => { if (res.data.resultCode == 1) { this.showCollect = true this.startAnswerAction = true this.questionTitle = res.data.data.content this.questionBtn = res.data.data.type this.questionItem = item //认证成功更新认证当前状态 } else if (res.data.errCode == 401) { this.showDisread = true this.showCollect = false this.startAnswerAction = false } }) } }, openDescText(e) { //展开简介 e.stopPropagation(); this.desctextOverflow = !this.desctextOverflow this.coverLeftHeight = this.desctextOverflow ? this.coverLeftHeight + 40 : this.coverLeftHeight - 40 }, clickHideBody() { this.showDisread = false }, eventClick() { uni.navigateTo({ url: '/pages/myself/login/login', animationType: 'slide-in-right', animationDuration: 200 }) }, //收藏动画 running(status) { // this.shareObj.shareMenu.hide(); // this.shareObj.alphaBg.hide(); this.isCollectText = status == 1 ? true : false this.showColectBody = true setTimeout(() => { animation.transition(this.$refs.imagett, { styles: { transform: 'translateY(-110)', }, duration: 500, //ms timingFunction: 'ease-out', delay: 0 //ms }, res => {}) setTimeout(() => { animation.transition(this.$refs.imagett, { styles: { transform: 'translateY(110)', }, duration: 800, //ms timingFunction: 'ease-in', delay: 0 //ms }, res => {}) // this.showColectBody = false }, 1000) }, 200) }, // 了解更多 moveCollectStop() {}, actionQuestions(e) { //答题 e.stopPropagation(); if (this.questionBtn == 1) { //答题 this.startAnswerAction = false this.answerBody = true } else if (this.questionBtn == '') { //未审核 this.questionFlag = 'success' uni.navigateTo({ url: '/pages/myself/means/means?title=申请认证', animationType: 'slide-in-right', animationDuration: 200 }) } else { this.showCollect = false } }, fatherAnswer() { this.showCollect = false }, hideCollect(e) { e.stopPropagation(); this.showCollect = false this.videoPlay(this.index) //暂停视频 }, shareInfo(video_index, item) { //禁止左滑 // #ifdef APP-PLUS let pages = getCurrentPages(); let page = pages[pages.length - 1]; let currentWebview = page.$getAppWebview() currentWebview.setStyle({ popGesture: 'none' }) // #endif let shareInfo = { href: "https://uniapp.dcloud.io", title: "分享", desc: "分享", imgUrl: "/static/logo.png" }; let shareList = [{ icon: "/static/images/wechat_f.png", text: "微信好友" }, { icon: "/static/images/wechat_m.png", text: "朋友圈" }, // { // icon: "/static/images/qq_f.png", // text: "QQ好友" // }, // { // icon: "/static/images/qq_space.png", // text: "QQ空间" // }, { icon: "/static/images/wei_b.png", text: "微博" }, // { // icon: "/static/images/reportColl.png", // text: this.videoList[video_index].collectionStatus != 1 ? "收藏" : "取消收藏", // }, { icon: "/static/images/share-copyurl.png", text: "复制链接" }, { icon: "/static/images/reportIcon.png", text: "举报" }, { icon: "/static/images/share-mores.png", text: "更多" }, ]; // 判断是否安装某个应用 if (plus.runtime.isApplicationExist({ pname: 'com.tencent.mm', action: 'weixin://' })) { console.log("微信已安装"); } else { console.log("微信未安装"); shareList = shareList.filter((share_item, share_index) => { return share_item.text != '微信好友' && share_item.text != '朋友圈' }) } if (plus.runtime.isApplicationExist({ pname: 'com.sina.weibo', action: 'sinaweibo://' })) { console.log("微博已安装"); } else { console.log("微博未安装"); shareList = shareList.filter((share_item, share_index) => { return share_item.text != '微博' && share_item.text != '微博' }) } this.shareObj = share(shareInfo, shareList, (index) => { this.shareObj.shareMenu.hide(); this.shareObj.alphaBg.hide(); if (uni.getStorageSync('userId') == '') { //先登录才可分享 this.showDisread = true return } let shareObj = { href: item.playAddr || "", title: item.title || "", summary: item.produce || "", success: (res) => { uni.showToast({ title: '分享成功', icon: 'success' }) }, fail: (err) => { console.log("fail:" + JSON.stringify(err)); } } let action_item = shareList.filter((shareItem, shareIndex) => { return index == shareIndex ? shareItem.text : '' }) if (action_item[0].text == '微信好友') { // delete shareObj.href // delete shareObj.summary shareObj.provider = "weixin"; shareObj.scene = "WXSceneSession"; shareObj.type = 0; // shareObj.imageUrl = item.imageAddr || ""; shareObj.imageUrl = 'https://outin-89ea8980612711ebaa8b00163e1c94a4.oss-cn-shanghai.aliyuncs.com/image/default/1F9F3067C82D472789728D18FEC2D287-6-2.jpeg'; shareObj.href = 'http://www.chosentech.vip:1011?userId=' + uni.getStorageSync("userId") + '&uuid=' + item.uuid uni.share(shareObj); } else if (action_item[0].text == '朋友圈') { shareObj.provider = "weixin"; shareObj.scene = "WXSenceTimeline"; shareObj.type = 0; // shareObj.imageUrl = shareInfo.imgUrl || ""; shareObj.imageUrl = 'https://outin-89ea8980612711ebaa8b00163e1c94a4.oss-cn-shanghai.aliyuncs.com/image/default/1F9F3067C82D472789728D18FEC2D287-6-2.jpeg'; shareObj.href = 'https://itunes.apple.com/cn/app/id1573922190' uni.share(shareObj); } else if (action_item[0].text == '微博') { shareObj.provider = "sinaweibo"; shareObj.type = 0; shareObj.imageUrl = item.imageAddr || ""; shareObj.href = 'http://www.chosentech.vip:1010' uni.share(shareObj); } else if (action_item[0].text == '举报') { uni.navigateTo({ url: '/pages/index/report/report?uuid=' + this.uuid + '&type=' + 'video', animationType: 'slide-in-right', animationDuration: 200 }) } else if (action_item[0].text == '复制链接') { uni.setClipboardData({ data: '点击此处下载app观看https://itunes.apple.com/cn/app/id1573922190', complete() { uni.showToast({ title: "已复制到剪贴板" }) } }) } else if (action_item[0].text == '更多') { plus.share.sendWithSystem({ type: 'text', content: item.title + '点击此处下载app观看', href: 'https://itunes.apple.com/cn/app/id1573922190' }, function() { console.log('分享成功'); }, function(e) { console.log('分享失败:' + JSON.stringify(e)); }); } }); this.$nextTick(() => { this.shareObj.alphaBg.show(); this.shareObj.shareMenu.show(); }) }, fatherMethod(addItem) { if (addItem == 'addItem') { this.videoList[this.commentIndex].commentCount++ } else if (addItem == 'hidden') { this.showDisread = true } }, playEnd() { //播放结束弹出相关推荐 this.isReplay = false }, toReplay(e) { //重播 e.stopPropagation(); this.replayActionVideo() this.showRelevRecomVideo = false this.$refs[`video_${this.moveFlagVideo}`][0].toReplayVideo() } } } <style lang="scss" scoped> .page { flex: 1; overflow: hidden; position: relative; background-color: #000; } .swiper { position: relative; background-color: #000; } .left-div { position: absolute; top: 0; justify-content: center; align-items: center; } .right-div { position: absolute; top: 0; justify-content: center; align-items: center; } .title-text { font-size: 16px; color: #000000; } .video-box { position: relative; // background-color: #000; } .cover-view-center { position: fixed; justify-content: center; align-items: center; z-index: 999; } // 视频排行榜 .ranking-title { margin-left: 37rpx; font-size: 12px; color: #C0C0C0; } .ranking-content { width: 750rpx; .ranking-list { .list-items { padding: 0 37rpx; margin-bottom: 37rpx; .items-left { position: relative; flex-direction: row; justify-content: center; align-items: center; height: 178rpx; .ranking-image-items { width: 288rpx; height: 178rpx; border-radius: 22rpx; } .video-time { position: absolute; top: 138rpx; right: 10rpx; z-index: 99; width: 80rpx; // height: 36rpx; padding: 2rpx 2rpx; text-align: center; // line-height: 36rpx; font-size: 20rpx; border-radius: 18rpx; color: #FFFFFF; background-color: rgba(103, 94, 94, 0.6); } } .items-right { flex: 1; flex-direction: column; justify-content: space-between; height: 180rpx; padding-left: 28rpx; .items-right-title { width: 389rpx; text-overflow: ellipsis; lines: 2; overflow: hidden; font-size: 28rpx; color: #FFFFFF; } .items-from { font-size: 24rpx; color: #C0C0C0; } .items-num { flex-direction: row; justify-content: space-between; align-items: center; .items-num-text { font-size: 24rpx; color: #C0C0C0; } } } } } } .cover-view-top { position: fixed; width: 750rpx; height: 150px; overflow: hidden; } .change-screen { position: fixed; margin-left: 19rpx; text-align: center; padding: 19rpx; border-radius: 50%; z-index: 99999; } .cover-view-left { //底部头部信息位置 position: absolute; bottom: 200upx; z-index: 9999; font-size: 16px; color: #FFFFFF; } .cover-left-title { width: 750rpx; position: absolute; bottom: 88upx; z-index: 9999; background: linear-gradient(to top, rgba(0, 0, 0, 0.5) 100%, rgba(0, 0, 0, 0) 0%); } .produce-body { margin-left: 19rpx; // margin-bottom: 27rpx; // flex-direction: row; .cover-produce-img { // margin-right: 12rpx; width: 37rpx; height: 37rpx; } .produce-text { font-size: 25rpx; color: #FFFFFF; // margin-bottom: 20upx; } .produce-activy, .produce-products { flex-direction: row; align-items: center; padding-left: 6rpx; padding-right: 12rpx; padding-top: 6rpx; padding-bottom: 6rpx; border-radius: 6rpx; background-color: rgba(255, 255, 255, .1); } } .cover-left-body { align-items: center; flex-direction: row; height: 50upx; // margin-bottom: 19rpx; } .left-avatar-img { width: 67upx; height: 67upx; opacity: 0.9; border-radius: 50%; } .left-avatar-text { margin-left: 10rpx; margin-right: 23rpx; font-size: 30rpx; color: #FFFFFF; } .left-title-produces { lines: 1; overflow: hidden; position: relative; color: #FFFFFF; font-size: 23rpx; } .header-back-btn { position: fixed; left: 19rpx; width: 38rpx; height: 40rpx; } .header-share-btn { position: absolute; width: 50rpx; height: 54rpx; // right: 10upx; } .left-text { font-size: 27rpx; color: #FFFFFF; margin-bottom: 15upx; } .desc-text { // width: 650rpx; flex: 1; // text-overflow: ellipsis; overflow: hidden; position: relative; line-height: 20px; max-height: 40px; font-size: 23rpx; color: #FFFFFF; } .open-text-btn { flex-direction: row; position: absolute; bottom: 0; right: 0; padding-left: 12rpx; padding-right: 12rpx; padding-top: 8rpx; padding-bottom: 8rpx; font-size: 23rpx; border-radius: 8rpx; background-color: rgba(255, 255, 255, .15); color: #FFFFFF; } .viedo-label { margin-top: 20rpx; flex-direction: row; justify-content: flex-start; flex-wrap: wrap; .viedo-label-view { margin-bottom: 10rpx; margin-right: 20rpx; padding: 6rpx 16rpx; border-radius: 20rpx; background-color: rgba(255, 255, 255, .15); .viedo-label-text { text-align: center; font-size: 22rpx; color: #FFFFFF; } } } .avater { border-radius: 50upx; border-color: #fff; border-style: solid; border-width: 2px; } .cover-view-right { position: absolute; bottom: 190rpx; right: 20upx; z-index: 9999; display: flex; flex-direction: column; align-items: center; } .right-text-avater { position: absolute; font-size: 14px; top: 80upx; left: 30upx; text-align: center; } .avater-icon { height: 40upx; width: 40upx; color: #fff; background-color: #DD524D; border-radius: 50%; position: absolute; left: 30upx; top: -20upx; } .right-text { text-align: center; font-size: 14px; color: #FFFFFF; // margin-bottom: 50upx; height: 20px; } .right-text-mt { // margin-top: 12rpx; margin-bottom: 54rpx; font-size: 27rpx; text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } .img { height: 56rpx; width: 56rpx; } .cover-view-footer { flex-direction: row; justify-content: flex-end; align-items: center; position: absolute; width: 750upx; // bottom: 40upx; z-index: 9999; .cover-footer-time { font-size: 23rpx; color: #626262; } } // 了解更多 .collect-mask { position: fixed; top: 0; right: 0; bottom: 0; left: 0; transition: all 0.3s ease; } .collect-content { position: fixed; right: 0; bottom: 0; left: 0; width: 750rpx; border-top-left-radius: 37rpx; border-top-right-radius: 37rpx; background-color: #232324; .collect-header-title { flex: 1; flex-direction: row; justify-content: center; align-items: center; .collect-header { margin: 37rpx 19rpx; text-align: center; font-size: 30rpx; color: #626262; } .collect-img-left, .collect-img-right { width: 28rpx; height: 4rpx; } } .collect-close-img { margin-right: 37rpx; width: 30rpx; height: 30rpx; } .collect-body { padding: 37rpx 74rpx; .collect-desc { color: #FFFFFF; font-size: 37rpx; } } .conllect-commit-btn { position: fixed; left: 0; right: 0; bottom: 70rpx; padding: 0 74rpx; .commit-btns { height: 92rpx; line-height: 93rpx; } } } </style>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问