Vue简单实现更多选项

news/2024/7/10 2:06:21 标签: Vue

这个功能其实相当于显示隐藏二级菜单,不过只是利用了vue来实现。

功能简单演示,请忽略css的边框线:

这个demo有几个难点,简单说说。

vue点击显示隐藏其实靠的只是判断vue中的属性是否true,vue会自动帮助你显示还是隐藏,但是有一个问题,这个demo没有解决,当这个“显示”按钮处于页面最底部,它应该像很多网页上的向上,而不是向下,滚动条会多出一部分,来装下多出的长度,我只是简单的依照第一次打开网页的高度来比较进行了微调,让二级菜单向上显示。

只是没有根本解决问题。

其二,当二级菜单或三级菜单显示,鼠标随便点击网页位置,所有二级菜单和三级菜单隐藏,这是一个难点,我通过百度到的解决方案,原理不是很明白,有大佬可以帮忙解释一下吗?

 其三,其实是我遇到对于vue的问题,二级菜单处于mouseenter状态,然后三级菜单也处于mouseenter状态,那么css的hover都不能给三级菜单添加任何css,不知道是什么原因?

废话不多说,直接上代码。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>vue点击切换显示隐藏</title>
	<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
</head>
<style>
	*{
		padding: 0px;
		margin: 0px;
	}
	ul li,ul li a{
		list-style-type:none ;
		text-decoration: none;
	}
	#example{
		height: 30px;
		position:absolute;
		margin-top: 500px;
		border:1px solid #000;
	}
	div#tip{ 
		position:relative;
		width:150px; 
		height: 68px;
		padding: 10px 0px;		
		box-shadow: #666 0px 1px 1px 1px;
		border:1px solid #00CC66;
	}
	#tip ul li a,.two a{
		text-align: center;
		margin: 0px auto;
		color: #000;
		font-size: 12px;
		border: 1px solid #000;
		display: block;
		height: 34px;
		line-height: 34px;
		width: 150px;
		background-color:#fff;
	}
	.two{
		border:1px solid #000;
		width: 150px;
		position: relative;
		padding: 10px 0px;
		left: 150px;
	}
	#tip ul li a:hover{
		background: #F0F0F0;
	}
	.songActive{
		background: #F0F0F0;
	}
	.song{
		background: #fff;
	}
</style>
<body>
	<div id="example">
		<button v-text="btnText" @click="showToggle" v-clickoutside="handleClose"></button>
		<div v-show="isShow" id="tip" v-bind:style="{left:popup.x , top:popup.y }" @click.stop="isShow=true">
			<ul>
				<li>
					<a href="javascript:void(0)" @mouseenter="enter($event)"
						v-bind:style="{background:song.colorB}">
						<i class="layui-icon-add-1"></i>添加到歌单<i class="layui-icon-right"></i>
					</a>
				</li>
				<li>
					<a href="javascript:void(0)" @mouseenter="enter($event)" 
						v-bind:style="{background:song.colorA}">
						<i class="layui-icon-add-1"></i>添加到电台<i class="layui-icon-right"></i>
					</a>
				</li>
			</ul>
			<ul class="two" v-if="showSong" v-bind:style="{bottom:song.y}">
				<li>
					<a href="javascript:void(0)">轻音乐</a>
				</li>
				<li>
					<a href="javascript:void(0)">爵士</a>
				</li>
			</ul>
		</div>
	</div>
	
	<script type="text/javascript">
	var H = document.documentElement.clientHeight || document.body.clientHeight;
	console.log(H); 
	const clickoutside = {
	    // 初始化指令
	    bind(el, binding, vnode) {
	        function documentHandler(e) {
	            // 这里判断点击的元素是否是本身,是本身,则返回
	            if (el.contains(e.target)) {
	                return false;
	            }
	            // 判断指令中是否绑定了函数
	            if (binding.expression) {
	                // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法
	                binding.value(e);
	            }
	        }
	        // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
	        el.__vueClickOutside__ = documentHandler;
	        document.addEventListener('click', documentHandler);
	    },
	    update() {},
	    unbind(el, binding) {
	        // 解除事件监听
	        document.removeEventListener('click', el.__vueClickOutside__);
	        delete el.__vueClickOutside__;
	    }
	};
	new Vue({
		el:"#example",
		data:{
			btnText:"显示",
			isShow:false,
			popup:{
				x:'',
				y:''
			},
			showSong:false,
			song:{
				y:'',
				colorA:'',
				colorB:''
			}
		},
		directives: {clickoutside},
		methods:{
			handleClose:function(){
				this.isShow=false;
				this.showSong=false;
				this.song.colorA='#fff';
				this.song.colorB='#fff';
			},
			showToggle:function(e){
				console.log(e);
				this.isShow = !this.isShow;
				var Y=e.pageY;
				var X=e.pageX;
				var top=0;
				var left=0;
				console.log(Y,X)
				if(Y<(H-20)){
					top=0;
					left=X+10;
				}else{
					top=-80;
					left=X+10;
				}
				
				console.log(top+","+left);
				this.popup.x=left+'px';
				this.popup.y=top+'px';
//				$('#tip').css({
//				'top' : top + 'px',
//				'left': left+ 'px'
//				});
				if(this.isShow){
					this.btnText = "显示"
				}else{
					this.btnText = "隐藏"
				}
			},
			enter:function(e){
				e.stopPropagation();
				console.log(e)
				this.showSong=true;
				//获得移入的元素
				var element=e.target;
				this.song.colorA='#fff';
				this.song.colorB='#fff';
				if(element.innerText=="添加到电台"){
					this.song.y=34+'px';
					this.song.colorA='#F0F0F0';
				}else if(element.innerText=="添加到歌单"){
					this.song.y=68+'px';
					this.song.colorB='#F0F0F0';
				}
			},
			leave:function(e){
				this.showSong=false;
			}
		}
	})
	</script>
