本文实例讲述了JS模拟bootstrap下拉菜单效果。分享给大家供大家参考,具体如下:
模拟bootstrap下拉菜单
在工作中要切一个效果:点击导航栏,则出现下列菜单,但是当点击其他地方的时候,就隐藏子菜单,效果有点类似于bootstrap 的“下拉菜单”
由于bootstrap的子菜单的样式与设计不同,因此需要自己写一个类似的效果
当点击某个控件的时候,则显示出下拉菜单,但是,当点击空白的地方的时候怎么让其自动隐藏呢?
起初的想法,给body绑定一个onclick事件,当点击空白的地方由于事件冒泡,触发click body的事件,但是问题来了,点击控件的时候,同样会触发body的click事件,导致下拉菜单显示出来之后,有被收缩回去了,因此这个思路不正确
由于bootstrap已经实现了这个功能,查看其源代码,找到了解决思路:
给document绑定事件(隐藏其子菜单),当触发控件的方法时则阻止其冒泡,不让其触发绑定
<!-- 筛选导航栏 --> <div class=\"border_b_bottom_3eee text-center width_40 float_left active\" style=\"z-index: 999\"> <div class=\"margin_bottom_10 margin_top_10 \"> <span onclick=\"showOrHideItem(this,event)\" class=\"title\"> 分类 <span class=\"caret\"></span> </span> <ul class=\"list-unstyled all_width sqh_absolute sqh_line_height_25 sqh_tmp_bj_ff border_b_bottom_eee sqh_position_top_100 sqh_position_left_0 display_none\" data-show=\"hide\" style=\"z-index: 999;\"> <li class=\" margin_left_10 margin_right_10 sqh_pointer border_b_bottom_eee\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">家政</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> <li class=\" margin_left_10 margin_right_10 sqh_pointer border_b_bottom_eee\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">蔬菜</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> <li class=\" margin_left_10 margin_right_10 sqh_pointer sqh_font_color_red\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">零食</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> </ul> </div> </div> <div class=\"text-center border_b_bottom_3eee width_40 float_left\"> <div class=\"margin_bottom_10 margin_top_10 border_b_right_eee\"> <span onclick=\"showOrHideItem(this,event)\" class=\"title\"> 分类 <span class=\"caret\"></span> </span> <ul class=\"list-unstyled all_width sqh_absolute sqh_line_height_25 sqh_tmp_bj_ff border_b_bottom_eee\" data-show=\"hide\" style=\"top:100%;left: 0px;z-index: 999;display: none\"> <li class=\" margin_left_10 margin_right_10 sqh_pointer border_b_bottom_eee\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">家政1</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> <li class=\" margin_left_10 margin_right_10 sqh_pointer border_b_bottom_eee sqh_font_color_red\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">蔬菜1</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> <li class=\" margin_left_10 margin_right_10 sqh_pointer\" onclick=\"jumpTo(this)\" target=\"https://www.baidu.com\"> <span class=\"float_left\">零食1</span> <span class=\"float_right icon iconfont sqh_line_height_15\"></span> <span class=\"clearfix\"></span> </li> </ul> </div> </div> <div class=\"text-right border_b_bottom_3eee text-center width_20 float_left\"> <div class=\"margin_bottom_10 margin_top_10\" onclick=\"showSearch(this,event)\"> <span class=\"icon iconfont font_14 display_block padding_left_5\"></span> </div> <!-- 显示搜索框 --> <div class=\" sqh_tmp_bj_ff\"> <div class=\"sqh_absolute sqh_line_height_25 sqh_tmp_bj_ff search_cont\" style=\"top:58%;right: 0px;z-index: 999;display: none;\" data-search=\"hide\"> <div class=\"margin_left_15 \"> <div class=\"sqh_relative\" style=\"margin-right: 80px;\"> <span class=\"icon iconfont font_14 sqh_absolute padding_left_5\" style=\"left: 0px;top:0px;\"></span> <input class=\"in_search all_width padding_left_30 sqh_tmp_bj_f3 sqh_border_radius_20\" placeholder=\"搜索\" onclick=\"stopEvent(this,event)\" type=\"text\" value=\"\"> </div> <div class=\"float_right\" style=\"width: 80px;\"> <button type=\"button\" class=\"btn btn-e4005a\" style=\"padding: 4px 12px;\">搜索</button> </div> </div> </div> </div> </div> <script> $(function(){ //给document绑定事件 $(document).on(\"click\",function(){ //找到控件是ul并且包含属性data-show=\"show\"的控件,如果有,则让其隐藏起来 $(\"ul[data-show=\'show\']\").slideUp(\"slow\"); }); $(document).on(\"click\",function(){ //找到控件是div并且包含属性data-show=\"show\"的控件,如果有,则修改其css属性。 $(\"div[data-search=\'show\']\").css(\"display\",\"none\").css(\"width\",\"32%\"); }); }); //显示或关闭筛选条件 function showOrHideItem(obj,event){ // alert(arguments.callee); // alert(showOrHideItem.caller); var $currentObj = $(obj); //隐藏所有的下拉列表 $(\"ul[data-show=\'show\']\").hide(); //清除所有active类 $currentObj.closest(\".row\").find(\"div.active\").removeClass(\"active\"); //给当前div添加选中样式 $currentObj.closest(\".float_left\").addClass(\"active\") var $ul = $currentObj.closest(\"div\").find(\"ul\"); //ul是展开状态 if($ul.data(\"show\") == \"show\"){ $ul.slideUp(\"slow\"); $ul.attr(\"data-show\",\"hide\"); }else{ //ul是展开状态 $ul.slideDown(\"slow\"); $ul.attr(\"data-show\",\"show\"); //阻止事件冒泡 event.stopPropagation(); } } //展示搜索框 function showSearch(obj,event){ var $currentObj = $(obj).closest(\".float_left\").find(\".search_cont\").css(\"display\",\"block\"); $currentObj.animate({ width: \"100%\" }, 1000 ); $currentObj.attr(\"data-search\",\"show\"); //阻止事件冒泡 event.stopPropagation(); } function stopEvent(obj,event){ //阻止事件冒泡 event.stopPropagation(); } </script>
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
本文地址:https://www.stayed.cn/item/16535
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我