|
@@ -1,18 +1,180 @@
|
|
|
<template>
|
|
|
- <div class="home">
|
|
|
- <img alt="Vue logo" src="../assets/logo.png">
|
|
|
- <HelloWorld msg="Welcome to Your Vue.js App"/>
|
|
|
+ <div
|
|
|
+ class="home"
|
|
|
+ draggable="false"
|
|
|
+ @mousedown="onMouseDown"
|
|
|
+ @mousemove="onMouseMove"
|
|
|
+ @mouseup="onMouseUp"
|
|
|
+ @wheel.passive="onWheel"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ class="landscape"
|
|
|
+ src="@/assets/landscape.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ class="people-far"
|
|
|
+ :style="{
|
|
|
+ right: peopleFarPositionRight,
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ src="@/assets/people-far-no-color.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <img
|
|
|
+ class="people-near"
|
|
|
+ :style="{
|
|
|
+ right: peopleNearPositionRight,
|
|
|
+ }"
|
|
|
+ src="@/assets/people-near.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ class="introduce"
|
|
|
+ :style="{
|
|
|
+ left: introducePositionLeft,
|
|
|
+ }"
|
|
|
+ src="@/assets/introduce.png"
|
|
|
+ alt=""
|
|
|
+ draggable="false"
|
|
|
+ >
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-// @ is an alias to /src
|
|
|
-import HelloWorld from '@/components/HelloWorld.vue'
|
|
|
-
|
|
|
export default {
|
|
|
name: 'HomeView',
|
|
|
components: {
|
|
|
- HelloWorld
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ landscapePositionRight: '-50%',
|
|
|
+ peopleFarPositionRight: '0px',
|
|
|
+ peopleNearPositionRight: '-30%',
|
|
|
+ introducePositionLeft: '2%',
|
|
|
+ translateLength: 0,
|
|
|
+ isMouseDown: false,
|
|
|
+
|
|
|
+ moveSpeed: 0,
|
|
|
+ lastMoveEventTimeStamp: 0,
|
|
|
+ lastAnimationTimeStamp: 0,
|
|
|
+ animationFrameId: null,
|
|
|
+
|
|
|
+ lastMoveEventX: 0,
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ translateLength: {
|
|
|
+ handler(v) {
|
|
|
+ console.log(v)
|
|
|
+ if (v > 0) {
|
|
|
+ v = 0
|
|
|
+ this.translateLength = v
|
|
|
+ this.moveSpeed = 0
|
|
|
+ } else if (v < -window.innerWidth * 2) {
|
|
|
+ v = -window.innerWidth * 2
|
|
|
+ this.translateLength = v
|
|
|
+ this.moveSpeed = 0
|
|
|
+ }
|
|
|
+ this.peopleFarPositionRight = `calc(0px - ${v * 0.2}px)`
|
|
|
+ this.peopleNearPositionRight = `calc(-30% - ${v * 0.8}px)`
|
|
|
+ this.introducePositionLeft = `calc(2% + ${v * 1}px)`
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.animationFrameId = requestAnimationFrame(this.inertanceEffect)
|
|
|
+ },
|
|
|
+ unmounted() {
|
|
|
+ cancelAnimationFrame(this.animationFrameId)
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ onMouseDown(e) {
|
|
|
+ this.isMouseDown = true
|
|
|
+ this.moveSpeed = 0
|
|
|
+ this.lastMoveEventTimeStamp = 0
|
|
|
+ this.lastAnimationTimeStamp = Date.now()
|
|
|
+ },
|
|
|
+ onMouseUp(e) {
|
|
|
+ this.isMouseDown = false
|
|
|
+ },
|
|
|
+ onMouseMove(e) {
|
|
|
+ if (this.isMouseDown) {
|
|
|
+ if (this.lastMoveEventTimeStamp) {
|
|
|
+ const currentMoveSpeed = e.movementX / (e.timeStamp - this.lastMoveEventTimeStamp)
|
|
|
+ this.moveSpeed = this.moveSpeed * 0.9 + currentMoveSpeed * 0.1
|
|
|
+ }
|
|
|
+ this.lastMoveEventTimeStamp = e.timeStamp
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onWheel(e) {
|
|
|
+ this.translateLength -= e.deltaY
|
|
|
+ },
|
|
|
+ inertanceEffect() {
|
|
|
+ const timeStamp = Date.now()
|
|
|
+ const timeElapsed = timeStamp - this.lastAnimationTimeStamp
|
|
|
+ if (this.moveSpeed > 0) {
|
|
|
+ this.moveSpeed -= 0.003 * timeElapsed
|
|
|
+ if (this.moveSpeed < 0) {
|
|
|
+ this.moveSpeed = 0
|
|
|
+ }
|
|
|
+ } else if (this.moveSpeed < 0) {
|
|
|
+ this.moveSpeed += 0.003 * timeElapsed
|
|
|
+ if (this.moveSpeed > 0) {
|
|
|
+ this.moveSpeed = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.translateLength += this.moveSpeed * timeElapsed
|
|
|
+
|
|
|
+ this.lastAnimationTimeStamp = timeStamp
|
|
|
+ this.animationFrameId = requestAnimationFrame(this.inertanceEffect)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+.home {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ background-image: url(@/assets/background.jpg);
|
|
|
+ background-repeat: repeat;
|
|
|
+ background-size: contain;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ user-select: none;
|
|
|
+ .landscape {
|
|
|
+ height: 30%;
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ right: 0;
|
|
|
+ user-select: none;
|
|
|
+ }
|
|
|
+ .people-far {
|
|
|
+ position: absolute;
|
|
|
+ top: 20%;
|
|
|
+ height: 60%;
|
|
|
+ user-select: none;
|
|
|
+ > img {
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .people-near {
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ height: 90%;
|
|
|
+ user-select: none;
|
|
|
+ }
|
|
|
+ .introduce {
|
|
|
+ position: absolute;
|
|
|
+ top: 5%;
|
|
|
+ user-select: none;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|