​在控制台查看元素已经加载,但是网页上不显示

​在控制台查看元素已经加载,但是网页上不显示

dropdown.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>dropdown</title>
<link rel="stylesheet" href="../css/base.css">
<style>
/*分离出dropdown公共样式*/
.dropdown{
position: relative;
}
.dropdown-toggle{
position: relative;
z-index:2;
}
.dropdown-arrow{
display: inline-block;
vertical-align: middle;
background-repeat: no-repeat;
}
.dropdown-list{
display: none;
position: absolute;
z-index:1;
}
.dropdown-left{
left:0;
right:auto;
}
.dropdown-right{
right:0;
left:auto;
}
/*分离出nav的dropdown独有样式*/
.menu .dropdown-toggle{
display: block;
padding:0 16px 0 12px;
border-right:1px solid #f3f5f7;
border-left:1px solid #f3f5f7;
}
.menu .dropdown-arrow{
margin-left:8px;
vertical-align: middle;
}
.menu .dropdown-list{
border:1px solid #cdd0d4;
background-color: #fff;
top:100%;
overflow:hidden;/*避免容器还没显示时,文字提前显示*/
}
.menu-item{
height:30px;
line-height:30px;
padding:0 12px;
white-space: nowrap;
}
/*鼠标移入*/
.menu-item:hover{
background-color: #f3f5f7;
}
.menu-active .dropdown-toggle{
color:#f01414;
background-color:#fff;
    border-color:#cdd0d4;
}

@font-face {
  font-family: "iconfont";
  src: url('../font/iconfont.eot?t=1582272973653'); /* IE9 */
  src: url('../font/iconfont.eot?t=1582272973653#iefix') format('embedded-opentype'), /* IE6-IE8 */
  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMgAAsAAAAABxAAAALRAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgqBbIFbATYCJAMMCwgABCAFhG0HQRssBsgekiSCCCFEuNlXEQBAPHzt93ru7n5ElURBCR2BR5Bliy51gKpGVNYCG9XxbMSbd+4zPSCMOgTu9Sct57/89MAB8gDg+U2hMJtwk9PLaOlpn+dyehPoQO6qb1lua9nY4/lRL8A4oEDHGrQICiQgT0F2R6CWvJtA25Ik3NGapi7gonAGBeKOLPLApRRRFCnfFOotM4t4zVEzPUnf8Cr+fvy3M1xIapkz8vi1agso+zX5VZFnqjVDIUG9nAvSPDI2AwpxtTVznr2QOHttk0N/eV0R0lLxqiJWmZb6Qf94iahzartgPc0mfvn7coJfFXdIIIM6Co4BTlN2+u4sWkuugcK7XzPWn03hfqHrBFzKHnD9N/PZ4F7P9ffhg8fc2Vs3r7PmkLOEZ8HuotvxoydrARZ8tPZoJtANHTbfLfNt8m1kb0r92n/hum2PejfY0bcssN9up2U/iqlrDF15exnd72H3eLIT35f1BRwJ/n/uTXKjpdzjBd/wyYYk987lMN+Ix9xY6SQYA1D9yB9yEQDktVT2m3/jYS3h8+ig6F+zU8BP8933OFL9KHBL8yaMMVH5U9VgQzG1jjUXXeWrbF+2/QZdCVrXRsUJjP2ZbpnBtYSmWY6kYRFZ0zJZ2M2o6diNuqYDaNukdn7HBGUvSgsbLRKEoZdI+j4jG/pOFvY3aub+om4Y9mg7G/4rdqyG7FZJEc+QBY5PQ1kgBvbszC2p70CiqfG0qI35HkRtchymp6RV87XIQHSJMbYJMYMxDDElOqwh+yFNI9BKiYIEliIxZi1ITcVtD0oRiA7cHEEhPAaxgMZNg2QCwoDD1oxb7fMdEJFJw6M9ooZiD4SykTuH0qVIA8hakwGJHuUemwmiDAyDQRhF6KAa0g3RaAjI2t5NgQiYFNKElFWBVLcZRk0p21v0/9sGbc7KOVLkKJrXiTlpChLymJJ5jVeCMoMREwAAAAA=') format('woff2'),
  url('../font/iconfont.woff?t=1582272973653') format('woff'),
  url('../font/iconfont.ttf?t=1582272973653') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
  url('../font/iconfont.svg?t=1582272973653#iconfont') format('svg'); /* iOS 4.1- */
}

