JS模拟bootstrap下拉菜单效果实例


Posted in Javascript onJune 17, 2016

本文实例讲述了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 相关文章推荐
Jquery 动态添加按钮实现代码
May 06 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
javascript 小数取整简单实现方式
May 30 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
jQuery获取与设置iframe高度的方法
Aug 01 Javascript
Vue方法与事件处理器详解
Dec 01 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
Apr 21 jQuery
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
vue.js异步上传文件前后端实现代码
Aug 22 Javascript
jQuery实现表单动态加减、ajax表单提交功能
Jun 08 jQuery
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
Jul 21 Javascript
JavaScript获取当前url根目录(路径)
Jun 17 #Javascript
下一代Bootstrap的5个特点 超酷炫!
Jun 17 #Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
Jun 17 #Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 #Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 #Javascript
Bootstrap前端开发案例二
Jun 17 #Javascript
jQuery查看选中对象HTML代码的方法
Jun 17 #Javascript
You might like
PHP生成静态页面详解
2006/11/19 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
浅析Python 序列化与反序列化
2020/08/05 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
优秀安全员事迹材料
2014/05/11 职场文书
工会文体活动总结
2015/05/07 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
nginx配置限速限流基于内置模块
2022/05/02 Servers