为什么下拉框的样式只在第一次下拉时正确?之后再下拉时的样式就不对了?
来源:3-6 改写站点导航中的下拉菜单
Carol246
2019-09-03 23:25:57
(使用wamp、火狐浏览器,且已清除缓存)
html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>慕淘网</title> <link rel="stylesheet" href="css/base.css"> <link rel="stylesheet" href="css/common.css"> <link rel="stylesheet" href="css/index.css"> </head> <body> <!-- 头部 --> <header class="header"> <div class="container"> <!-- 头部-导航栏 --> <nav class="header__nav"> <div class="header__nav__left"> <a href="javascript:;" class="header__nav__left-item header__nav__left-item-login">亲,请登录</a> <a href="javascript:;" class="header__nav__left-item link">免费注册</a> <a href="javascript:;" class="header__nav__left-item link">手机逛慕淘</a> </div> <div class="header__nav__right"> <div class="header__nav__right-item nav dropdown" data-active="nav"> <a href="javascript:;" class="header__nav__right-item__text dropdown__toggle link transition">我的慕淘<i class="dropdown__toggle__arrow icon transition"></i></a> <div class="dropdown__layer dropdown__layer_position_left"> <a href="javascript:;" class="dropdown__layer-item">已买到的宝贝</a> <a href="javascript:;" class="dropdown__layer-item">我的足迹</a> </div> </div> <div class="header__nav__right-item nav dropdown" data-active="nav"> <a href="javascript:;" class="header__nav__right-item__text dropdown__toggle link transition">收藏夹<i class="dropdown__toggle__arrow icon transition"></i></a> <div class="dropdown__layer dropdown__layer_position_left"> <a href="javascript:;" class="dropdown__layer-item">收藏的宝贝</a> <a href="javascript:;" class="dropdown__layer-item">收藏的店铺</a> </div> </div> <div class="header__nav__right-item"> <a href="javascript:;" class="header__nav__right-item__text header__nav__right-item-link link">商品分类</a> </div> <div class="header__nav__right-item nav dropdown" data-active="nav" data-load="js/dropdown.json"> <a href="javascript:;" class="header__nav__right-item__text dropdown__toggle link transition">卖家中心<i class="dropdown__toggle__arrow icon transition"></i></a> <div class="dropdown__layer dropdown__layer_position_left"> <a href="javascript:;" class="dropdown__layer__loading"></a> <!-- <a href="javascript:;" class="dropdown__layer-item">免费开店</a> <a href="javascript:;" class="dropdown__layer-item">已卖出的宝贝</a> <a href="javascript:;" class="dropdown__layer-item">出售中的宝贝</a> <a href="javascript:;" class="dropdown__layer-item">卖家服务市场</a> <a href="javascript:;" class="dropdown__layer-item">卖家培训中心</a> <a href="javascript:;" class="dropdown__layer-item">体验中心</a> --> </div> </div> <div class="header__nav__right-item nav dropdown" data-active="nav"> <a href="javascript:;" class="header__nav__right-item__text dropdown__toggle link transition">联系客服<i class="dropdown__toggle__arrow icon transition"></i></a> <div class="dropdown__layer dropdown__layer_position_right"> <a href="javascript:;" class="dropdown__layer-item">消费者客服</a> <a href="javascript:;" class="dropdown__layer-item">卖家客服</a> </div> </div> </div> </nav> </div> </header> <button id="btn-show">点我打开</button> <button id="btn-hide">点我关闭</button> <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script> <script src="js/transition.js"></script> <script src="js/showHide.js"></script> <script src="js/dropdown.js"></script> <script src="js/index.js"></script> </body> </html>
base.css
*{ margin: 0; padding: 0; } body{ overflow-y: scroll; } a{ text-decoration: none; } li{ list-style-type: none; }
common.css
/* 容器 */ .container{ width: 1200px; margin: 0 auto; } /* 链接 */ .link{ color: #4d555d; } .link:hover{ color: #f00; } /* showHide */ .fadeOut{ visibility: hidden !important; opacity: 0 !important; } .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 */ .dropdown{ position: relative; } .dropdown__toggle{ position: relative; z-index: 2; } .dropdown__layer{ display: none; position: absolute; z-index: 1; } .dropdown__layer_position_left{ left: 0; } .dropdown__layer_position_right{ right: 0; } .dropdown__layer__loading{ display: block; width: 32px; height: 32px; padding: 30px; background: url('../img/loading.gif') center no-repeat; } /* nav dropdown */ .nav .dropdown__toggle__arrow{ vertical-align: middle; display: inline-block; line-height: 1; margin-left: 5px; } .nav .dropdown__layer{ border: 1px solid #cdd0d4; background-color: #fff; top: 43px; } .nav .dropdown__layer-item{ display: block; height: 30px; line-height: 30px; padding: 0 10px; color: #4d555d; white-space: nowrap; } .nav .dropdown__layer-item:hover{ background-color: #f3f5f7; } .nav-dropdown_status_active .dropdown__toggle{ background-color: #fff; color: #f00; border-left: 1px solid #cdd0d4; border-right: 1px solid #cdd0d4; } .nav-dropdown_status_active .dropdown__layer{ /*display: block;*/ } /*icon*/ @font-face { font-family: "iconfont"; src: url('../font/iconfont.eot?t=1477124206'); /* IE9*/ src: url('../font/iconfont.eot?t=1477124206#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../font/iconfont.woff?t=1477124206') format('woff'), /* chrome, firefox */ url('../font/iconfont.ttf?t=1477124206') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('../font/iconfont.svg?t=1477124206#iconfont') format('svg'); /* iOS 4.1- */ } .icon { font-family: "iconfont" !important; font-size: 14px; font-style: normal; -webkit-font-smoothing: antialiased; -webkit-text-stroke-width: 0.2px; -moz-osx-font-smoothing: grayscale; } [class*="-dropdown_status_active"] .dropdown__toggle__arrow { -o-transform: rotate(180deg); -ms-transform: rotate(180deg); -moz-transform: rotate(180deg); -webkit-transform: rotate(180deg); transform: rotate(180deg); } .transition { -o-transition: all 0.5s; -ms-transition: all 0.5s; -moz-transition: all 0.5s; -webkit-transition: all 0.5s; transition: all 0.5s; }
index.css
/* 头部 */ .header{ width: 100%; background-color: #f3f5f7; font-size: 12px; } /* 头部-导航栏 */ .header__nav{ height: 44px; line-height: 44px; border-bottom: 1px solid #cdd0d4; padding: 0 15px; } .header__nav__left{ float: left; } .header__nav__left-item{ margin-right: 5px; } .header__nav__left-item-login{ color: red; } .header__nav__right{ float: right; } .header__nav__right-item{ float: left; } .header__nav__right-item__text{ display: block; height: 44px; padding: 0 12px; border-left: 1px solid #f3f5f7; border-right: 1px solid #f3f5f7; }
transition.js
(function(){ var transitionEndEventName = { transition: 'transitionend', WebkitTransition: 'webkitTransitionEnd', MozTransition: 'mozTransitionEnd', OTransition: 'oTransitionEnd' }; var transitionEnd = '', isSupport = false; for(var name in transitionEndEventName){ if(typeof(document.body.style[name]) !== 'undefined'){ transitionEnd = transitionEndEventName[name]; isSupport = true; break; } } window.mt = window.mt || {}; window.mt.transition = { end: transitionEnd, isSupport: isSupport }; })();
showHide.js
(function($){ var transition = window.mt.transition; function init($ele, callback){ if($ele.is(':hidden')){ $ele.data('status','hidden'); if(typeof(callback) === 'function') callback(); }else{ $ele.data('status','shown'); } } function show($ele, callback){ if($ele.data('status') === 'show') return; if($ele.data('status') === 'shown') return; $ele.data('status','show').trigger('show'); callback(); } function hide($ele, callback){ if($ele.data('status') === 'hide') return; if($ele.data('status') === 'hidden') return; $ele.data('status','hide').trigger('hide'); callback(); } var silent = { init: init, show: function($ele){ show($ele, function(){ $ele.show(); $ele.data('status','shown').trigger('shown'); }) }, hide: function($ele){ hide($ele, function(){ $ele.hide(); $ele.data('status','hidden').trigger('hidden'); }) } }; var css3 = { fade: { init: function($ele){ css3._init($ele, 'fadeOut'); }, show: function($ele){ css3._show($ele, 'fadeOut'); }, hide: function($ele){ css3._hide($ele, 'fadeOut'); } }, slideUpDown: { init: function($ele){ $ele.height($ele.height()); css3._init($ele, 'slideUpDownCollapse'); }, show: function($ele){ css3._show($ele, 'slideUpDownCollapse'); }, hide: function($ele){ css3._hide($ele, 'slideUpDownCollapse'); } }, slideLeftRight: { init: function($ele){ $ele.width($ele.width()); css3._init($ele, 'slideLeftRightCollapse'); }, show: function($ele){ css3._show($ele, 'slideLeftRightCollapse'); }, hide: function($ele){ css3._hide($ele, 'slideLeftRightCollapse'); } }, fadeSlideUpDown: { init: function($ele){ $ele.height($ele.height()); css3._init($ele, 'fadeOut slideUpDownCollapse'); }, show: function($ele){ css3._show($ele, 'fadeOut slideUpDownCollapse'); }, hide: function($ele){ css3._hide($ele, 'fadeOut slideUpDownCollapse'); } }, fadeSlideLeftRight: { init: function($ele){ $ele.width($ele.width()); css3._init($ele, 'fadeOut slideLeftRightCollapse'); }, show: function($ele){ css3._show($ele, 'fadeOut slideLeftRightCollapse'); }, hide: function($ele){ css3._hide($ele, 'fadeOut slideLeftRightCollapse'); } } }; css3._init = function($ele, className){ $ele.addClass('transition'); init($ele, function(){ $ele.addClass(className); }); }; css3._show = function($ele, className){ show($ele, function(){ $ele.show(); $ele.off(transition.end).one(transition.end, function(){ $ele.data('status','shown').trigger('shown'); }); setTimeout(function(){ $ele.removeClass(className); },0) }) }; css3._hide = function($ele, className){ hide($ele, function(){ $ele.off(transition.end).one(transition.end, function(){ $ele.hide(); $ele.data('status','hidden').trigger('hidden'); }); $ele.addClass(className); }) }; var js = { fade: { init: function($ele){ js._init($ele); }, show: function($ele){ js._show($ele, 'fadeIn'); }, hide: function($ele){ js._hide($ele, 'fadeOut'); } }, slideUpDown: { init: function($ele){ js._init($ele); }, show: function($ele){ js._show($ele, 'slideDown'); }, hide: function($ele){ js._hide($ele, 'slideUp'); } }, slideLeftRight: { init: function($ele){ js._customInit($ele, ['width', 'padding-left', 'padding-right']); }, show: function($ele){ js._customShow($ele); }, hide: function($ele){ js._customHide($ele); } }, fadeSlideUpDown: { init: function($ele){ js._customInit($ele, ['opacity', 'height', 'padding-top', 'padding-bottom']); }, show: function($ele){ js._customShow($ele); }, hide: function($ele){ js._customHide($ele); } }, fadeSlideLeftRight: { init: function($ele){ js._customInit($ele, ['opacity', 'width', 'padding-left', 'padding-right']); }, show: function($ele){ js._customShow($ele); }, hide: function($ele){ js._customHide($ele); } } }; js._init = function($ele, callback){ $ele.removeClass('transition'); init($ele, callback); }; js._customInit = function($ele, optionsArr){ var styles = {}, cssArg = {}; for(var k in optionsArr){ styles[optionsArr[k]] = $ele.css(optionsArr[k]); cssArg[optionsArr[k]] = 0; } $ele.data('styles', styles); js._init($ele, function(){ $ele.css(cssArg); }); }; js._show = function($ele, mode){ show($ele, function(){ $ele.stop()[mode](function(){ $ele.data('status', 'shown').trigger('shown'); }); }) }; js._customShow = function($ele){ show($ele, function(){ $ele.show(); $ele.stop().animate($ele.data('styles'), function(){ $ele.data('status', 'shown').trigger('shown'); }); }); }; js._hide = function($ele, mode){ hide($ele, function(){ $ele.stop()[mode](function(){ $ele.data('status', 'hidden').trigger('hidden'); }); }) }; js._customHide = function($ele){ hide($ele, function(){ var animateArg = {}; for(var k in $ele.data('styles')){ animateArg[k] = 0; } $ele.stop().animate(animateArg, function(){ $ele.hide(); $ele.data('status', 'hidden').trigger('hidden'); }); }); }; var defaults = { css3: false, js: false, animation: 'fade' }; function showHide($ele, options){ var mode = null; if(options.css3 && transition.isSupport){ // css3 transition mode = css3[options.animation] || css3[defaults.animation]; }else if(options.js){ // js animation mode = js[options.animation] || js[defaults.animation]; }else{ // no animation mode = silent; } mode.init($ele); return { show: $.proxy(mode.show, this, $ele), hide: $.proxy(mode.hide, this, $ele) }; } // window.mt = window.mt || {}; // window.mt.showHide = showHide; $.fn.extend({ showHide: function(option){ return this.each(function(){ var $this = $(this), options = $.extend({}, defaults, typeof option === 'object' && option), mode = $this.data('showHide'); if(!mode){ $this.data('showHide', mode = showHide($this, options)); } if(typeof mode[option] === 'function'){ mode[option](); } }); } }); })(jQuery);
dropdown.js
(function($){ // 写法二:构造函数 function Dropdown($ele, options){ this.$ele = $ele; this.options = options; this.$layer = this.$ele.find('.dropdown__layer'); this.activeClass = options.active + '-dropdown_status_active'; this._init(); } Dropdown.prototype._init = function(){ var self = this; this.$layer.showHide(this.options); this.$layer.on('show shown hide hidden', function(e){ // self.$ele.trigger('dropdown-' + e.type); // 更新 dropdown__layer 的样式 ??? self.$ele.trigger('dropdown-' + e.type, function(){ self.$layer.height('auto') .height(self.$layer.height()) .width('auto') .width(self.$layer.width()); }); }); if(this.options.event === 'click'){ this.$ele.click(function(e){ self.show(); e.stopPropagation(); }); $(document).click($.proxy(this.hide, this)); }else{ this.$ele.hover($.proxy(this.show, this), $.proxy(this.hide, this)); } }; Dropdown.prototype.show = function(){ var self = this; function _show(){ self.$ele.addClass(self.activeClass); self.$layer.showHide('show'); } if(this.options.delay){ this.timer = setTimeout(function(){ _show(); }, this.options.delay); }else{ _show(); } }; Dropdown.prototype.hide = function(){ clearTimeout(this.timer); this.$ele.removeClass(this.activeClass); this.$layer.showHide('hide'); }; $.fn.extend({ dropdown: function(option){ this.each(function(){ var $this = $(this); var dropdown = $this.data('dropdown'); var options = $.extend({}, $(this).data(), typeof(option) === 'object' && option); if(!dropdown){ $this.data('dropdown', dropdown = new Dropdown($this, options)); } if(typeof dropdown[option] === 'function'){ dropdown[option](); } }); } }); })(jQuery);
dropdown.json
[ { "href": "javascript:;", "text": "免费开店" }, { "href": "javascript:;", "text": "已卖出的宝贝" }, { "href": "javascript:;", "text": "出售中的宝贝" }, { "href": "javascript:;", "text": "卖家服务市场" }, { "href": "javascript:;", "text": "卖家培训中心" }, { "href": "javascript:;", "text": "体验中心" } ]
index.js
// 调用封装好的 dropdown 方法 $('.dropdown').dropdown({ event: 'hover', // hover或click delay: 200, css: true, js: true, animation: 'fadeSlideUpDown', active: 'nav' }); // 通过暴露方法,自定义show、hide $('#btn-show').click(function(){ $('.dropdown').dropdown('show'); }); $('#btn-hide').click(function(){ $('.dropdown').dropdown('hide'); }); // 按需加载 $('.dropdown').on('dropdown-show', function(e, updateLayer){ var $this = $(this); var dataLoad = $this.data('load'); // console.log($this.data()); if(!dataLoad) return; if(!$this.data('loaded')){ var $layer = $this.find('.dropdown__layer'); var html = ''; $.getJSON(dataLoad, function(data){ // 模拟延迟 setTimeout(function(){ for(var i = 0; i < data.length; i++){ html += '<a href="' + data[i].href + '" class="dropdown__layer-item">' + data[i].text + '</a>'; } $layer.html(html); $this.data('loaded', true); // 更新 dropdown__layer 的样式 updateLayer(); }, 1000) }); } });
4回答
好帮手慕夭夭
2019-09-07
你好同学,默认的高度就是元素的初始化高度,是你在css样式中给最初给它设置的。高度为180px是后来菜单内容加载的时候使用js给它动态设置的,不叫默认高度哦。因为鼠标移出的时候,下拉菜单隐藏,所以又把180px高度变为0px达到隐藏的效果,这个180px就没有了哦。
祝学习愉快,望采纳。
好帮手慕夭夭
2019-09-06
你好同学,这个和下拉菜单加载有关系。同学可以在浏览器中按F12查看一下,下拉菜单默认是没有内容的,当鼠标移入的时候,下拉菜单获取的高度值为92px:
这个92px是元素.dropdown__layer__loading的实际高度,也就是下拉菜单默认的。
当它加载内容后,就重新设置了新的高度180px
鼠标离开菜单的时候,只是隐藏了。所以第二次就不需要重新加载,也就不会触发设置下拉菜单的高度。那么它显示的就是它默认的高度92px了。
可以在css重新设置一下高度,如下:
祝学习愉快,望采纳。
Carol246
提问者
2019-09-04
不是的,是第三个下拉框,设置了按需加载的那个。
第一次:
第二次、第三次等等……:
好帮手慕夭夭
2019-09-04
你好同学,老师这边使用谷歌和火狐都测试了一下,移入多次,下拉框样式都是一样的,正常哦。如下:
移入第一次
移入第二次
请同学再测试一下,如果还有问题,你可以先做其他的地方。等作业做完之后在作业区域提交。这样批复老师可以拿到你完整的作业,帮助你更准确高效的指导问题哦。
祝学习愉快,望采纳。
相似问题
回答 4
回答 2