vue3项目中的404页面
春节前的最后一篇技术博客了
写了不少vue项目,发现一直没有正确处理404页面。404页面的出现有这么几种可能:
- 错误输入了页面地址
- 路由连接跳转时,某些路由已经不存在了,而程序员并没有正确处理
也就是说404页面是为了防止用户访问不存在的路由地址而设计的,当用户访问一个不存在的地址时,这个地址将会重定向至404页面
看一下最后的效果:
一、路由设计
在vue项目中,需要设计404页面的路由
在路由文件router/index.js中编写代码:
import { createRouter, createWebHistory } from "vue-router";
import Main from "@/views/Main.vue";const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{// 其他路由},// 路由页面{path: '/404',name: '404page',component: () => import('@/views/404/index.vue'),},// 未知路由重定向{path: '/:pathMatch(.*)',redirect: '/404',hidden: true}],
});export default router;
二、404组件
直接上代码了
<template><div class="body"><div class="mars"></div><img src="./images/404.svg" class="logo-404"><img src="./images/meteor.svg" class="meteor"><p class="title">Oh no!!</p><p class="subtitle">页面未找到<br>要么请求一个不再在这里的页面。</p><div align="center"><a class="btn-back" href="/">返回首页</a></div><img src="./images/astronaut.svg" class="astronaut"><img src="./images/spaceship.svg" class="spaceship"></div>
</template><script setup>
</script><style lang="scss" scoped>
@keyframes floating {from {transform: translateY(0px);}65% {transform: translateY(15px);}to {transform: translateY(0px);}
}.body {background-image: url("./images/star.svg"), linear-gradient(to bottom, #05007A, #4D007D);height: 100vh;margin: 0;background-attachment: fixed;overflow: hidden;
}.mars {left: 0;right: 0;bottom: 0;position: absolute;height: 27vmin;background: url("./images/mars.svg") no-repeat bottom center;background-size: cover;
}.logo-404 {position: absolute;margin-left: auto;margin-right: auto;left: 0;right: 0;top: 16vmin;width: 30vmin;
}@media (max-width: 480px) and (min-width: 320px) {.logo-404 {top: 45vmin;}
}.meteor {position: absolute;right: 2vmin;top: 16vmin;
}.title {color: white;font-family: "Nunito", sans-serif;font-weight: 600;text-align: center;font-size: 5vmin;margin-top: 31vmin;
}@media (max-width: 480px) and (min-width: 320px) {.title {margin-top: 65vmin;}
}.subtitle {color: white;font-family: "Nunito", sans-serif;font-weight: 400;text-align: center;font-size: 3.5vmin;margin-top: 10vmin;margin-bottom: 9vmin;
}.btn-back {border: 1px solid white;color: white;height: 5vmin;padding: 12px;font-family: "Nunito", sans-serif;text-decoration: none;border-radius: 5px;
}.btn-back:hover {background: white;color: #4D007D;
}@media (max-width: 480px) and (min-width: 320px) {.btn-back {font-size: 3.5vmin;}
}.astronaut {position: absolute;top: 18vmin;left: 10vmin;height: 30vmin;animation: floating 3s infinite ease-in-out;
}@media (max-width: 480px) and (min-width: 320px) {.astronaut {top: 2vmin;}
}.spaceship {position: absolute;bottom: 15vmin;right: 24vmin;
}@media (max-width: 480px) and (min-width: 320px) {.spaceship {width: 45vmin;bottom: 18vmin;}
}</style>
页面的动画效果主要由样式中的keyframes提供,而图像全都由相应的svg文件提供,svg文件我已经免费上传了
svg文件