Vue3实现一个标题点击变粗且底部有提示的效果

如题所述

第1个回答  2024-08-17
这周在项目中需要实现一个类似于github顶部标题的效果。

主要效果为:当用户点击的时候,底部出现黑色的细线,并且当前项目的字体变粗。感觉这种场景很多,特来记录一下实现过程。接下来我会一步步讲解去实现它。

一.基础样式和设计思路

我们稍微调整一下布局(这里我使用的是tailwind.css),本篇主要内容不是介绍css的,所以一些样式的知识点需要读者自己去查阅。

这里我的设计思路是这样的,假设当前我的页面有两个选项卡,当用户点击某一选项卡的时候,下面的韩字会移动到相应的位置,且当前元素的字体会变大。

二.优化一下代码

为了更接近真实项目的数据,我们把上面的数据再包装一下。

1.enum最常见的使用场景就是,在某个列表具有某些固定值。再举个更简单的例子,加入你在做一款游戏,游戏的方向只有上下左右四个方向。那么我就可以定一个enum。

2.这里的data一会要用来v-for,动态打印出我们列表,action一会要用来传递点击事件的参数,它并不是我们要用来在视图上展示的。

3.最终改造的数据也很简单,就是很简单的v-for

这样做的好处在于,即使后期我们需要添加一个额外的标题,我们只需要在数组data里添加即可,并且页面也不会出现很大的错乱,对后来接手你代码的人也很友好。

三.设计点击事件

1.在这里我们给最外层的divwrapper打上ref,然通过vue的ref拿到它里面的标题div。

2.接下来,是全篇重点:注意听讲!!

3.首先函数名,handelClickItem用户点击元素,这个函数的参数即是用户到底点击的是哪一个标题

我们之前设计的itme.action就是这里需要用到的。

4.这里的处理的原因是,querySelectorAll这个方法返回的是一个类数组,我们并没有办法直接使用数组的方法,所以用到的了Array.from来强制转换一下。

5.我们拿到的数组里面其实是包括最后的滑块div的,但是那个滑块并不需要,所以再优化,剪切一下,把滑块从数组中去掉。

6.下面的代码就用到了我们传递的参数,currentItem的目的,你可以简单理解为当前div的index。

7.ok,我们现在只需要知道滑块应该滑动的距离就行了。

这里我们用到了offsetLeft和clientWidth,我们先讲解这两个究竟是个什么东西。

一.额外技能补充----offsetLeft

我们先看MDN是如何介绍的

这里提到了,返回当前元素左上角相对于offsetParent左边界偏移的值。我们先打印一下userClickItem来看看它身上的这个属性。

二.额外技能补充----clientWidht

假设我们不给我们的标题div加padding属性,那么这时候它的值就是我们content也就是内容区的宽度。让我们给标题加上宽度的时候,它指的就是content宽度加padding的宽度。

1.让我们验证一下,先来打印一下没有padding的情况。

2.我们加上padding再试一下。

四.滑块的初始位置与点击移动

ok!这里我们知道了clietnWidth和offsetLeft什么意思了,我们拿到这两个值有什么用呢?

我们的滑块本身就是相对于wrapper来滑动的,它的起点其实是wrapper的最左边,它的初始位置如果是上面的的calcOffset的话,那不就正好在第一个标题的正下方了吗?

ok,定义一个变量接收一下即可。

解释一下,这个7.5是我微调的一下,并没有什么实质性的原因。

然后我们设置一个:style是一个计算属性滑块style

与滑块的div绑定即可。

组件刚挂载的时候就让滑块移动到正确的位置。

五.字体大小的切换

这个比较简单,大致说一下原理,因为我们能拿到用户点击的那个div和全部的div数组,我们在每次点击的时候,将用户拿到的div的fontSize变大,并且筛选出剩下的div,使其fontSzie恢复正常即可。

至此我们基本实现了github主页的那个效果。

注意,我们的滑块可是滑过去的哦,并不是直接出现在标题下方的。

