feat: 移动端添加发帖悬浮按钮

This commit is contained in:
CH-122
2025-08-15 10:59:29 +08:00
parent ba073b71a6
commit 24cbed2eda
2 changed files with 33 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
<template> <template>
<div id="app"> <div id="app">
<div class="header-container"> <div class="header-container">
<HeaderComponent <HeaderComponent
ref="header" ref="header"
@@ -9,12 +10,17 @@
</div> </div>
<div class="main-container"> <div class="main-container">
<div class="menu-container" v-click-outside="handleMenuOutside"> <div class="menu-container" v-click-outside="handleMenuOutside">
<MenuComponent :visible="!hideMenu && menuVisible" @item-click="menuVisible = false" /> <MenuComponent :visible="!hideMenu && menuVisible" @item-click="menuVisible = false" />
</div> </div>
<div class="content" :class="{ 'menu-open': menuVisible && !hideMenu }"> <div class="content" :class="{ 'menu-open': menuVisible && !hideMenu }">
<NuxtPage keepalive /> <NuxtPage keepalive />
</div> </div>
<div v-if='!menuVisible && route.path !== "/new-post"' class="new-post-icon" @click="goToNewPost">
<i class="fas fa-edit"></i>
</div>
</div> </div>
<GlobalPopups /> <GlobalPopups />
</div> </div>
@@ -23,8 +29,8 @@
<script> <script>
import HeaderComponent from '~/components/HeaderComponent.vue' import HeaderComponent from '~/components/HeaderComponent.vue'
import MenuComponent from '~/components/MenuComponent.vue' import MenuComponent from '~/components/MenuComponent.vue'
import GlobalPopups from '~/components/GlobalPopups.vue' import GlobalPopups from '~/components/GlobalPopups.vue'
import { useIsMobile } from '~/utils/screen'
export default { export default {
name: 'App', name: 'App',
@@ -32,6 +38,8 @@ export default {
setup() { setup() {
const isMobile = useIsMobile() const isMobile = useIsMobile()
const menuVisible = ref(!isMobile.value) const menuVisible = ref(!isMobile.value)
const route = useRoute()
const hideMenu = computed(() => { const hideMenu = computed(() => {
return [ return [
'/login', '/login',
@@ -65,12 +73,16 @@ export default {
} }
} }
return { menuVisible, hideMenu, handleMenuOutside, header } const goToNewPost = () => {
navigateTo('/new-post', { replace: false })
}
return { menuVisible, hideMenu, handleMenuOutside, header, route, goToNewPost }
}, },
} }
</script> </script>
<style src="~/assets/global.css"></style> <style src="~/assets/global.css"></style>
<style> <style scoped>
.header-container { .header-container {
position: fixed; position: fixed;
top: 0; top: 0;
@@ -103,6 +115,22 @@ export default {
margin: 0 auto; margin: 0 auto;
} }
.new-post-icon {
background-color: var(--primary-color);
width: 40px;
height: 40px;
border-radius: 50%;
position: fixed;
bottom: 40px;
right: 20px;
font-size: 20px;
cursor: pointer;
z-index: 1000;
display: flex;
justify-content: center;
align-items: center;
}
@media (max-width: 768px) { @media (max-width: 768px) {
.content, .content,
.content.menu-open { .content.menu-open {

View File

@@ -26,6 +26,7 @@
</div> </div>
<ToolTip <ToolTip
v-if="!isMobile"
content="发帖" content="发帖"
placement="bottom" placement="bottom"
> >
@@ -62,6 +63,7 @@
import { ClientOnly } from '#components' import { ClientOnly } from '#components'
import { computed, nextTick, ref, watch } from 'vue' import { computed, nextTick, ref, watch } from 'vue'
import DropdownMenu from '~/components/DropdownMenu.vue' import DropdownMenu from '~/components/DropdownMenu.vue'
import ToolTip from '~/components/ToolTip.vue'
import SearchDropdown from '~/components/SearchDropdown.vue' import SearchDropdown from '~/components/SearchDropdown.vue'
import { authState, clearToken, loadCurrentUser } from '~/utils/auth' import { authState, clearToken, loadCurrentUser } from '~/utils/auth'
import { fetchUnreadCount, notificationState } from '~/utils/notification' import { fetchUnreadCount, notificationState } from '~/utils/notification'