草履虫在路上

记录生活,学习的点点滴滴.致力于Web2.0学习,邮箱:caolvchong At gmail.com

2007-11-19 19:59:31

« 网站换肤技术区域块伸缩效果实现(toggle效果) »

Tooltip效果

网上tooltip效果有不少,简易实用的不多.比如google的,长的可怕,也让人看不懂.还有一些属于IE only.在jQuery中有一个tooltip效果,还算不错.但个人不是很喜欢,而且还要加个jQuery,无疑,代码长了一些.
下面是之前在蓝色上看到的一个tooltip效果,不错,对它做了一些修改(比如之前只是对链接有tooltip效果,现在对图片也可以有这个效果)加了注释,是深入javascript深入UI学习的一个不错的例子.
当然,你可以在tooltip的基础上加入AJAX效果.(如果是文章发布系统,比较好的是文章会有个简介,AJAX把这部分内容放到tooltip中去.
说明:

原作者:不详(如果有人知道,email我,会及时修改)
修改者:草履虫
联系:caolvchong@gmail.com
转贴请说明上面一段

效果图: 预览地址:http://mmchong.3322.org:81/tooltip/tooltip.html 本机上,有时可能访问不了 使用说明:

在需要的页面引用这段js,或者你把它写入js文件调用,并在window.onload中加入enable_tooltip();即可

范例打包下载: tooltip.rar
//===============================tooltip效果函数================================
/*--->enableTooltips()
 * 功能:调用tooltip效果
 * 参数:无
 * 返回:无
 */
	function enable_tooltip(){
		var links,i,h;
		//是否支持DOM
		if(!document.getElementById || !document.getElementsByTagName){
			return;
		}
		//添加样式
		add_css();
		h=document.createElement("span");
		h.setAttribute("id","btc");
		h.style.position="absolute";
		document.getElementsByTagName("body")[0].appendChild(h);
		//遍历链接,添加tooltip事件
		for(i=0;iPrepare(el)
 * 功能:实现tooltip的显示,删除,透明度等功能
 * 参数:
 * 		el:受作用节点
 * 返回:无
 */
	function Prepare(el){
		//变量说明:
			//tooltip:tooltip效果的整体,装载在id为btc的span标签中
			//s:显示链接的title,tooltip的上半部分效果
			//t:title的值
			//b:显示链接的href,tooltip下半部分效果
			//l:链接内容,就是href的值
		var tooltip,t,b,s,l;
		t=el.getAttribute("title");
		if(t==null || t.length==0){
			return;
		}
		//去掉该节点的title属性
		if(el.getAttribute("title")){
			el.removeAttribute("title");
		}
		if(el.getAttribute("alt")){
			el.removeAttribute("alt");
		}
		//创建节点tooltip,标签为span,设置class属性值为tooltip
		tooltip=CreateEl("span","tooltip");
		//创建节点s,标签为span,设置class属性值为top.s节点是用来显示a链接的title内容
		s=CreateEl("span","top");
		s.appendChild(document.createTextNode(t));
		tooltip.appendChild(s);
		
		//创建节点b,标签为span,设置class属性值为bottom.b节点是用来显示a的链接的href内容
		b=CreateEl("b","bottom");
		l=el.getAttribute("href") || el.getAttribute("src");
		if(l.length>30) l=l.substr(0,27)+"...";
		b.appendChild(document.createTextNode(l));
		tooltip.appendChild(b);
		//设置透明度
		setOpacity(tooltip);
		el.tooltip=tooltip;
		//节点的鼠标移到上面事件:显示tooltip
		el.onmouseover=showTooltip;
		//节点的鼠标移出事件:移除tooltip
		el.onmouseout=hideTooltip;
		//节点的鼠标在上面移动事件:只要调整位置
		el.onmousemove=Locate;
	}
/*--->add_css()
 * 功能:动态添加样式
 * 参数:无
 * 返回值:无
 */
	function add_css(){
		var l=CreateEl("link");
		l.setAttribute("type","text/css");
		l.setAttribute("rel","stylesheet");
		l.setAttribute("href","css/tooltip.css");
		l.setAttribute("media","screen");
		document.getElementsByTagName("head")[0].appendChild(l);
	}
/*--->CreateEl(t,c)
 * 功能:创建一个标签节点,并设置它的css属性
 * 参数:
 * 		t:要创建的标签名
 * 		c:要创建的css的class名
 * 返回:创建的节点
 */
	function CreateEl(t,c){
		var x=document.createElement(t);
		x.className=c;
		x.style.display="block";
		return(x);
	}
/*--->setOpacity(el)
 * 功能:设置tooltip的透明度
 * 参数:tooltip当前节点
 * 返回值:无
 */
	function setOpacity(el){
		el.style.filter="alpha(opacity:75)";
		el.style.KHTMLOpacity="0.75";
		el.style.MozOpacity="0.75";
		el.style.opacity="0.75";
	}
/*--->showTooltip(e)
 * 功能:显示tooltip,并设置位置
 * 参数:
 * 		e:事件,这里接受a的onmouseover
 * 返回:无
 * 说明:由于是把tooltip节点做为孩子加入btc节点,所以后面删除只要移除tooltip节点即可.
 * 	    而tooltip是第一个孩子,所以removeChild掉firstChild即可
 */
	function showTooltip(e){
		document.getElementById("btc").appendChild(this.tooltip);
		Locate(e);
	}
/*--->hideTooltip(e)
 * 功能:移除tooltip显示
 * 参数:
 * 		e:事件,这里接受a的onmouseout事件
 * 返回:无
 */
	function hideTooltip(e){
		//获取tooltip节点
		var d=document.getElementById("btc");
		if(d.childNodes.length>0) d.removeChild(d.firstChild);
	}
/*--->Locate(e)
 * 功能:设置tooltip的位置
 * 参数:
 * 		e:事件,,这里接受a的onmousemove
 * 	返回:无
 */
	function Locate(e){
		var posx=0,posy=0;
		if(e==null) e=window.event;
		if(e.pageX || e.pageY){
		    posx=e.pageX; posy=e.pageY;
		}else if(e.clientX || e.clientY){
		    if(document.documentElement.scrollTop){
		        posx=e.clientX+document.documentElement.scrollLeft;
		        posy=e.clientY+document.documentElement.scrollTop;
		    }else{
		        posx=e.clientX+document.body.scrollLeft;
		        posy=e.clientY+document.body.scrollTop;
		    }
		}
		document.getElementById("btc").style.top=(posy+10)+"px";
		document.getElementById("btc").style.left=(posx-20)+"px";
	}
代码请以范例下载包中为准

  • quote 15.阳光
  • 27360281@qq.com ,发到我的QQ邮箱,谢谢,我下不下来,两个链接都不行
  • 2008-1-2 14:24:29 回复该留言
  • quote 14.阳光
  • 区域块伸缩效果实现(toggle效果),发份代码给我,你的原装被我改动过了,上次调试没问题,这次发现个小问题,谢谢
  • 2008-1-2 14:23:19 回复该留言
  • quote 13.阳光
  • 我以前从没写过类,一直不明白,看了你写的后,我才觉得,原来他是一种优雅的管理方式,谢谢
  • 2008-1-2 12:47:43 回复该留言
  • quote 12.阳光
  • //工具函数--->创建元素
    function createElement(t,c){
    var element=document.createElement(t);//创建元素
    element.className=c;//设置样式名
    element.style.display="block";//设置样式
    return(element);
    }
    //工具函数--->设置对象透明度
    function setOpacity(el){
    el.style.filter="alpha(opacity:85)";
    el.style.KHTMLOpacity="0.85";
    el.style.MozOpacity="0.85";
    el.style.opacity="0.85";
    }
  • 2008-1-2 12:45:24 回复该留言
  • quote 11.阳光
  • //显示
    AddToolTitle.prototype.showTitle=function (){
    this.outContainer.appendChild(this.tooltip);
    }
    //隐藏
    AddToolTitle.prototype.hiddenTitle=function (){
    if(this.outContainer.childNodes.length>0) this.outContainer.removeChild(this.outContainer.firstChild);
    }
    //定位
    AddToolTitle.prototype.locate=function (e){
    if(e==null) e=window.event;
    var posx=0,posy=0;
    if(e.pageX || e.pageY){
    posx=e.pageX; posy=e.pageY;
    }else if(e.clientX || e.clientY){
    if(document.documentElement.scrollTop){
    posx=e.clientX+document.documentElement.scrollLeft;
    posy=e.clientY+document.documentElement.scrollTop;
    }else{
    posx=e.clientX
    posy=e.clientY
    }
    }
    this.outContainer.style.top=(posy-60)+"px";
    this.outContainer.style.left=(posx+10)+"px";

    }
  • 2008-1-2 12:45:02 回复该留言
  • quote 10.阳光
  • //创建内部容器
    AddToolTitle.prototype.createInContainer=function (){
    var tooltip=createElement("span","tooltip");
    //创建节点head,标签为h3,设置class属性值为top; head节点是用来显示a链接的title内容--->即上半部分内容
    var head=createElement("h3","top");
    var ta=this.title || this.alt;
    if (ta==null || ta=="") ta="建议您在有title或alt的对象上使用此效果!"
    head.appendChild(document.createTextNode(ta));
    tooltip.appendChild(head);
    //创建节点foot,标签为span,设置class属性值为bottom; foot节点是用来显示a的链接的href内容--->即下半部分内容
    var foot=createElement("b","bottom");
    var hs=this.href || this.src;
    if(hs.length>30) hs=hs.substr(0,27)+"...";
    foot.appendChild(document.createTextNode(hs));
    tooltip.appendChild(foot);
    setOpacity(tooltip);
    return tooltip

    }
    //添加事件
    AddToolTitle.prototype.addEvent=function (){
    var obj = this;
    this.obj.onmouseover = function() {
    obj.showTitle();
    }
    this.obj.onmouseout = function() {
    obj.hiddenTitle()
    }
    this.obj.onmousemove = function(e) {
    obj.locate(e);
    }
    }
  • 2008-1-2 12:44:32 回复该留言
  • quote 9.阳光
  • //处理title
    AddToolTitle.prototype.dealWithTitle=function (){
    if(this.title!="" || this.title!=null){//ie中为"",dom中为null
    this.obj.removeAttribute("title");
    }
    if(this.alt!="" || this.alt!=null){
    this.obj.removeAttribute("alt");
    }
    }
    //创建外部容器
    AddToolTitle.prototype.createOutContainer=function () {
    var outContainer=document.createElement("span");
    outContainer.setAttribute("id","outContainer");
    outContainer.style.position="absolute";
    document.getElementsByTagName("body")[0].appendChild(outContainer);
    return outContainer
    }
  • 2008-1-2 12:43:39 回复该留言
  • quote 8.阳光
  • //创建类
    function AddToolTitle(obj){
    this.obj=obj
    this.title=obj.getAttribute("title");//title显示
    this.alt=obj.getAttribute("alt");//alt显示
    this.href=obj.getAttribute("href");//链接地址
    this.src=obj.getAttribute("src");//图片来源
    this.dealWithTitle()//处理title
    this.outContainer=this.createOutContainer()//外部容器
    this.tooltip=this.createInContainer()//内部容器
    this.addEvent()
    }
  • 2008-1-2 12:43:18 回复该留言
  • quote 7.阳光
  • 我把他改成类类,用的时候创建对象就行,这里发不上
  • 2008-1-2 12:42:46 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog 1.7 Laputa Build 70216

Copyright 2007-2008 草履虫 All Rights Reserved.