Vue3 + Pinia + Vite5 仿抖音,完全度90% . Vue3 + Pinia + Vite5 imitate TikTok with 90% completeness
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

171 lines
4.4 KiB

<template>
<div class="Publish">
<video id="video" autoplay="autoplay" style="width: 100%;height:calc(100% - 6rem);"></video>
<div class="footer">
<SlideRowList v-model:active-index="activeIndex">
<SlideItem style="min-width: 20vw;min-height: 6rem;"></SlideItem>
<SlideItem style="min-width: 20vw;min-height: 6rem;"></SlideItem>
<SlideItem style="min-width: 25vw;min-height: 6rem;" @click="activeIndex = 0">
<span :class="activeIndex + 2 === 2?'active':''">分段拍</span>
</SlideItem>
<SlideItem style="min-width: 20vw;min-height: 6rem;" @click="activeIndex = 1">
<span :class="activeIndex + 2 === 3?'active':''">快拍</span>
</SlideItem>
<SlideItem style="min-width: 20vw;min-height: 6rem;" @click="activeIndex = 2">
<span :class="activeIndex + 2 === 4?'active':''">影集</span>
</SlideItem>
<SlideItem style="min-width: 20vw;min-height: 6rem;" @click="activeIndex = 3">
<span :class="activeIndex + 2 === 5?'active':''">开直播</span>
</SlideItem>
</SlideRowList>
</div>
<div class="float">
<img class="close" src="../../assets/img/icon/close-white.png" alt="" @click="$back">
<div class="choose-music">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>选择音乐</span>
</div>
<div class="toolbar">
<div class="tool" @click.stop="$emit('showComments')">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>翻转</span>
</div>
<div class="tool" @click.stop="$emit('showComments')">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>快慢速</span>
</div>
<div class="tool" @click.stop="$emit('showComments')">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>滤镜</span>
</div>
<div class="tool" @click.stop="$emit('showComments')">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>美化</span>
</div>
<div class="tool" @click.stop="$emit('showComments')">
<img src="../../assets/img/icon/close-white.png" alt="">
<span>倒计时</span>
</div>
</div>
</div>
</div>
</template>
<script>
import {mapState} from "vuex";
export default {
name: "Publish",
data() {
return {
video: null,
activeIndex: 1
}
},
computed: {
...mapState(['bodyHeight', 'bodyWidth'])
},
mounted() {
//获得video摄像头区域
this.video = document.getElementById("video");
this.getMedia()
},
methods: {
getMedia() {
let constraints = {video: {width: this.bodyWidth, height: this.bodyHeight - 60}, audio: false};
let promise = navigator.mediaDevices.getUserMedia(constraints);
promise.then((MediaStream) => {
this.video.srcObject = MediaStream;
this.video.play();
}).catch(function (PermissionDeniedError) {
console.log(PermissionDeniedError);
})
},
},
}
</script>
<style scoped lang="scss">
@import "../../assets/scss/index";
.Publish {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
overflow: auto;
color: white;
background: black;
.footer {
font-size: 1.5rem;
font-weight: bold;
color: $second-text-color;
.base-slide-item {
display: flex;
align-items: center;
}
.active {
color: white;
}
}
.float {
position: fixed;
left: 0;
right: 0;
top: 0;
height: calc(100% - 60px);
.close {
position: absolute;
left: 2rem;
top: 2rem;
width: 2rem;
height: 2rem;
}
.choose-music {
position: absolute;
left: 50%;
top: 2rem;
transform: translateX(-50%);
border-radius: 2rem;
background: #333333;
padding: .5rem 1.5rem;
display: flex;
align-items: center;
img {
margin-right: .5rem;
width: 1.2rem;
height: 1.2rem;
}
}
.toolbar {
position: absolute;
top: 2rem;
right: 1rem;
.tool {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 2rem;
font-size: 1rem;
img {
width: 2rem;
height: 2rem;
margin-bottom: .5rem;
}
}
}
}
}
</style>