.iconfont {
  font-family: "iconfont" !important;
  font-size: 14px;
  font-style: normal;/*i标签自带斜体效果*/
  -webkit-font-smoothing: antialiased;/*在webkit内核和火狐浏览器中,抗锯齿*/
  -moz-osx-font-smoothing: grayscale;
}

[class*="-active"] .dropdown-arrow{
-webkit-transform:rotate(180deg);
-moz-transform:rotate(180deg);
-ms-transform:rotate(180deg);
-o-transform:rotate(180deg);
transform:rotate(180deg);
}
/*提取出过渡样式,可公用*/
.transition{
-webkit-transition:all .5s;
-moz-transition:all .5s;
-ms-transition:all .5s;
-o-transition:all .5s;
transition:all .5s;
}
/*showhide组件的样式*/
.fadeOut{
opacity: 0;
visibility: hidden;
}
/*收缩样式*/
.slideUpDownCollapse{
height:0 !important;/*避免因为优先级不够而无法生效*/
padding-top:0 !important;
padding-bottom:0 !important;
}
.slideLeftRightCollapse{
width:0 !important;/*避免因为优先级不够而无法生效*/
padding-left:0 !important;
padding-right:0 !important;
}
.dropdown-loading{
width:32px;
height:32px;
background:url(../img/loading.gif) no-repeat;
margin:20px;
}
</style>
</head>
<body>
<div class="menu dropdown fl" data-active="menu">
<a href="javascript:;" class="dropdown-toggle">我的慕淘<i class="dropdown-arrow iconfont transition">&#xe642;</i></a>
<ul class="dropdown-list dropdown-left">
<!-- <li class="dropdown-loading"></li> -->
<!-- <li class="menu-item"><a href="#">已买到的宝贝</a></li>
<li class="menu-item"><a href="#">我的足迹</a></li> -->
</ul>
</div>

<button class="show-btn">点我显示</button>
<button class="hide-btn">点我隐藏</button>

<script src="../js/jquery.js"></script>
<script src="../js/transition.js"></script>
<script src="../js/showhide.js"></script>
<script src="../js/dropdown.js"></script>
<script>
//绑定事件 显示之前加载数据
$(".dropdown").on("dropdown-show",function(e){
var list=$(this).find(".dropdown-list");
var html="";

list.html('<li class="dropdown-loading"></li>');

//$.getJSON(文件,回调) jquery封装的获取json数据的方法
setTimeout(function(){
$.getJSON("dropdown.json",function(data){
//console.log(data);
for(var i=0;i<data.length;i++){
console.log(data[i]);
html+='<li class="menu-item"><a href="'+data[i]["url"]+'">'+data[i]["name"]+'</a></li>';
}
//console.log(html);
list.html(html);
});
},1000);//模拟线上延迟

});

//指定参数
$(".dropdown").dropdown({
event:"hover",
css3:true,
js:true,
animation:"slideUpDown"
});

//通过按钮也可以控制下拉菜单的显示隐藏
$(".show-btn").on("click",function(){
$(".dropdown").dropdown("show");
});
$(".hide-btn").on("click",function(){
$(".dropdown").dropdown("hide");
});
</script>
</body>
</html>

dropdown.js