Vue3实现一个标题点击变粗且底部有提示的效果
1.在这里我们给最外层的divwrapper打上ref,然通过vue的ref拿到它里面的标题div。2.接下来,是全篇重点:注意听讲!!3.首先函数名,handelClickItem用户点击元素,这个函数的参数即是用户到底点击的是哪一个标题 我们之前设计的itme.action就是这里需要用到的。4.这里的处理的原因是,querySelectorAll这...

vue3自定义tab-pane标题内容
1、打开一个vue文件,添加一个el-tabs组件,设置默认选中第一个tab。2、新加一个el-tab-pane标签,使用slot="label"自定义内容为小图标+标题。3、保存vue文件后用浏览器打开,这个时候就可以看到第一个标题显示为日期图标加标题效果了。

我开源了一个绝对好用的基于vue2、vue3的系统步骤引导组件。_百度知 ...
--插槽-自定义底部按钮tipItem当前的提示信息index当前提示新的索引不写的话,会显示默认的底部按钮--><template#prev="{tipItem,index}">上一步<\/template><template#next="{tipItem}">下一步<\/template><template#done>done<\/template><template#skip>skip<\/template><\/vue-intro-step><\/templat...

怎么设置和编辑VUE视频的页面头部标题
具体如下:1. 首先,请大家在自己的手机中找到vue,点击进入主界面,然后进行视频导入,选择屏幕最下面的第2个文字图标。2. 第二步,接下来,请选择箭头所指的第1个标题图标。3. 第三步,接下来,请点击任意一种类型的标题。4. 第四步,此时,请大家在输入框中输入标题文字,接着选择屏幕右上方的...

用Vue3.0 写过组件吗?VUE3中的Modal设计实现
1. **目录结构**:Modal组件相关文件置于plugins目录下,作为Vue插件使用。2. **组件内容**:modal.vue实现主体显示,通过Vue3 Teleport组件将内容传送至body。包含遮罩层、标题、内容与底部按钮。主体内容根据传入参数显示,常见形式为字符串或默认插槽。3. **API形式调用**:通过Vue2的Vue实例与Vue....

vue3的mixin模式如何实现?
在Vue.js 3中,原先的Mixin模式已不再适用,取而代之的是功能更为强大的Composition API。Composition API以函数和钩子的形式提供组件复用和代码组织的新途径。定义组件时,使用defineComponent函数,并在setup钩子中实现逻辑,以替代传统Mixin的功能。可以将多个setup函数组合起来,实现复用逻辑。例如,定义两...

Vue3 如何实现一个带遮罩的 dialog 对话框
七. `Dialog.vue` 组件改造:明确组件的 Props 定义,接收传入的自定义内容,如标题、内容等,实现对话框内容的动态化。八. 遮罩关闭效果测试:验证对话框的遮罩功能,确保点击遮罩能够正常关闭对话框。九. 修复冒泡 Bug:针对对话框关闭时可能出现的冒泡问题,通过调整事件处理逻辑,确保对话框的正常关闭...

vue的标题怎么设置时间
vue的标题,其设置时间的方法是:1、首先打开VUE视频。2、进入后就可以看到界面中,在拍摄视频中默认时段是4段、10秒,而红色的就是拍摄按钮;当需要修改时,点击视频设置就可以了。VUE是iOS和Android平台上的一款Vlog社区与编辑工具,允许用户通过简单的操作实现Vlog的拍摄、剪辑、细调、和发布,记录与...

vue3手册?
1、onclick元素上发生鼠标点击时触发。==vue用法@click() 2、onscroll当元素滚动条被滚动时运行的脚本。则旁==vue用法@scroll() 可以用来监听元素是否滚动到底,如下: 3、ondblclick元素上发生鼠标双击时触发。==vue用法@dblclick() 4、onmousedown当元素上按下鼠标按钮时触发。。==vue用法@mousedown() 下面是一...

vue3编程如何实现简单表格组件?
创建一个简单表格组件使用 Vue3,首当其冲的步骤是定义组件的结构。此步骤包括定义组件的属性以及在模板中呈现数据。为了实现这一功能,我们需设计一个可复用的表格组件。在Vue3中,组件设计可借由接收属性实现动态渲染。组件属性包括 headers 和 rows。headers属性设定为字符串数组,用于配置列标题;rows...

相似回答
大家正在搜