主页面动画

在这里插入图片描述

<template>
  <div class="home">
    <!-- 背景图 -->
    <div class="images">
      <img src="@/assets/stars.png" ref="stars" class="stars" />
      <img src="@/assets/moon.png" ref="moon" class="moon" />
      <img src="@/assets/behind.png" ref="behind" class="behind" />
      <p ref="txt" class="txt">Moon Light</p>
      <router-link to="./animation">
        <p ref="btn" class="btn">Animation</p>
      </router-link>
      <img src="@/assets/front.png" ref="front" class="front" />
    </div>
    <div class="navBar" ref="navBar">
      <router-link to="./login">
        <i class="logo">Logo</i>
      </router-link>
      <ul>
        <li>
          <router-link to="./login">
            <span>login</span>
          </router-link>
        </li>
        <li>
          <router-link to="./404">
            <span>404</span>
          </router-link>
        </li>
        <li>
          <router-link to="./animation">
            <span>Animation</span>
          </router-link>
        </li>
        <li>
          <router-link to="./loading">
            <span>loading</span>
          </router-link>
        </li>
        <li>
          <router-link to="./button">
            <span>button</span>
          </router-link>
        </li>
        <li>
          <router-link to="./carousel">
            <span>Carousel</span>
          </router-link>
        </li>
        <li>
          <router-link to="./navBar">
            <span>NavBar</span>
          </router-link>
        </li>
      </ul>
    </div>
  </div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
const stars = ref({})
const moon = ref({})
const txt = ref({})
const btn = ref({})
const navBar = ref({})
onMounted(() => {
  // 监听滚动条位置
  window.addEventListener('scroll', scrollTop, true)
}
)
onUnmounted(() => {
  window.removeEventListener('scroll', scrollTop, true)
})
// 实时滚动条高度
const scrollTop = () => {
  const y = document.documentElement.scrollTop || document.body.scrollTop
  stars.value.style.left = y * 0.25 + 'px'
  moon.value.style.top = y * 0.8 + 'px'
  txt.value.style.marginRight = y * 4 + 'px'
  txt.value.style.marginTop = y * 0.8 + 'px'
  btn.value.style.marginTop = y * 1.5 + 'px'
  navBar.value.style.top = y * 0.5 + 'px'
}
</script>
<style scoped lang="less">
.home {
  background: linear-gradient(#2b1055, #7597de);

  .images {
    width: 100%;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    overflow: hidden;
    position: relative;

    .stars {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100vh;
      background: linear-gradient(to top, #1c0522, transparent);
      z-index: 0;
      object-fit: cover;
      pointer-events: none;
    }

    .moon {
      /* 设置图片元素与父容器背景进行混合,图片会变暗 */
      mix-blend-mode: screen;
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100vh;
      object-fit: cover;
      pointer-events: none;
      z-index: 1;
    }

    .behind {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100vh;
      object-fit: cover;
      pointer-events: none;
      z-index: 0;
    }

    .txt {
      position: absolute;
      top: 200px;
      right: -350px;
      color: #fff;
      white-space: nowrap;
      font-size: 60px;
      z-index: 0;
    }

    .btn {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      padding: 8px 30px;
      border-radius: 40px;
      background: #fff;
      color: #2b1055;
      font-size: 1.5em;
      z-index: 1;
    }

    .front {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100vh;
      object-fit: cover;
      pointer-events: none;
      z-index: 2;
    }
  }

  .navBar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    padding: 30px 200px;
    z-index: 1000;

    .logo {
      color: #fff;
      font-size: 35px;
    }

    ul {
      display: flex;
      justify-content: center;
      align-items: center;

      li {
        list-style: none;
        margin-left: 20px;

        span {
          text-decoration: none;
          padding: 6px 15px;
          color: #fff;
          border-radius: 20px;
        }

        span:hover,
        .active {
          background-color: #fff;
          color: #2b1055;
        }
      }
    }
  }

  .content {
    position: relative;
    background: pink;

    h2 {
      font-size: 3.5em;
      margin-bottom: 10px;
      color: #fff;
    }

    p {
      font-size: 1.2em;
      color: #fff;
    }
  }
}
</style>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值