前端,关于一个骚气的页面阅读定位图(菜单)

news2024/9/30 5:39:33

之前在网上看到一个特别骚气的页面阅读定位菜单,今天给大家分享一下原理,先看效果图:

这是我之前浏览联想官网上看到的一个效果图,觉得相当骚气。然后我把他的背景图扣下来,也做了一个,看看效果。

他的实现思路是:页面上放两个菜单,一个菜单是默认的,在页面的顶部。另一个菜单是默认隐藏的,当页面滚动默认菜单跑到屏幕以外时,这个转盘就会显示出来,并且会根据当前页面滚动阅读到的位置自动进行轮盘切换。当然这时我们也可以通过点击轮盘上的菜单进行快速跳转锚点去到我们想阅读的模块,如下图:

以下上代码:

HTML:

<ul class="fixd-menu" v-show="scrollMenu" :style="'transform:rotate('+MenuRotate+'deg)'">
				<li 
				v-for="(item,index) in menu"
				:key="item.code"
				@click="fixedMenu(index)"
				:class="['fixd-menu-item','fixd'+item.code,fixeMenuNow===item.href?'fixd-now':'']"><a :href="'#'+item.href">{{item.title}}</a></li>
			</ul>

css:

@keyframes menurun(){
	from{
		left: 0;
	}
	to{
		left: 1rem;
	}
}
.fixd-menu{
	position: fixed;
	top: calc(50% - 2.91rem);
	left: 1rem;
	width: 3.28rem;
	height: 3.28rem;
	background-image: url(../images/runner.png);
	background-size: 100%;
	background-position: center;
	z-index: 999;
	transition: all 1s;
}

