vue3自定义实现悬浮固定按钮组件

news2024/12/23 13:27:37

目录

  • 一、需求描述
  • 二、代码解读
  • 三、结果展示

一、需求描述

  1. 需要5个固定的悬浮圆,居于页面的右侧。
  2. 鼠标悬浮在圆上面会显示对应的文字提示
  3. 其中包含返回顶部悬浮圆,当页面滑至底部时出现,点击页面滑到顶部。
  4. 点击按钮会给出弹窗

二、代码解读

<template>
  <div class="circle-container">
    <Tooltip title="返回顶部" placement="left">
      <div v-show="showTop" class="circle" @click="scrollToTop">
        <SvgIcon icon-name="icon-fanhuidingbu"></SvgIcon>
      </div>
    </Tooltip>
    <Tooltip title="GitHub" placement="left">
      <div class="circle" @click="navigateToGitHub">
       <SvgIcon icon-name="icon-github"></SvgIcon>
      </div>
    </Tooltip>
    <Tooltip title="Gitee" placement="left">
      <div class="circle" @click="navigateToGitee">
        <SvgIcon icon-name="icon-gitee"></SvgIcon>
      </div>
    </Tooltip>
    <Tooltip title="反馈" placement="left">
      <div class="circle" @click="showFeedbackPopup">
        <SvgIcon icon-name="icon-yijianfankui"></SvgIcon>
      </div>
    </Tooltip>

    <Tooltip title="关于" placement="left">
      <div class="circle" @click="showAboutPopup">
        <SvgIcon icon-name="icon-icon-test"></SvgIcon>
      </div>
    </Tooltip>

    <a-modal v-model:visible="feedbackVisible" title="提出反馈"  :footer="null">
      <a-form :form="form">
        <a-form-item label="反馈的标题:" name="title">
          <a-input placeholder="请输入反馈标题" />
        </a-form-item>
        <a-form-item label="反馈描述:" name="description">
          <a-textarea placeholder="请输入反馈描述" />
        </a-form-item>
      </a-form>
      <div class="custom-modal-footer">
        <a-button type="primary" @click="handleSubmit">提交</a-button>
      </div>
    </a-modal>

    <a-modal v-model:visible="aboutVisible" title="关于" :footer="null" style="width: 350px">
      <!-- 描述文字 -->
      <p>本平台所有代码均有自己一人开发,如有问题,请扫码联系!</p>

      <!-- 图片展示,通过 props 传递图片链接 -->
      <div class="image-container">
        <img v-for="(image, index) in images" :src="image" :alt="'Image ' + (index + 1)" :key="index" />
      </div>
    </a-modal>

  </div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import {Tooltip} from 'ant-design-vue';
import SvgIcon from "@/components/SvgIcon.vue";

// props 定义
const props = defineProps(['images']);

// 关于弹窗逻辑
const aboutVisible = ref(false);

const showAboutPopup = () => {
  aboutVisible.value = true;
};


const feedbackVisible = ref(false);
const form = ref();

const showFeedbackPopup = () => {
  feedbackVisible.value = true;
};

const handleSubmit = () => {
  form.value.validate().then(() => {
    console.log('提交反馈');
    feedbackVisible.value = false;
  });
};


    const showTop = ref(false);

    const scrollToTop = () => {
      // 滚动到顶部的逻辑
      const scrollToTopDuration = 300;
      const scrollStep = -window.scrollY / (scrollToTopDuration / 15);

      const scrollInterval = setInterval(() => {
        if (window.scrollY !== 0) {
          window.scrollBy(0, scrollStep);
        } else {
          clearInterval(scrollInterval);
        }
      }, 15);
    };

    const navigateToGitHub = () => {
      // 跳转到GitHub的逻辑
      window.location.href = 'https://github.com';
    };

    const navigateToGitee = () => {
      // 跳转到Gitee的逻辑
      window.location.href = 'https://gitee.com';
    };




    const handleScroll = () => {
      // 根据滚动位置判断是否显示返回顶部按钮
      showTop.value = window.scrollY > window.innerHeight;
    };

    onMounted(() => {
      // 监听滚动事件,根据滚动位置来显示/隐藏返回顶部按钮
      window.addEventListener('scroll', handleScroll);
    });

    onBeforeUnmount(() => {
      // 移除滚动事件监听
      window.removeEventListener('scroll', handleScroll);
    });

