【Tailwind + Vue3】100行代码手写一个客服组件

【Tailwind + Vue3】100行代码手写一个客服组件

通常在官网页面上,都会有一个在右下角的客服小组件,有几个按钮,显示电话,微信等信息:
在这里插入图片描述
主要有以下几个难点:

  1. 动态类名绑定: 在迭代生成的每个工具项上,使用 :class 绑定来动态添加特定的圆角样式,这取决于元素在数组中的位置(是否为第一个或最后一个元素),实现这一点需要理解 Vue 的动态类名绑定和 JavaScript 的逻辑表达式。

  2. 鼠标悬停动态效果: 实现鼠标悬停时显示详细信息的逻辑较为复杂,需要理解如何根据鼠标事件(mouseenter 和 mouseleave)动态更新 hoveredItemId 的状态,并据此条件渲染对应的详情框,同时应用 CSS 动画。

  3. Vue.js 事件处理: 代码中通过为 @mousedown 和 @touchstart 事件绑定处理函数来预设拖拽开始的逻辑(尽管示例中没有具体实现拖拽逻辑),这涉及到了对 Vue.js 事件监听和处理的理解。

  4. CSS 动画与 Tailwind CSS 的结合使用: 通过使用类似 animate-fadeIn 的类,展示了如何在 Vue 组件中使用 Tailwind CSS 实现简单的动画效果。理解如何在 Tailwind CSS 中扩展动画或直接在样式表中定义动画是实现这一点的关键。

  5. 条件渲染和动画: 使用 v-for 指令遍历 items 数组生成每个工具项,v-if 条件渲染显示额外信息(如电话号码或二维码)。

全部代码

<template><div class="cursor-pointer fixed bottom-16 right-4 z-10" @mousedown="handleDragStart" @touchstart="handleDragStart"><div class="mb-8 -mr-2"><img src="../../assets/floatBar/avatar.svg" alt="avatar"class="border-blue-500 border rounded-full ml-1 bg-white"><img src="../../assets/floatBar/Wechat.svg" alt="wechat"></div><!-- 项始终显示在页面右下角,为整个容器添加圆角 --><div class="pt-2 ml-1"><div class="relative flex flex-col items-end rounded-2xl shadow-lg"><!-- In your template, update the div that iterates over items --><div v-for="(item,index) in items" :key="item.id" :class="{'rounded-btn-first': index == 0, 'rounded-btn-last': index == items.length - 1}"class="flex flex-col items-center bg-white p-2 cursor-pointer relative last:mb-0 hover:bg-gray-50 last:rounded-btn-last"@mouseenter="handleMouseEnter(item)" @mouseleave="handleMouseLeave"><!-- hover items --><div v-if="hoveredItemId === item.id && item.detail"class="absolute -left-2 transform -translate-x-full bg-white p-2 shadow-lg text-sm rounded-lg animate-fadeIn"><div class="flex mx-1"><img :src="item.icon" alt="" class="w-4 h-4 mt-0.5" v-if="index!=3"><span class="mr-4 ml-2" v-if="index!=3">{{ item.detail }}</span><img :src="item.detail" alt="qrcode" v-if="index==3" class=""></div></div><img :src="item.icon" alt="" class="w-6 h-6"><span class="text-[12px] text-center text-[#4E5F78] ">{{ item.text }}</span></div></div></div></div>
</template><script setup>
import { ref } from 'vue';
import onlineServiceIcon from '../../assets/floatBar/online service.svg'
import demonIcon from '../../assets/floatBar/demonstration.svg'
import phoneIcon from '../../assets/floatBar/phone.svg'
import learnMoreIcon from '../../assets/floatBar/learn more.svg'
import qrcode from '../../assets/floatBar/qrcode.jpg'const items = ref([{ id: 1, text: '在线咨询', detail: 'xxx', icon: onlineServiceIcon },{ id: 2, text: '预约演示', detail: 'xxx', icon: demonIcon },{ id: 3, text: '电话咨询', detail: 'xxx', icon: phoneIcon },{ id: 4, text: '了解更多', detail: qrcode, icon: learnMoreIcon }
]);const hoveredItemId = ref(null); // Track the hovered itemconst handleMouseEnter = (item) => {hoveredItemId.value = item.id; // Set the hovered item ID
};const handleMouseLeave = () => {hoveredItemId.value = null; // Clear the hovered item ID on mouse leave
};
</script><style scoped>
.detail-box {position: absolute;top: 50%;left: 0; /* Adjusted for demonstration */transform: translateX(-100%) translateY(-50%);white-space: nowrap;background-color: #fff;border: 1px solid #ddd;padding: 8px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}.rounded-btn-first {border-radius: 10px 10px 0 0;
}.rounded-btn-last {border-radius: 0 0 10px 10px;
}
</style>

效果展示

在这里插入图片描述

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

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

相关文章

AI绘画怎么用?详细教程在这里!

AI绘画是一种利用人工智能技术来创作艺术作品的方式。以下是一个详细的AI绘画的详细教程&#xff0c;介绍AI绘画怎么用? 1. 选择合适的AI绘画工具&#xff1a;市面上有许多AI绘画工具供用户选择&#xff0c;如建e网AI、DeepArt、DALL-E等。用户可以根据自己的需求和兴趣&#…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…

Tab组件的编写与动态日期的函数封装