.fixd-menu .fixd-menu-item{
	font-size: .1rem;
	color: #fff;
	width: .95rem;
	height: .6rem;
	line-height: .6rem;
	text-align: center;
	background-position: center;
	background-size: 100%;
	background-repeat: no-repeat;
	position: absolute;
}
.fixd-menu .fixd-menu-item a{color: #fff;display: block;width: 100%;height: 100%;}

.fixd-menu .fixd0{
	left: 1.15rem;
	top: .05rem;
}
.fixd-menu .fixd1{
	left: 1.928rem;
	top: .287rem;
	transform: rotate(37deg);
}
.fixd-menu .fixd2{
	left: 2.39rem;
	top: .95rem;
	transform: rotate(72deg);
}
.fixd-menu .fixd3{
	left: 2.39rem;
	top: 1.75rem;
	transform: rotate(109deg);
}
.fixd-menu .fixd4{
	left: 1.90rem;
	top: 2.38rem;
	transform: rotate(144deg);
}
.fixd-menu .fixd5{
	left: 1.16rem;
	top: 2.65rem;
	transform: rotate(180deg);
}
.fixd-menu .fixd6{
	left: .4rem;
	top: 2.38rem;
	transform: rotate(-144deg);
}
.fixd-menu .fixd7{
	left: -0.05rem;
	top: 1.73rem;
	transform: rotate(-109deg);
}
.fixd-menu .fixd8{
	left: -0.05rem;
	top: .94rem;
	transform: rotate(-72deg);
}
.fixd-menu .fixd9{
	left: .4rem;
	top: .299rem;
	transform: rotate(-37deg);
}
.fixd-now{background-image: url(../images/on_bg01.png);}

VueJS:

data:{
    menu:[
	    {title:'首页',href:'app',code:0},
	    {title:'服务流程',href:'service',code:1},
	    {title:'关于我们',href:'AboutUs',code:2},
	    {title:'我们的优势',href:'Advantages',code:3},
	    {title:'工程案例',href:'Project',code:4},
	    {title:'领导团队',href:'introduction',code:5},
	    {title:'联系我们',href:'Contact',code:6}
    ],
    DocumentTop:0,//页面上滚动
	scrollMenu:false,//滚动后显示的菜单
	fixeMenuNow:'',//当前悬浮菜单的选中
	MenuRotate:0//悬浮菜单旋转角度
},
methods:{
    scrolling(){//页面滚动监听
		this.DocumentTop = 
		document.documentElement.scrollTop ||
		document.body.scrollTop ||
		window.pageYOffset;
	},
    fixedMenu(index){//转盘点击时轮盘旋转
		this.fixeMenuNow = window.location.hash.split('#')[1];
		this.MenuRotate = 0 - (index * 35);
	},
    autoScroll(){//页面滑动时转动轮盘
						var plate = document.getElementsByClassName('plate');
						/* 思路:(循环板块列表)当页面滚动等于阅读元素的offsetTop时,表示阅读到此位置了,轮盘的转动此时可通过阅读元素的id去菜单数组“menu”中查找 */
						var that = this;
						var readID = '';//当前阅读到的板块ID
						for(var i=0;i<plate.length;i++){
							if(that.DocumentTop >= (plate[i].offsetTop-100) && that.DocumentTop < (plate[i].offsetTop + 100)){
								readID = plate[i].id;
								that.menu.map(function(item,index,arr){
									if(readID === item.href){
										that.MenuRotate = 0 -(item.code * 35)
										that.fixeMenuNow = item.href
										window.location.hash = "#"+item.href
					}
				}) 
			}
		}
	}
},
mounted(){//页面挂在完成后给window监听滚动事件,并调用/执行我们定义的事件函数。
	window.addEventListener("scroll",this.scrolling);
},
watch: {//这里监听当记录页面滚动的变量发生改变时,调用相对应的函数
					DocumentTop(newValue, oldValue) {
						if(newValue >= 130){
							this.scrollMenu = true
							this.fixeMenuNow = window.location.hash.split('#')[1];
							this.autoScroll()
						}
						if(newValue <= 50){
							this.scrollMenu = false
							window.location.hash = "#app";
						}
					}
				},
,
				beforeDestroy(){//页面销毁时移除窗口滚动监听
					window.removeEventListener("scroll",this.scrolling)
				}

以上就是所有实现代码:

1、你可以根据自己的需求设置菜单内容,当然这个menu内容的href值一定要和页面的节点id相对应,因为我们时通过设置锚点来定位页面内容的。

2、css样式设置了多个fixd1、fixd2、fixd3、……,这是因为我们的轮盘格子只有这么多,并不会因为菜单变多而增加背景图片的格子。哈哈!如果你需要更多的菜单,可以让你的ui给你设计出多个背景图,然后根据菜单列表个数来决定你要哪张背景图,这样就可以实现动态背景图了。

3、代码和逻辑执行流程:进入页面,先给window绑定监听滚动事件,把回调函数替换成我们自己定义的函数。此时我们记录页面滚动距离的变量(this.DocumentTop)就有了初始值了。当this.DocumentTop发生了改变,我们vue的监听函数(watch)就会起到作用。

4、监听函数(watch)内的newValue要判断大于130的原因是。默认菜单和顶部的高度,我希望的是当滚动到默认菜单消失时轮盘才显示,如下图:(这里可以根据自己的需求来写)

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

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

相关文章

接口自动化测试总结

一、什么项目适合做自动化测试&#xff1f; 软件需求变动不频繁 测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁&#xff0c;测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本&#xff0c;而脚本的维护本身就是一个代码开发的过程&#x…

【SpringCloudAlibaba】Seata分布式事务使用

文章目录 分布式事务问题示例Seata概述、官网一个典型的分布式事务过程处理过程全局GlobalTransactional分布式交易解决方案流程图 Seata安装下载修改conf目录下的application.yml配置文件dashboard demo 分布式事务问题示例 单体应用被拆分成微服务应用&#xff0c;原来的三个…

详解Transformer中的Encoder

一.Transformer架构 左半边是Encoder&#xff0c;右半边是Decoder。 二.Vision Transformer Vision Transformer取了Transformer的左半边。包含 Input EmbeddingPositional Encoding多头注意力机制 Add & Norm(前馈网络)Feed Forward Add & Norm 2.1 Input Embe…

C51智能小车(循迹、跟随、避障、测速、蓝牙、wifie、4g、语音识别)总结

目录 1.电机模块开发 1.1 让小车动起来 1.2 串口控制小车方向 1.3 如何进行小车PWM调速 1.4 PWM方式实现小车转向 2.循迹小车 2.1 循迹模块使用 2.2 循迹小车原理 2.3 循迹小车核心代码 3.跟随/避障小车 3.1 红外壁障模块分析​编辑 3.2 跟随小车的原理 3.3 跟随小…

世界级黑客丨电脑犯罪界的汉尼拔

被美国FBI称为电脑界的汉尼拔的人&#xff0c;有什么样的故事&#xff1f; 这个人就是世界级黑客凯文李波尔森&#xff0c;他在早期是正儿八经的黑客&#xff0c;他在17岁的时候就使用TRS-80电脑攻入美国国防部的高等研究计划署网络&#xff0c;但是当时他进去啥也没干&#x…

lambda nodejs 函数降低冷启动时间的最佳实践

lambda nodejs 函数降低冷启动时间的最佳实践 lambda nodejs 函数降低冷启动时间的最佳实践 前言什么是冷启动时间打包服务端 js什么是 inline进一步封装的打包工具存在的弊端以及解决方案Next Chapter完整示例及文章仓库地址 前言 本文章的思路&#xff0c;继承发展自这两篇…

vite vue项目 运行时 \esbuild\esbuild.exe 缺失 错误码 errno: -4058, code: ‘ENOENT‘,

vite vue项目运行 npm run dev 报错某个模块启动文件丢失信息 D:\PengYe_code\2\vite-vue3-admin>npm run dev> vite-vue3-admin1.0.2 dev > vitenode:events:504throw er; // Unhandled error event^Error: spawn D:\PengYe_code\2\vite-vue3-admin\node_modules\vi…

jupyter 添加中文选项

文章目录 jupyter 添加中文选项1. 下载中文包2. 选择中文重新加载一下&#xff0c;页面就变成中文了 jupyter 添加中文选项 1. 下载中文包 pip install jupyterlab-language-pack-zh-CN2. 选择中文 重新加载一下&#xff0c;页面就变成中文了 这才是设置中文的正解&#xff…

出现Browse information of one xxxx解决方法

不良现象如下&#xff1a; Browse information of one or more files is not available: Doing a project rebuild might fix this. 解决的方法&#xff1a;将C文件里面的内容全部注释掉&#xff0c;再编译正常。 然后再将注释掉的代码打开&#xff0c;再次编译就正常了。

【笔试强训选择题】Day35.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、Da…

什么是互联网打工人都需要知道的API?

我们生活在一个科技主导的世界。在这里&#xff0c;数据无处不在。作为许多不同产品的用户&#xff0c;我们所追寻的不再是某一个能将工作完成的最佳产品&#xff0c;而是一个不仅能有效完成工作&#xff0c;同时也与我们所使用的其他工具完美兼容的产品。因此&#xff0c;了解…

08-JVM垃圾收集器详解

上一篇&#xff1a;07-垃圾收集算法详解 如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现&#xff0c;更加没…

Web安全研究(四)

No Honor Among Thieves: A Large-Scale Analysis of Malicious Web Shells Stony Brook University Ruhr-University Bochum 数据集地址&#xff1a;https://github.com/HACHp1/CWSOGG_dataset Web shell作为恶意脚本&#xff0c;攻击者将其上传到被攻陷的Web服务器&#xff…

iTunes备份文件在哪?苹果手机怎么恢复iTunes备份?

iTunes是苹果手机的一个常见应用&#xff0c;很多小伙伴都使用它来备份手机上的重要数据。通过iTunes备份数据到电脑后还可以进行随时管理和查看。itunes备份文件在哪&#xff1f;手机数据丢失怎么恢复iTunes备份&#xff1f;接下来&#xff0c;本文将给大家介绍一下&#xff0…

javaweb03-js基础

文本中涉及的一些基础介绍&#xff0c;不是全的。只写一些最常见、最经常使用的&#xff0c;其他的想了解可以自行查找资料。 前言&#xff1a; script引入 内部引用 script 外部引用 script:src 一、js语法 1.编写语法 &#xff08;1&#xff09;区分大小写&#xff0c;建议…

达之云BI平台助力中国融通集团陕西军民服务社有限公司实现数字化运营

中国融通集团陕西军民服务社是一家大型综合类零售购物中心&#xff0c;公司目前管理系统运行了10年左右&#xff0c;面临系统新零售支持发展严重滞后&#xff0c;行业主流应用落地困难&#xff0c;如线上业务、到家业务、全渠道营销、电子发票、自助收银、扫码购、无感停车、未…

拦截器失效和工具类中静态变量注入失败的问题

拦截器失效和工具类中静态变量注入失败的问题 文章目录 拦截器失效和工具类中静态变量注入失败的问题1.拦截器配置冲突2.路径配置错误3.关于工具类中Maper注入失效的问题解决办法1&#xff1a;手动赋值给静态变量 问题描述&#xff1a;项目中需要设置多个拦截器拦截不同路径&am…

【Java实战项目】【超详细过程】—大饼的图片服务器3(ImageDao类详解)

ImageDao详解 一、向数据库中写入图片属性1.与数据库建立连接2.创建并拼接SQL语句3.执行SQL语句4.定义异常类JavaImageServerException5.关闭数据库连接6.写入图片的完整代码 二、查找数据库中所有图片属性1.与数据库建立连接2.创建并拼接SQL语句3.执行SQL语句4.处理结果集5.关…

python+django吉他乐谱推荐交流网站的实现vue

而吉他乐谱推荐交流网站能很好地解决这一问题&#xff0c;轻松应对乐谱推荐&#xff0c;既能提高用户对乐谱评论&#xff0c;又能加快乐谱推荐交流网站的效率&#xff0c;取代人工管理是必然趋势。 本吉他乐谱推荐交流网站以Django作为框架&#xff0c;B/S模式以及MySql作为后台…

Vue错误记录

文章目录 1. 项目build的时候报错Warning: Accessing non-existent property cat of module exports inside circular dependency2. WebpackOptionsValidationError: Invalid configuration object. Webpack has been initialised using a configuration object that does not …