</script>


<style scoped>

/* 关于弹窗样式 */
.image-container {
  display: flex;
  justify-content: space-between;
  margin-top: 20px;
}

.image-container img {
  width: 150px; /* 调整图片宽度 */
  height: auto; /* 保持宽高比 */
}

.circle-container {
  position: fixed;
  bottom: 80px;
  right: 50px;
  display: flex;
  flex-direction: column;
  z-index: 999;
}

.circle {
  width: 30px;
  height: 30px;
  background-color: #ffffff;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 10px;
  cursor: pointer;
  transition: background-color 0.3s;
}

.circle a-icon {
  color: #fff;
  font-size: 20px;
}
.custom-modal-footer {
  display: flex;
  justify-content: flex-end;
}
</style>

  1. <template> 部分:

    • <div class="circle-container">:定义了一个包含所有圆形按钮的容器,这些按钮在页面右下角垂直排列。
    • 每个按钮都被包裹在 <Tooltip> 组件内:这是为了在用户悬停在按钮上时显示一个提示文本。
    • v-show="showTop":通过Vue的指令 v-show 根据 showTop 变量的值来控制返回顶部按钮的显示与隐藏。
    • 弹窗部分:使用了 a-modal 组件,分别用于显示用户反馈和关于信息。
  2. <script setup> 部分:

    • import 语句:引入了Vue 3的 refonMountedonBeforeUnmount,以及Ant Design Vue库的 Tooltip 组件和自定义的 SvgIcon 组件。
    • const props = defineProps(['images']);:通过 defineProps 获取父组件传递的 images 属性。
    • 关于弹窗逻辑:aboutVisible 控制关于弹窗的显示与隐藏,showAboutPopup 方法用于显示关于弹窗。
    • 反馈弹窗逻辑:feedbackVisible 控制反馈弹窗的显示与隐藏,showFeedbackPopup 方法用于显示反馈弹窗,handleSubmit 方法处理用户提交的反馈。
    • 返回顶部逻辑:showTop 控制返回顶部按钮的显示与隐藏,scrollToTop 方法用于平滑滚动到页面顶部。
    • 跳转逻辑:navigateToGitHubnavigateToGitee 方法用于在新窗口中打开 GitHub 和 Gitee 的链接。
    • 滚动事件监听:handleScroll 方法用于监听页面滚动事件,根据滚动位置来控制返回顶部按钮的显示与隐藏。
    • 生命周期钩子:onMounted 注册了滚动事件监听器,onBeforeUnmount 移除了滚动事件监听器。
  3. <style scoped> 部分:

    • 关于弹窗样式:通过定义 .image-container 类和其内部的 img 样式,控制关于弹窗中图片的展示方式。
    • 圆形按钮样式:定义了 .circle 类和其内部 a-icon 样式,包括按钮的大小、背景颜色、圆角等。
    • 弹窗底部样式:通过定义 .custom-modal-footer 类,将弹窗中的提交按钮放置在底部右侧。

整个组件结合了Vue 3的响应式数据、生命周期钩子以及Ant Design Vue库提供的组件,实现了一组具有交互性和美观性的圆形按钮,以及与之关联的弹窗功能。

三、结果展示

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LCR 172. 统计目标成绩的出现次数

解题思路&#xff1a;二分查找 题解一 class Solution {public int countTarget(int[] scores, int target) {// 搜索右边界 rightint i 0, j scores.length - 1;while(i < j) {int m (i j) / 2;if(scores[m] < target) i m 1;else j m - 1;}int right i;// 若数…

UE5 C++ Gas开发 学习记录(一)

一个新坑,在TPS的空余时间学习 创建了自己,敌人的BaseCharacter和子类,创建了Gamemode,创建了Controller AuraCharacterBase.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include &…

H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素。 分辨…

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

开启数字内容创作的新时代

