原生JavaScript实现Tooltip浮动提示框特效


Posted in Javascript onMarch 07, 2017

使用原生JavaScript设计和实现Tooltip浮动提示框特效,了解代码简化、事件绑定、事件冒泡等技巧和知识。

特效四个关键点:

显示:鼠标移到ToolTip超链接上时,ToolTip提示框可以显示出来
隐藏:鼠标移开时,ToolTip提示框自动隐藏
定位:ToolTip提示框的位置需要根据ToolTip超链接的位置来设置
可配置:ToolTip提示框可以根据参数不同,改变尺寸和显示内容

注意点:

1)border-radius和 box-shadow兼容写法

2)不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件。对应mouseout

      只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件。对应mouseleave

3)W3C规定不允许内联元素嵌套块级元素 ,其中的a链接嵌套了div,可能不符合W3C标准( tip:他是移入a链接的时候在a链接中创建的div )

简单的函数封装写法(便于引用,缩短代码量):

1)通过元素的id获得元素的DOM引用

var $ = function(id){
return document.getElementById(id);
 }

2)绑定事件的函数

function addEvent(obj,event,fn){ //要绑定的元素对象,要绑定的事件,触发的回调函数
if(obj.addEventListener){ //非IE,支持冒泡和捕获
obj.addEventListenner(event,fn,false);
}else if(obj.attachEvent){ //IE,只支持冒泡
obj.attachEvent('on'+event,fn);
}
}

效果如图:

原生JavaScript实现Tooltip浮动提示框特效

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<style type="text/css">
  body{
    font-size: 14px;
    line-height: 1.8;
    background: url("img/bg.jpg") no-repeat center top;
    font-family: "微软雅黑";
  }
  #demo{
    width: 500px;
    margin: 30px auto;
    padding: 20px 30px;
    position: relative;
    background-color: #fff;
    border-radius: 10px;
    -moz-border-radius: 10px;/*这个属性 主要是专门支持Mozilla Firefox 火狐浏览器的CSS属性*/
    -webkit-border-radius: 10px;/*苹果;谷歌,等一些浏览器认,因为他们都用的是webkit内核*/
    box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2);
    -moz-box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2);
    -webkit-box-shadow: 0px 0px 0px 10px rgba(0,0,0,0.2);
  }
  #demo h2{
    color: #03f;
  }
  #demo .tooltip{
    color: #03f;
    cursor: help;
  }
  .tooltip-box{
    display: block;
    background: #fff;
    line-height: 1.6;
    border: 1px solid #66CCFF;
    color: #333;
    padding: 20px;
    font-size: 12px;
    border-radius: 5px;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    overflow: auto;
  }
  #mycard img{
    float: left;
    width: 100px;
    height: 100px;
    padding: 10px;
  }
  #mycard p{
    float: left;
    width: 150px;
    padding: 0 10px;
  }
