使用Popup窗口创建无限级Web页菜单(8)

简介:
  最后总结一下示例中的一些小问题,没有什么太重要的东西,主要都是为了UI上更好看些。

    显示特效的支持,使用style的filter来实现的,代码:
ExpandedBlockStart.gif #region Menu.prototype.FadeinEffect = function(effect)
None.gif Menu.prototype.FadeinEffect  =  function (effect)
None.gif{
None.gif    
if  (  !this .m_Popup  ||   !this .m_Popup.isOpen )
None.gif    {
None.gif        
return ;
None.gif    }
None.gif    
var  menuHtml  =  this .m_Popup.document.getElementById('menu');
None.gif    
if  (  ! menuHtml )
None.gif    {
None.gif        
return ;
None.gif    }
None.gif    
var  filterString  =  'progid:DXImageTransform.Microsoft.';
None.gif    
switch (effect)
None.gif    {
None.gif        
case  'GradientWipeLeft2Right' :
None.gif        {
None.gif            filterString 
+=   " GradientWipe(duration='0.5',gradientSize='0.75',motion='forward') " ;
None.gif            
break ;
None.gif        }
None.gif        
case  'GradientWipeUp2Down' :
None.gif        {
None.gif            filterString 
+=   " GradientWipe(duration='0.5',gradientSize='0.25',motion='forward',wipeStyle='1') " ;
None.gif            
break ;
None.gif        }
None.gif        
case  'RevealTrans' :
None.gif        {
None.gif            filterString 
+=   " RevealTrans(duration='0.5',transition='12') " ;
None.gif            
break ;
None.gif        }
None.gif        
case  'Fade' :
None.gif        {
None.gif            filterString 
+=  'Fade()';
None.gif            
break ;
None.gif        }
None.gif        
default  :
None.gif        {
None.gif            filterString 
=  '';         //  no effect
None.gif
            break ;
None.gif        }
None.gif    }
None.gif    
if  ( filterString )
None.gif    {
None.gif        menuHtml.style.visibility 
=  'hidden';
None.gif        menuHtml.style.filter 
=  filterString;
None.gif        menuHtml.filters[
0 ].apply();
None.gif        menuHtml.style.visibility 
=  'visible';
None.gif        menuHtml.filters[
0 ].play( 0.25 );
None.gif    }
None.gif};

 #endregion

    菜单条目上Text太长时使用...截断显示,代码如下:
ExpandedBlockStart.gif #region Menu.prototype.__isEllipsis = function(menuObj, menuHtml)
None.gifMenu.prototype.__isEllipsis =  function(menuObj, menuHtml)
None.gif{
None.gif     if ( menuHtml.offsetWidth > Menu.Attributes.MaxMenuItemTextWidth )
None.gif    {
None.gif         for (  var i=0 ; i < menuHtml.rows.length ; ++i )
None.gif        {
None.gif             var tr = menuHtml.rows(i);
None.gif             if ( !tr.type || tr.type != 'normal' )
None.gif            {
None.gif                 continue;
None.gif            }
None.gif             var td = tr.cells(2);
None.gif             var span = td.childNodes[0];
None.gif            
None.gif             if ( span.scrollWidth > Menu.Attributes.MaxMenuItemTextWidth )
None.gif            {
None.gif                td.style.fontWeight = 'bold';
None.gif                 var doc = menuObj.m_Popup.document;
None.gif                 var tbl = doc.createElement('TABLE');
None.gif                tbl.border = 0;
None.gif                tbl.cellpadding = 0;
None.gif                tbl.cellspacing = 0;
None.gif                tbl.style.textOverflow = 'ellipsis';
None.gif                tbl.style.tableLayout = 'fixed';
None.gif                tbl.style.color = Menu.Attributes.NormalMenuForeColor;
None.gif                 var tbody = doc.createElement('TBODY');
None.gif                tbl.appendChild(tbody);
None.gif                 var tr = doc.createElement('TR');
None.gif                tbody.appendChild(tr);
None.gif                 var td = doc.createElement('TD');
None.gif                tr.appendChild(td);
None.gif                td.innerHTML = span.innerHTML;
None.gif                menuHtml.rows(i).cells(2).innerHTML = '';
None.gif                menuHtml.rows(i).cells(2).appendChild(tbl);
None.gif                tbl.style.lineHeight = '85%';
None.gif                td.style.width = '100%';
None.gif                td.style.overflow = 'hidden';
None.gif                td.style.whiteSpace = 'nowrap';
None.gif                td.style.textOverflow = 'ellipsis';
None.gif                tbl.title = td.innerText;
None.gif            }
None.gif        }
None.gif        menuHtml.style.width = Menu.Attributes.MaxMenuItemTextWidth;
None.gif    }
None.gif     return menuHtml.offsetWidth;
None.gif};
  #endregion
    Menu.Attributes.MaxMenuItemTextWidth是预设的MenuItem上Text的最大宽度,如果超过这个宽度将使用一个table element把Text包装起来,然后使用CSS使其产生"..."效果。要用CSS的text-overflow:ellipsis产生"..."效果,这里有几个地方需要注意:必须用一个表格包起来,表格的CSS要设置table-layout为fixed;然后文字外的html element(本例中是td)的样式表必须设置为:overflow: hidden; white-space: nowrap; text-overflow: ellipsis;,缺一不行,当然如果有继承下来的css属性也可以。 
    ContextMenu3.gif

    菜单中文字被截断的效果

    比如要显示如下效果:
 