(function($){
	'use strict';//使用严格模式

	//构造函数形式
	function Dropdown(elem,options){
		//保存到this中才能公用
		this.elem=elem;
		this.options=options;
		this.timer=null;
		this.list=this.elem.find(".dropdown-list");//下拉列表是需要动画的部分
		this.activeClass=options.active+"-active";

		this._init();//初始化
	}
	Dropdown.defaults={
		event:"hover",//还有click
		css3:false,
		js:false,
		animation:"fade",
		delay:0,//默认无延迟
		active:"dropdown"
	};
	//约定俗称:内部使用的可以以_开头
	Dropdown.prototype._init=function(){
		var self=this;

		//指定动画模式
		this.list.showHide(this.options);
	
		//绑定事件
		this.list.on("show shown hide hidden",function(e){
			//console.log(e.type);
			//消息转发
			self.elem.trigger("dropdown-"+e.type);//触发事件
		});
		if(this.options.event==="click"){	

			this.elem.click(function(e){
				self.show();
				e.stopPropagation();//阻止冒泡,否则点击下拉时也会冒泡到document,导致显示后立刻隐藏的效果
			});
			//点击空白处消失
			$(document).click($.proxy(this.hide,this));

		}else{//容错机制,写错默认也是hover
			this.elem.hover($.proxy(this.show,this),$.proxy(this.hide,this));
		}			
	};
	Dropdown.prototype.show=function(){
		var self=this;
		if(this.options.delay){
			//如果有延迟
			this.timer=setTimeout(function(){
				_show();
			},this.options.delay);
		}else{
			//没有延迟
			_show();
		}
		function _show(){
			self.elem.addClass(self.activeClass);
			self.list.showHide("show");//show
		}
		
	}
	Dropdown.prototype.hide=function(){
		if(this.options.delay){
			clearTimeout(this.timer);
		}
		this.elem.removeClass(this.activeClass);
		this.list.showHide("hide");//show
	}

	//插件形式
	$.fn.extend({
		dropdown:function(opt){
			return this.each(function(){
				var ui=$(this);
				var dropdown=ui.data("dropdown");
				//opt是参数对象
				var options=$.extend({},Dropdown.defaults,ui.data(),typeof opt==="object"&&opt);
				
				//单例:一个DOM元素对应一个实例,如果已经存在则不需要反复实例化
				if(!dropdown){
					dropdown=new Dropdown(ui,options);
					ui.data("dropdown",dropdown);
				}
				
				//opt是show或者hide
				if(typeof dropdown[opt]==="function"){
					dropdown[opt]();
				}
			});
		}
	});

})(jQuery);
//为了防止$符发生冲突,将jQuery作为参数传入,则$符作为内部变量,不会发生冲突

在控制台查看元素是已经有了,就是网页上没有

http://img1.sycdn.imooc.com//climg/5e50ff6308012d3d07410642.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,请问你说的动画是这个吗?

http://img1.sycdn.imooc.com//climg/5e51f57e09682a9401050108.jpg

这个是一个延迟加载的图片。先显示一个图片,在1s之后将数据填充进来,这样高度就会被内容自动撑开了,所以就不需要再设置高度了。

如果再设置“$elem.height($elem.height());”的话,是在图片显示的时候获取到下拉框的高度为0,那么再设置还是0,因此效果不对。

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

好帮手慕码 2020-02-23 09:55:32

同学你好,数据还没有完全加载进来的时候高度是0,当数据完全加载过来,再获取设置也是0,所以这里注释掉才能正常显示。

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

  • 提问者 陈莺莺呀 #1
    我又去看了一遍《实战:下拉菜单组件化》第2-5节课程,老师说如果如果在css中没有设置过高度,则初始化时无法获取到高度,会导致动画效果失效,因此添加了这句$(elem).height($(elem).height())。那么为什么这里把这句注释掉,不会导致动画失效呢?
    2020-02-23 11:03:14
好帮手慕星星 2020-02-22 18:50:17

同学你好,这边测试看到高度设置为0:

http://img1.sycdn.imooc.com/climg/5e51061a09d65d0409400173.jpg

所以显示不出来。可以检查下showHide.js中css3的slideUpDown动画下,是不是设置了高度:

http://img1.sycdn.imooc.com/climg/5e5106b509dde4bb06170355.jpg

这行可以注释掉。因为一开始的高度是0,获取高度再设置上也是0,所以看不到。

如果还是解决不了,建议将showHide.js代码粘贴上来,老师帮助测试。

祝学习愉快!

  • 提问者 陈莺莺呀 #1
    这句注释以后,代码能够正常运行了。但是不太明白为什么要注释掉,之前老师的课程中不是添加上了吗?如果注释掉那当时为啥要添加咧?(不是抬杠,就是有点懵逼==)
    2020-02-22 19:20:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师