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

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

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

 #endregion

    菜单条目上Text太长时使用...截断显示,代码如下:
#region Menu.prototype.__isEllipsis = function(menuObj, menuHtml)
Menu.prototype.__isEllipsis =  function(menuObj, menuHtml)
{
     if ( menuHtml.offsetWidth > Menu.Attributes.MaxMenuItemTextWidth )
    {
         for (  var i=0 ; i < menuHtml.rows.length ; ++i )
        {
             var tr = menuHtml.rows(i);
             if ( !tr.type || tr.type != 'normal' )
            {
                 continue;
            }
             var td = tr.cells(2);
             var span = td.childNodes[0];
            
             if ( span.scrollWidth > Menu.Attributes.MaxMenuItemTextWidth )
            {
                td.style.fontWeight = 'bold';
                 var doc = menuObj.m_Popup.document;
                 var tbl = doc.createElement('TABLE');
                tbl.border = 0;
                tbl.cellpadding = 0;
                tbl.cellspacing = 0;
                tbl.style.textOverflow = 'ellipsis';
                tbl.style.tableLayout = 'fixed';
                tbl.style.color = Menu.Attributes.NormalMenuForeColor;
                 var tbody = doc.createElement('TBODY');
                tbl.appendChild(tbody);
                 var tr = doc.createElement('TR');
                tbody.appendChild(tr);
                 var td = doc.createElement('TD');
                tr.appendChild(td);
                td.innerHTML = span.innerHTML;
                menuHtml.rows(i).cells(2).innerHTML = '';
                menuHtml.rows(i).cells(2).appendChild(tbl);
                tbl.style.lineHeight = '85%';
                td.style.width = '100%';
                td.style.overflow = 'hidden';
                td.style.whiteSpace = 'nowrap';
                td.style.textOverflow = 'ellipsis';
                tbl.title = td.innerText;
            }
        }
        menuHtml.style.width = Menu.Attributes.MaxMenuItemTextWidth;
    }
     return menuHtml.offsetWidth;
};
  #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属性也可以。 
   

    菜单中文字被截断的效果

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

    子菜单弹出时如果其右边的屏幕空间不够菜单的宽度,菜单将从父级菜单的左边弹出,使用下面的代码实现:
 subpop.show(0, 0, 1, 1);
  var menuHtml = subpop.document.getElementById('menu');
  var x, y, w, h;
 x = miHtml.offsetWidth-2;
 y = 0;
 w = menuHtml.offsetWidth;
 w =  this.__isEllipsis(subMenuObj, menuHtml);
 h = menuHtml.offsetHeight;

  var availableScreenWidth = window.screen.width;
  var factWidth = popup.document.parentWindow.screenLeft + menuObj.m_Bounds.width + w;
  if ( factWidth > availableScreenWidth )
 {
     x = - w + 2;
 }    
 subpop.show(x, y, w, h, miHtml);
 subMenuObj.FadeinEffect(Menu.Attributes.ShowMenuEffect);
    前面说到到的FadeinEffect和__isEllipsis两个方法分别是在上面的位置被调用的。 

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


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

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