src\components\Tab\Icon.vue 底部导航栏子组件。 <template><router-link :to"path" class"tab-icon"><i class"icon">{{iconText}}</i><p class"text"><slot>{{ tabText }}</slot></…

2024.3.12 C++

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height) 定义公有成员函数初始化函数:void init(int w, int h)更改宽度的函数:set w(int w)更改高度的函数:set h(int h)输出该矩形的周长和面积函数:void show() #include <iostream>using nam…

高项-项目整合管理

项目整合管理的目标 资源分配平衡竞争性需求研究各种备选方法裁剪过程以实现项目目标管理各个项目管理知识域之间的依赖关系 项目整合管理的过程 制定项目章程制定项目管理计划指导与管理项目工作管理项目知识监控项目工作实施整体变更控制结束项目或阶段 七个过程和五大过…

Servlet的book图书表格实现(使用原生js实现)

作业内容&#xff1a; 1 建立一个book.html,实现图书入库提交 整体参考效果如下: 数据提交后&#xff0c;以窗口弹出数据结果&#xff0c;如: 2 使用正则表达式验证ISBN为x-x-x格式&#xff0c;图书名不低于2个字符&#xff0c;作者不能为空&#xff0c;单价在【10-100】之间…

NASA和IBM联合开发的 2022 年多时相土地分类数据集

简介 美国国家航空航天局&#xff08;NASA&#xff09;和国际商业机器公司&#xff08;IBM&#xff09;合作&#xff0c;利用大规模卫星和遥感数据&#xff0c;包括大地遥感卫星和哨兵-2 号&#xff08;HLS&#xff09;数据&#xff0c;创建了地球观测人工智能基础模型。通过奉…

光电容积脉搏波PPG信号分析笔记

1.脉搏波信号的PRV分析 各类分析参数记参数 意义 公式 参数意义 线性分析 时域分析 均值MEAN 反应RR间期的平均水平 总体标准差SDNN 评估24小时长程HRV的总体变化&#xff0c; SDNN &#xff1c; 50ms 为异常&#xff0c;SDNN&#xff1e;100ms 为正常&#xff1b;…

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-1、线条平滑曲面且可通过面观察柱体变化(一)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

【Java探索之旅】数据类型与变量 浮点型,字符型,布尔型,字符串型

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java成长日志 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、变量1.1 浮点型1.2 字符型变量1.3 布尔类型 二、字符串类型2.1 转化 &#x1f324…

建造家庭泳池位置选择尤为重要

建造家庭泳池位置选择尤为重要 在自家别墅庭院中建造一座游泳池是很多人的梦想&#xff0c;因为有泳池家人健身起来是非常方便的&#xff0c;但是建造泳池选择合适的位置显得尤为关键&#xff0c;因为合适的选址可以带来美观性及在泳池的日常使用维护中也起到了很重要的作用。…

Failed to load local image resource the server responded with a status of 500

在微信小程序里使用van-image时&#xff0c;加载本地图片加载不出来&#xff0c;报错信息如下 Failed to load local image resource /miniprogram_npm/vant/weapp/image/require(/images/xztp.jpg) the server responded with a status of 500 (HTTP/1.1 500 Internal Server …

python 通过代理服务器 连接 huggingface下载模型,并运行 pipeline

想在Python 代码中运行时下载模型&#xff0c;启动代理服务器客户端后 1. 检查能否科学上网 $ curl -x socks5h://127.0.0.1:1080 https://www.example.com <!doctype html> <html> <head><title>Example Domain</title><meta charset"…

前端css 纯数字或者字母 溢出不换行

问题&#xff1a;一个div元素盒子 宽度固定 内容是中文到达盒子宽度放不下时会自动换行&#xff0c;但是如果输入的事纯数字或者字母 会发现内容区会溢出 异常现象&#xff1a;11111超出div盒子 解决方案&#xff1a;添加属性 word-break: break-all; 原理&#xff1a;浏览器…

13年老鸟整理,性能测试技术知识体系总结,从零开始打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 从个人的实践经验…

多线程案例及常用模式

一.单例模式——经典的设计模式 什么是单例模式&#xff1a;就是规定一个类只能创建一个对象&#xff0c;也就是保证某个类在程序中只存在唯一一个实例&#xff0c;而不会创建出多个实例 根据对象创建的时机不同&#xff0c;可以分为饿汉模式和懒汉模式 1.饿汉模式 在类加载…

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…

【微服务学习笔记(二)】Docker、RabbitMQ、SpringAMQP、Elasticseach

【微服务学习笔记&#xff08;二&#xff09;】Docker、RabbitMQ、SpringAMQP、Elasticseach Docker镜像和容器安装基础命令Dockerfile自定义镜像 MQ&#xff08;服务异步通讯&#xff09;RabbitMQ安装使用消息模型 SpringAMQP消息发送消息接收Work Queue 工作队列发布订阅Fano…

Python中的运算符介绍

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

VR全景在智慧园区中的应用

VR全景如今以及广泛的应用于生产制造业、零售、展厅、房产等领域&#xff0c;如今720云VR全景更是在智慧园区的建设中&#xff0c;以其独特的优势&#xff0c;发挥着越来越重要的作用。VR全景作为打造智慧园区的重要角色和呈现方式已经受到了越来越多智慧园区企业的选择和应用。…