</body>
</html>

 代码很简单,不用解释应该都能看明白,有问题随时可以问。

 


http://www.niftyadmin.cn/n/1638792.html

相关文章

SpringBoot+Mybatis+Redis基础配置

对于SpringBoot其实还是较为陌生&#xff0c;基本上靠网上的学习资源完成自学&#xff0c;所以这篇博客也就没有什么属于知识的范畴&#xff0c;仅仅只是收集和查阅资料后详细注解整合在一起的代码罢了。废话不多说&#xff0c;这篇仅仅只是记录下学习成果。 首先创建SpringBo…

Vue+Mysql+SpringBoot简单增删改查

关于Spring篇 关于mybatismaven基本知识掌握总结 maven中springspringmvcmybatis整合详细配置 SpringBootMybatisRedis基础配置 这两天写的一个补考作业&#xff0c;敲完还是记录下。不然一个月后没敲代码又忘记了&#xff0c;废话多说&#xff0c;需要项目源码自己拿。 链…

软件技术专业的简历编写记录

前言 欢迎大家来到我的博客&#xff0c;请各位看客们点赞、收藏、关注三连&#xff01; 欢迎大家关注我的知识库&#xff0c;Java之从零开始 语雀 你的关注就是我前进的动力&#xff01; CSDN专注于问题解决的博客记录&#xff0c;语雀专注于知识的收集与汇总&#xff0c;…

【BAT语言学习】问题一:执行命令中文乱码

首先创建bat文件时&#xff0c;基本上以创建文本文件然后修改后缀。这样做会默认电脑的文件编码设置。 当创建好两个bat文件后&#xff0c;仔细看下面的mybat1.bat是没有改动过&#xff0c;自动生成的编码UTF-8。 与之下面利用vscode修改编码格式为GBK。 运行这两个bat&#xf…

关于axios.js中的POST连接JAVA后台无法获取值,或者直接在JavaScript中拦截问题解决

这个问题很久前就碰到了&#xff0c;那时候没那心情研究这个&#xff0c;但今天大晚上通宵研究这个问题&#xff0c;百度了一大堆。但是这些回答都是Feces&#xff0c;真的很烦&#xff0c;贴段代码就ok了。把完整代码发出来&#xff0c;让人跑跑&#xff0c;看看是否真的解决了…

ORA-12541: TNS: 无监听程序

以前Oracle没有任何问题&#xff0c;使用a5连接数据库也没有问题&#xff0c;突然今天不行了&#xff0c;每次都报这个&#xff0c;查了下原因。才发现&#xff0c;好像是上次电脑太卡了&#xff0c;手动关闭了后台运行程序&#xff0c;直接把Oracle主程序干没了。 后面重启都…

IJ000457,IJ000461

记录一下&#xff0c;JBoss的错误。 两个不同类型数据库创建链接,在查询某个表时&#xff0c;直接抛出异常。 解决方案还是百度的&#xff0c;加一个配置 jta“false” 在标签< datasource>里面加上这句话&#xff0c;画面没有挂掉&#xff0c;正常跑通。 standalone.xm…

PostgreSQL/Oracle全角空格替换

记录下SQL的trim方法&#xff0c;全角空格在两个数据库同时运作。 原SQL select * trim (chr(‘ ’) from 字段名&#xff09; as 字段名 from 表名&#xff1b; 新SQL select * trim&#xff08;chr&#xff08;33088&#xff09; from 字段名&#xff09;as 字段名 from 表…