MenuItem 1234567890 1234567890 1234567890
    HTML代码为:
None.gif  < table  style ="table-layout: fixed;"  width ="200" >
None.gif      < tr >
None.gif          < td  style ="overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
None.gif                 border: solid 1px red;"
>MenuItem 1234567890 1234567890 1234567890
None.gif          </ td >
None.gif      </ tr >
None.gif  </ table >
    当我们的文字显示为"..."overflow样式后,我们还可以查询到这个状态,并给这样的条目添加tooltip。我们只用比较一下td元素的clientWidth和scrollWidth,如果不相等,也就是scrollWidth > clientWidth,就说明文本没有被显示全(当然出滚动条的时候这个比较也成立)。

    子菜单弹出时如果其右边的屏幕空间不够菜单的宽度,菜单将从父级菜单的左边弹出,使用下面的代码实现:
None.gif subpop.show(0, 0, 1, 1);
None.gif  var menuHtml = subpop.document.getElementById('menu');
None.gif  var x, y, w, h;
None.gif x = miHtml.offsetWidth-2;
None.gif y = 0;
None.gif w = menuHtml.offsetWidth;
None.gif w =  this.__isEllipsis(subMenuObj, menuHtml);
None.gif h = menuHtml.offsetHeight;
None.gif
None.gif  var availableScreenWidth = window.screen.width;
None.gif  var factWidth = popup.document.parentWindow.screenLeft + menuObj.m_Bounds.width + w;
None.gif  if ( factWidth > availableScreenWidth )
None.gif {
None.gif     x = - w + 2;
None.gif }    
None.gif subpop.show(x, y, w, h, miHtml);
None.gif subMenuObj.FadeinEffect(Menu.Attributes.ShowMenuEffect);
    前面说到到的FadeinEffect和__isEllipsis两个方法分别是在上面的位置被调用的。 

    如果对于popup制作无限级web页菜单还有疑问,或者有什么建议欢迎提出来讨论emsmile.gif


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。  

目录
相关文章
|
存储 IDE 前端开发
SpringBoot2.x系列教程02--新纪元之SpringBoot创建Web项目的常用方式
前言 在上一章节中,壹哥 给大家介绍了SpringBoot的优缺点,并重点介绍了其”约定大于配置“的思想,你现在还能记得吗? 而且上文中,壹哥 说我们创建SpringBoot项目有3种方式,我们已经学习了第一种创建项目的方式了,接下来还有另外两种创建项目的方式,这两种方式该怎么创建项目呢?今天 壹哥 就把剩余的两种方式也一股脑都抖搂给大家吧。 一. 以官网模板方式创建Web项目(了解) 首先 壹哥 给大家介绍第2种创建Web项目的方式,对于这种方式大家仅做了解即可,其原理与第一种以Spring Initializr创建项目的方式一样。 1. 在spring.io官网下载模板构建项目 首先我们
328 0
|
存储 前端开发 JavaScript
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
611 0
|
JSON JavaScript 中间件
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
200 1
【node.js从入门到精通】使用express创建web服务器,路由,进行中间件的创建链接路由及其他中间件
|
NoSQL MongoDB 数据库
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
281 0
MongoDB v4.4.6安装、创建服务及Web客户端访问MongoDB详解
|
数据采集 Go
Go Web编程实战(9)----创建客户端
Go Web编程实战(9)----创建客户端
141 1
|
Java Go
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
190 0
Go Web编程实战(8)----创建HTTP与HTTPS服务器端
|
JavaScript
【Node.JS 】创建基本的web服务器
【Node.JS 】创建基本的web服务器
159 0
【Node.JS 】创建基本的web服务器
|
Java Maven
IDEA2022版本创建maven web项目(两种方式)
创建maven web项目有两种方式,一种是使用骨架方式,一种是不使用骨架的方式
704 1
IDEA2022版本创建maven web项目(两种方式)
|
Web App开发 XML 开发框架
WebAPI学习(一)——创建Web API程序
WebAPI学习(一)——创建Web API程序
250 0
|
JavaScript 前端开发
Node.js 创建并封装静态 WEB 服务器
Node.js 创建并封装静态 WEB 服务器
123 0
Node.js 创建并封装静态 WEB 服务器