https://mock.ezcomezgo.com/gsap-demo-1/

<template>
<div class="header">
<div class="title">Title</div>
<div class="nav">
<div class="nav-item">nav-item-1</div>
<div class="nav-item">nav-item-2</div>
<div class="nav-item">nav-item-3</div>
<div class="nav-item">nav-item-4</div>
<div class="nav-item">nav-item-5</div>
</div>
<div class="menu">Menu</div>
</div>
<div class="body">
<div class="content">
<div class="title">Title</div>
<div class="desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero eos repellendus aliquam facilis
provident. Similique sapiente, harum obcaecati molestias inventore accusantium eum aliquid nihil suscipit
molestiae laboriosam, aliquam modi ipsum.</div>
</div>
<div class="bgc"></div>
</div>
</template>
<style>
:root {
--bgc: #1c073e;
--header-high: 80px;
--body-heigh: calc(100vh - var(--header-high));
--menu-width: 400px;
--padding-left: 40px;
}
html,
body {
all: unset;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-content: center;
color: #fff;
background-color: var(--bgc);
}
*,
*::before,
*::after {
box-sizing: border-box;
padding: 0;
margin: 0;
text-decoration: none;
list-style: none;
-webkit-user-drag: none;
user-select: none;
}
.header,
.body {
width: 100vw;
padding: 0px var(--padding-left);
overflow: hidden;
}
.header {
height: var(--header-high);
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.body {
height: var(--body-heigh);
}
.header .title {
font-size: 24px;
}
.header .title,
.header .nav {
display: flex;
justify-content: center;
align-items: center;
transition: .3s;
}
.header .nav {
flex-direction: row;
height: calc(var(--header-high) / 2);
}
.header .nav .nav-item {
height: 100%;
display: flex;
justify-content: center;
align-items: center;
min-width: 100px;
position: relative;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.header .nav .nav-item::before {
transition: .3s;
position: absolute;
content: '';
height: 5px;
background-color: rgb(255, 255, 255);
bottom: 0px;
width: 0px;
border-radius: 3px;
}
.header .nav .nav-item:hover::before {
width: 80%;
}
.header .menu {
display: none;
transition: .3s;
}
.body {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
position: relative;
}
.body .content {
position: relative;
z-index: 2;
opacity: 1;
width: 700px;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: flex-start;
flex-wrap: wrap;
}
.body .content .title,
.body .content .desc {
display: flex;
justify-content: center;
align-items: center;
font-size: 22px;
}
.body .content .title {
font-size: 30px;
font-weight: bold;
}
.body .bgc {
width: 100%;
height: 100%;
background-image: url('./assets/elefant.svg');
background-size: 600px 600px;
background-position: 300px;
background-repeat: no-repeat;
}
@media screen and (max-width: 900px) {
.header .menu {
display: block;
}
.header .nav {
width: 100%;
display: none;
}
}
</style>
<script setup>
import gsap from 'gsap'
import { onMounted } from 'vue';
onMounted(() => {
const tween = gsap.timeline({ delay: 0.5 })
tween.from('.header', {
duration: 0.5,
ease: 'power2',
y: -500,
})
tween.from('.body .content', {
duration: 0.8,
ease: 'power2',
y: 200,
opacity: 0
})
tween.from('.body .bgc', {
duration: 1.2,
ease: 'power2',
x: 400,
opacity: 0
})
})
</script>

