Nuxt3 实战 (六):Footer 底部布局

前言

今天开发项目的 Footer 布局,这里我们参考 Nuxt-UI 官网的布局。

需求拆分

  1. 准备好域名备案号和 icp 图标
  2. 底部社交按钮链接或其他链接
  3. 布局组件开发

Footer 布局

  1. 新建 components/AppFooter.vue 文件:
<template>
 <footer class="fixed bottom-0 w-full">
   <UDivider :avatar="{ src: '/logo.svg' }" />
   <div class="flex justify-between items-center px-4 md:px-8 lg:px-32 py-3 max-sm:flex-col -mt-2.5">
     <!-- icp 备案 -->
     <ULink
       to="https://beian.miit.gov.cn/#/Integrated/index"
       target="_blank"
       active-class="text-primary"
       inactive-class="text-sm text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
     >
       <div class="flex items-center gap-2">
         <NuxtImg
           src="/icp.png"
           alt="粤ICP备2023007649号-3"
           class="w-4"
         />ICP2023007649-3
       </div>
     </ULink>
     <!-- 社交图标 -->
     <div class="max-sm:order-first">
       <!-- github -->
       <SocialButton
         icon="i-ri-github-line"
         url="https://github.com/baiwumm"
         tip="Github"
       />
       <!-- 微信 -->
       <SocialButton
         icon="i-ri-wechat-line"
         url="https://wechat.baiwumm.com/"
         tip="微信"
       />
       <!-- 电子邮箱 -->
       <SocialButton
         icon="i-ri-mail-line"
         url="mailto:baiwumm@foxmail.com"
         tip="Email"
       />
       <!-- 博客 -->
       <SocialButton
         icon="i-ri-quill-pen-line"
         url="https://baiwumm.com"
         tip="博客"
       />
     </div>
   </div>
 </footer>
</template>
  1. layouts/default.vue 文件配置组件:
<template>
 <div>
   <!-- header -->
   <AppHeader />
   <!-- main -->
   <slot />
   <!-- footer -->
   <AppFooter />
 </div>
</template>
  1. 这里我们顺便给 AppColorMode 组件加个切换过渡动画,让网站丰富一点:
 <script setup lang="ts">
 const colorMode = useColorMode()

 // 切换模式
 const setColorMode = () => {
   colorMode.value = colorMode.value === 'dark' ? 'light' : 'dark'
 }

 // 判断是否支持 startViewTransition API
 const enableTransitions = () =>
   'startViewTransition' in document &&
   window.matchMedia('(prefers-reduced-motion: no-preference)').matches

 // 切换动画
 async function toggleDark({ clientX: x, clientY: y }: MouseEvent) {
   const isDark = colorMode.value === 'dark'

   if (!enableTransitions()) {
     setColorMode()
     return
   }

   const clipPath = [
     `circle(0px at ${x}px ${y}px)`,
     `circle(${Math.hypot(
       Math.max(x, innerWidth - x),
       Math.max(y, innerHeight - y)
     )}px at ${x}px ${y}px)`
   ]

   await document.startViewTransition(async () => {
     setColorMode()
     await nextTick()
   }).ready

   document.documentElement.animate(
     { clipPath: !isDark ? clipPath.reverse() : clipPath },
     {
       duration: 300,
       easing: 'ease-in',
       pseudoElement: `::view-transition-${!isDark ? 'old' : 'new'}(root)`
     }
   )
 }
 </script>

 <template>
   <UTooltip :text="`切换${$colorMode.value === 'dark' ? '白天' : '黑夜'}模式`">
     <UButton
       :icon="$colorMode.value === 'dark' ? 'i-heroicons-moon-solid' : ' i-heroicons-sun-solid'"
       size="sm"
       variant="ghost"
       class="text-gray-700 dark:text-gray-200 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-800"
       @click="toggleDark"
     />
   </UTooltip>
 </template>

 <style>
 ::view-transition-old(root),
 ::view-transition-new(root) {
   animation: none;
   mix-blend-mode: normal;
 }

 ::view-transition-old(root),
 .dark::view-transition-new(root) {
   z-index: 1;
 }

 ::view-transition-new(root),
 .dark::view-transition-old(root) {
   z-index: 9999;
 }
 </style>

最终效果

在这里插入图片描述

总结

这个篇章内容比较简单,下一篇开发主体内容。

好了,今天就到这吧!

Github 仓库dream-site

线上预览dream-site.cn

相关推荐

  1. footer置于页面最底部

    2024-04-29 20:10:07       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 20:10:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 20:10:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 20:10:07       87 阅读
  4. Python语言-面向对象

    2024-04-29 20:10:07       96 阅读

热门阅读

  1. 如何在虚拟专用服务器上配置 Nginx Web 服务器

    2024-04-29 20:10:07       39 阅读
  2. SpringBoot Redis使用篇

    2024-04-29 20:10:07       30 阅读
  3. Linux学习阶段划分及学习方法

    2024-04-29 20:10:07       33 阅读
  4. 泽尼克波前拟合 matlab

    2024-04-29 20:10:07       25 阅读
  5. MATLAB初学者入门(18)—— 近邻算法

    2024-04-29 20:10:07       35 阅读
  6. 边缘计算概述_5.边缘计算应用场景

    2024-04-29 20:10:07       32 阅读
  7. mac 安装 python3

    2024-04-29 20:10:07       29 阅读
  8. 计算机网络 2.4差错检验与校正

    2024-04-29 20:10:07       33 阅读
  9. springboot常用注释

    2024-04-29 20:10:07       37 阅读
  10. echarts 旭日图 层级嵌套 子级完全继承父级颜色

    2024-04-29 20:10:07       33 阅读
  11. TP8 利用jwt 生成token

    2024-04-29 20:10:07       31 阅读
  12. Nginx自定义状态码499出现原因

    2024-04-29 20:10:07       32 阅读