</style>
<script type="text/javascript">
  window.onload=function(){
    //绑定事件的函数
     function addEvent(obj,event,fn){  //要绑定的元素对象,要绑定的事件,触发的回调函数
      if(obj.addEventListener){      //非IE,支持冒泡和捕获
        obj.addEventListener(event,fn,false);
      }else if(obj.attachEvent){      //IE,只支持冒泡
        obj.attachEvent('on'+event,fn);
      }
    }
    //通过用户代理的方式判断是否是IE的方法,不能判断出IE11
    var isIE = navigator.userAgent.indexOf("MSIE") > -1;

    var $ = function(id){
      return document.getElementById(id);
    }
    var demo = $("demo");
    //obj  - ToolTip超链接元素
    //id   - ToolTip提示框id
    //html  - ToolTip提示框HTML内容
    //width - ToolTip提示框宽度(可选)
    //height - ToolTip提示框高度(可选)
    function showTooltip(obj,id,html,width,height){
      if($(id)==null){
        //创建 <div class="tooltip-box" id="xx">xxxxxxxx</div>
        var toolTipBox;
        toolTipBox = document.createElement('div');
        toolTipBox.className = "tooltip-box";
        toolTipBox.id = id;
        toolTipBox.innerHTML = html;
        obj.appendChild(toolTipBox);
        toolTipBox.style.width = width ? width + 'px':"auto";
        toolTipBox.style.height = height ? height + 'px':"auto";
        if(!width && isIE){
          toolTipBox.style.width = toolTipBox.offsetWidth;//因为IE不支持auto属性
        }
        toolTipBox.style.position = 'absolute';
        toolTipBox.style.display = 'block';
        var left = obj.offsetLeft;
        var top = obj.offsetTop + 20;
        //当浏览器窗口缩小时不让提示框超出浏览器
        if(left + toolTipBox.offsetWidth > document.body.clientWidth){
          var demoLeft = demo.offsetLeft;
          left = document.body.clientWidth - toolTipBox.offsetWidth - demoLeft;
          if(left < 0)
          left = 0;
        }
        toolTipBox.style.left = left + 'px';
        toolTipBox.style.top = top + 'px';
        addEvent(obj,"mouseleave" ,function(){
          setTimeout(function(){
            $(id).style.display = 'none';
          },300);
        });
      }
      else{
        //显示
        $(id).style.display = 'block';
      }
    }
    //事件冒泡
addEvent(demo,'mouseover',function(e){
  var event = e || window.event;
  var target = event.target || event.srcElement;//IE下,event对象有srcElement属性,但是没有target属性;
  //Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的
  //event.srcElement:表示的当前的这个事件源。
  if(target.className == "tooltip"){
    var _html;
    var _id;
    var _width = 200;
    switch (target.id){
      case "tooltip1":
        _id = "t1";
        _html = "中华人民共和国";
        break;
      case "tooltip2":
        _id = "t2";
        _html = "美国篮球职业联赛";
        break;
      case "tooltip3":
        _id = "t3";
        _html = "<h2>春晓</h2><p>春眠不觉晓,</p><p>处处闻啼鸟。</p><p>夜来风雨声,</p><p>花落知多少。</p>";
        _width = 100;
        break;
      case "tooltip4":
        _id = "t4";
        _html = "<img src='img/1.jpg' width='500' /> ";
        _width = 520;
        break;
      case "tooltip5":
        _id = "t5";
        _html = "<div id='mycard'><img src='img/2.jpg' alt=''/><p><strong>昵称一定要长</strong></p><p>我的简介我的简介</p></div>";
        _width = 300;
        break;
      case "tooltip6":
        _id = "t6";
        _html = "<iframe src='http://www.imooc.com/' width='480' height='300'></iframe>";
        _width = 500;
        break;
    }
    showTooltip(target,_id,_html,_width);
  }
});
    /* var t1 = $("tooltip1");
    var t2 = $("tooltip2");
    var t3 = $("tooltip3");
    var t4 = $("tooltip4");
    var t5 = $("tooltip5");
    var t6 = $("tooltip6");
    t1.onmouseenter = function () {
      showTooltip(this, "t1", '中华人民共和国', 200);
    };
    t2.onmouseenter = function () {
      showTooltip(this, "t2", '美国篮球职业联赛', 200);
    };
    t3.onmouseenter = function () {
      showTooltip(this, "t3", '<h2>春晓</h2><p>春眠不觉晓,</p><p>处处闻啼鸟。</p><p>夜来风雨声,</p><p>花落知多少。</p>', 100);
    };
    t4.onmouseenter = function () {
      showTooltip(this, "t4", '<img src="img/1.jpg" width="500" /> ', 520);
    };
    t5.onmouseenter = function () {
      var _html = '<div id="mycard"><img src="img/2.jpg" alt=""/><p><strong>昵称一定要长</strong></p><p>我的简介我的简介</p></div>';
      showTooltip(this, "t5", _html, 300);
    };
    t6.onmouseenter = function () {
      var _html = '<iframe src="http://www.imooc.com/" width="480" height="300"></iframe>'
      showTooltip(this, "t6", _html, 500);
    };*/
  }
</script>
<body>
<div id="demo">
  <h2>原生JavaScript实现ToolTip效果</h2>
  <p>ToolTip效果是非常常见的网页特效,它可以在用户将指针放置在控件上时为用户显示提示信息。
    比如简称文字显示一行文字全称,例:<a class="tooltip" id="tooltip1">中国</a>, <a class="tooltip" id="tooltip2">NBA</a>。
    又比如显示一段文字,例:唐诗三百首中的<a class="tooltip" id="tooltip3">春晓</a>你会么?如果不看tooltip提示你背不出来的话,那么你
    可要加油了。
  </p>
  <p>
    ToolTip效果还可以用来显示图片,例:<a class="tooltip" id="tooltip4">西湖美景</a>。当然显示一块儿带格式的内容也不在话下,例:
    <a class="tooltip" id="tooltip5">我的资料</a>。
  </p>
  <p>
    甚至你可以显示一整个网站:例:<a class="tooltip" id="tooltip6">慕课网</a>。
  </p>
  <p>
    注意好的ToolTip需要考虑样式、效果、页面的边界等信息,希望你可以做出更漂亮的ToolTip效果。
  </p>
</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
Mar 04 Javascript
关于html+ashx开发中几个问题的解决方法
Jul 18 Javascript
js使用函数绑定技术改变事件处理程序的作用域
Dec 26 Javascript
jquery 之 $().hover(func1, funct2)使用方法
Jun 14 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
Aug 06 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
解决js ajax同步请求造成浏览器假死的问题
Jan 18 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
JavaScript中的ES6 Proxy的具体使用
Jun 16 Javascript
js实现点击选项置顶动画效果
Aug 25 Javascript
基于JavaScript实现图片剪切效果
Mar 07 #Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 #Javascript
js放到head中失效的原因与解决方法
Mar 07 #Javascript
Bootstrap媒体对象学习使用
Mar 07 #Javascript
angular十大常见问题
Mar 07 #Javascript
Bootstrap表单控件学习使用
Mar 07 #Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 #Javascript
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
初识php MVC
2014/09/10 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
AngularJS入门教程之数据绑定用法示例
2016/11/01 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python监控键盘输入实例代码
2018/02/09 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
捐资助学感谢信
2015/01/21 职场文书
个人自荐书怎么写
2015/03/26 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
Go语言实现Snowflake雪花算法
2021/06/08 Golang
Python实现批量自动整理文件
2022/03/16 Python
Nginx的基本概念和原理
2022/03/21 Servers