目录 技术解析 未来展望 技术解析 Sora是一款由OpenAI开发的先进AI视频模型&#xff0c;其技术架构基于深度学习和自然语言处理技术。该模型的核心算法原理包括使用深度神经网络进行视频内容的理解、生成和互动。 在技术架构方面&#xff0c;Sora采用了一种混合的神经网络结…

五种多目标优化算法(NSWOA、MOJS、MOAHA、MOPSO、NSGA2)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1NSWOA 1.2MOJS 1.3MOAHA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

15:00面试,15:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

EXCEL如何从另一个表查找匹配信息

目录 1.背景&#xff1a;我们有一个目标呈现表&#xff0c;想要从另一个表中查询得到信息&#xff0c;比如根据身份证id查询该id的名字、性别等个人基本信息&#xff0c;或者从另一个财务信息表查询该id的工资信息等&#xff1b; 2.基础方法&#xff1a;利用VLOOKUP函数根据单…

NGINX服务器配置实现加密的WebSocket连接WSS协议

一、背景 最近在做小程序开发&#xff0c;需要在nginx中配置websocket加密模式&#xff0c;即wss。初次配置wss时&#xff0c;踩了两个小时的坑&#xff0c;本文将踩坑过程分享给大家&#xff0c;有需要用到的伙伴可以直接copy即可实现&#xff0c;节省宝贵时间。 二、WebSo…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

用html编写的小广告板

用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

刘知远LLM——Transformer与预训练模型

文章目录 注意力机制原理介绍注意力机制的各种变式注意力机制的特点 Transformer结构概述Transformer整体结构 输入层byte pair encodingpositional encoding Transformer BlockEncoder BlockMulti-Head Attention Decoder Block其他tricks总结 预训练语言模型语言建模概述预训…

二叉搜索树题目:二叉搜索树中的众数

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树中的众数 出处&#xff1a;501. 二叉搜索树中的众数 难度 3 级 …

峰值检测电路

常用的峰值检测电路&#xff0c;如下图所示。 该电路有两种工作状态&#xff1a; 1、充电状态&#xff1a;D2导通&#xff0c;D1截止。 当U1的端比-端大时&#xff0c;V1VIN&#xff0c;VCV1-VD2&#xff0c;VOUTVC。这时&#xff0c;给电容C1充电。由于D1截止没有环路&#…

Shell脚本介绍及脚本功能

文章目录 一、什么是shell二、hello word2.1 echo2.2第一个脚本 三、Bash的基本功能3.1别名3.2常用快捷键3.3输入输出3.4 输出重定向3.5 多命令执行3.6 管道符3.7 通配符和特殊符号 一、什么是shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。S…

背包问题(介绍+例题+代码+注解)

目录 介绍&#xff1a; 一、01背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 二、完全背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 三、多重背包 题目描述 输入描述: 输出描述: 代码&#xff1a; 四、背包问题 题目描述 输入描述: 输出描…

Mybatis2

Mybatis2 本章目标&#xff1a; myBatis类型别名处理 myBatis参数处理 myBatis结果集类型 myBatis结果集列名和属性名称对应方式处理 附录 本章内容 一、类型别名&#xff08;typeAliases&#xff09;处理 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置…

使用EFCore连接SQLite

简介 在使用EFCore连接SQLite之前我们先来了解一下SQLite SQLite是一个轻量级、自包含、无服务器、零配置的事务性SQL数据库引擎&#xff0c;它支持SQL92标准的大多数查询语言并兼容ACID事务。具体如下&#xff1a; 轻量级&#xff1a;SQLite非常轻巧&#xff0c;它的库体积…

[算法沉淀记录] 排序算法 —— 堆排序

排序算法 —— 堆排序 算法基础介绍 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树&#xff0c;其中每个节点的值都必须大于或等于&#xff08;最大堆&#xff09;或小于或等于&am…

Huggingface学习笔记

课程地址&#xff1a;【HuggingFace简明教程,BERT中文模型实战示例.NLP预训练模型,Transformers类库,datasets类库快速入门.】 什么是huggingface&#xff1f; huggingface是一个开源社区&#xff0c;提供了先进的NLP模型、数据集以及工具。 主要模型&#xff1a; 安装环境&…