`

支持导航滚动的Extjs实现

 
阅读更多

导航滚动组件的形式参考百度百科:

http://baike.baidu.com/subview/837441/10940762.htm



 

它由导航条和可滚动内容两者构成。

它具有以下3个特点:

1. 导航条本身是位置固定(Dock)或浮动的;

2. 点击导航条button,内容区会滚动到相应位置;

3. 在内容区滚动,导航条会自动active当前位置对应的button;

 

此形式的JQuery实现有很多,比如这个Scrollit.js

http://www.bytemuse.com/scrollIt.js/

 

相比较常见的标签页(tab)形式,两者都能快速地定位内容,导航滚动具备的最大优势是:

它可以更好地适应不同的屏幕分辨率,更高的屏幕高度,每屏可浏览更多内容。

 

ExtJS官方本身没有提供这种内容组织形式,但是在ExtJS提供的丰富的基础组件和开放的扩展机制上,实现这种形式并不难。我的实现思路如下:

1. 采用tabbar作为导航条;

2.调用函数scrollIntoView实现点击按钮,滚动到指定位置;

3.响应内容区的scroll事件,active对应的导航按钮;

 

实现效果如下:


点击按钮“Panel2”滚动



 

鼠标滚动内容区,滚动到显示Panel3的位置,导航按钮自动active“Panel3”


代码如下:

/**
 * Demonstrates usage of navbar.
 */
Ext.define('DCApp.view.navpanel', {
    extend: 'Ext.panel.Panel',
    xtype: 'navpanel',
    layout: {
        type: 'fit',
        pack: 'start',
        align: 'stretch'
    },
    
    bodyPadding: 10,
 	width: 500,
    height: 400,

    items: [
        {
            id:'panel0',
        	listeners: {
    		  render: function(p){
    			p = p.getEl();
    			var me= this.up();
    			me.h0=p.getHeight();
    		    p.on('scroll', function(e, t){
    		    	//console.log(t.scrollTop +"   "+ t.clientHeight);
    		    	me.onscroll(t.scrollTop,t.clientHeight);
    		    }, p);
    		  }
    		},
        	title: 'Panel 0',
            flex: 2,
            frame: true,
            xtype: 'container',
            layout: 'anchor',
            style: {
                overflow: 'auto'
            },
            defaults: {
                frame: true,
                bodyPadding: 10
            },
            items: [
                    {
                        title: 'Panel 1',
                        flex: 1,
                        margin: '0 0 10 0',
                        cls:'nav_pos',
                        height:300,
                        html: 'height: 300'
                    },
                    {
                        title: 'Panel 2',
                        height: 100,
                        margin: '0 0 10 0',
                        cls:'nav_pos',
                        height:400,
                        html: 'height: 400'
                    },
                    {
                        title: 'Panel 3',
                        flex: 2,
                        cls:'nav_pos',
                        height:500,
                        html: 'height: 500'
                    }
                ]
            }
    ],
    onscroll:function(top,h0){
    	var items_navpos=this.items_navpos;
    	var offset=0;
    	//var h0 = this.h0;
    	for(var i=0; i<items_navpos.length; i++){
    		var item_navpos=items_navpos[i];
    		var h = item_navpos.getHeight();
    		//header落在移动窗口之内,或移动窗口在 两个offset之间都算
    		if((offset>=top && (offset<= (top+h0)))
    				|| (top>=offset && (top+h0) <= offset+h ))
    			break;
    		offset+=h;    		
    	}
    	this.nav(this.btns_dock.getAt(i));
    },
    nav:function(item,e){
    	if(this.item_last){
    		if(this.item_last==item)
    			return false;
    		this.item_last.removeCls('x-tab-active');
    	}
    	var pnav = item.pnav;
    	if(e){
        	pnav.getEl().scrollIntoView(pnav.up().getEl(),false,true);     
    	}else{
    		item.addCls('x-tab-active');
    	}
    	this.item_last=item;
    },
    afterRender: function(ct, position) {
    	var items_dock=[];
    	var items_navpos=this.query('[cls=nav_pos]');
    	var me = this;
    	for(var i=0; i<items_navpos.length; i++){
    		var item_navpos=items_navpos[i];
    		var item_dock = {
    			closable:false,
    			text:item_navpos.title,
    			pnav:item_navpos,
    			handler:me.nav,
    			scope: me
    		};
    		items_dock[items_dock.length]=item_dock;
    	}
    	this.items_navpos=items_navpos;
    	this.btns_dock = this.addDocked([{
	        xtype: 'tabbar',
	        dock: 'top',
	        id:'tbar0',
	        activeItem:1,
	        items: items_dock
	    }])[0].items;
    	this.nav(this.btns_dock.getAt(0));
    	this.callParent();
    },
    initComponent: function(){
    	this.callParent();
    }
});

Ext.application({
    name : 'Fiddle',

    launch : function() {
        //Ext.Msg.alert('Fiddle', 'Welcome to Sencha Fiddle!');
        Ext.create('widget.navpanel', {renderTo:Ext.getBody()});
    }
});

 
 在线Demo

https://fiddle.sencha.com/#fiddle/kfr
 

 

 

 

  • 大小: 226 KB
  • 大小: 18.2 KB
  • 大小: 17.2 KB
  • 大小: 17.6 KB
0
0
分享到:
评论

相关推荐

    extjs上方动态导航栏

    本篇文章将深入探讨如何在ExtJS中创建并实现上方动态导航栏。 1. **创建基础结构** 在ExtJS中,导航栏通常使用`Ext.toolbar.Toolbar`组件来创建。首先,我们需要定义一个Toolbar实例,包含必要的配置项,如宽度、...

    ExtJS笔记---Grid实现后台分页

    这篇“ExtJS笔记——Grid实现后台分页”探讨了如何在ExtJS的Grid组件中实现高效的后台分页功能。 后台分页是一种常见的数据处理策略,特别是在大数据量的情况下,它将数据分批加载,避免一次性加载所有记录导致的...

    extjs 树型分页组件

    EXTJS的`TreeStore`会自动处理这些信息,以便正确地显示和导航页面。 4. 扩展树节点 当用户点击或展开树节点时,EXTJS会发送请求到服务器获取该节点的子节点。你需要在服务器端处理这个请求,根据父节点ID和分页...

    extjs4中panel的accordion布局以及treepanel导航

    2. 动态加载:TreePanel支持异步加载,即在用户滚动或展开节点时动态获取子节点数据,这有助于减少页面初始化时的数据量。 3. 节点操作:可以添加、删除、移动和编辑TreePanel中的节点,实现丰富的交互功能。 4. ...

    Highstock与ExtJs结合使用

    它提供了各种图表类型,如折线图、柱状图、面积图等,支持实时更新和滚动,使用户能够清晰地查看和理解大量历史数据。Highstock的特性包括数据缩放、导航条、工具提示以及多种自定义选项,使得数据可视化变得极其...

    extjs_ux_LockingGridPanel-update6

    总的来说,ExtJS的LockingGridPanel插件为开发者提供了一种有效的方式,使用户能够在大型数据表中轻松导航,保持关键列的可视性,提高应用的可用性和用户体验。通过理解和应用上述知识点,我们可以构建出更高效、...

    Extjs4 图片浏览器

    7. **Events(事件)**:通过监听用户的交互行为,如点击按钮、滚动等,来触发相应的处理函数,实现图片的切换和其他动态效果。 8. **Ajax请求**:如果图片存储在远程服务器,可能需要使用Ajax技术异步加载图片数据...

    ExtJs Tree

    通过ExtJs Tree,用户可以直观地展示数据之间的层级关系,并支持多种交互操作,如展开、折叠节点等。 ### 特性与功能 #### 树形面板(Treepanel) - **自动滚动**:通过`autoScroll`属性设置为`true`,确保当内容...

    Extjs tree and Grid(Buffer Grid,Progress Grid)

    它支持节点的添加、删除、展开和折叠操作,可以进行拖放操作,并且可以与其他ExtJS组件如Grid进行联动。 - 树形控件可以用于文件系统导航、组织架构展示或者任何需要层次结构表示的数据场景。 - 在ExtJS中,树形...

    Extjs之--图片浏览器

    5. **其他功能**:“up.gif”、“down.gif”可能表示上下滚动,可能在图片列表或缩略图导航中使用。"zoom.gif"可能是缩放图标,用于点击后进入或退出全屏模式或者调整图片大小。 6. **图片资源**:“girl.jpg”是...

    extjs做的动态树

    9. **性能优化**:EXTJS提供了缓存机制和虚拟滚动等特性,以优化大量数据的显示和处理,确保应用的流畅性。 通过学习和实践这个“动态树”示例,开发者可以深入了解EXTJS的树形控件及其动态操作,从而在自己的项目...

    extjs表格Grid比较全面的功能

    ExtJS Grid提供了虚拟滚动、延迟渲染等技术,确保在处理大量数据时仍保持流畅的用户体验。 14. **自定义行为(Custom Behaviors)** 开发者可以使用事件监听和插件机制,为Grid添加自定义行为,如右键菜单、双击...

    ExtJs 中文文档

    - **配置选项**:许多 ExtJS 组件都支持通过配置选项进行个性化设置,这些选项可以控制组件的行为和外观。 - **Ext.apply() 和 Ext.applyIf()**:这两个函数用于合并对象。`Ext.apply()` 会覆盖目标对象的属性,而 `...

    struts2+ExtJS(带分页效果)

    当用户滚动页面或者点击分页导航按钮时,Store会发送包含分页信息的请求到服务器,Struts2 Action根据这些参数查询数据库并返回对应页的数据。GridPanel接收到新数据后,自动更新显示内容,实现平滑的分页体验。 **...

    extjs开发tree效果

    在ExtJS中,TreePanel是实现树结构的主要组件,它可以用来展示层次化的数据,常用于构建导航菜单、文件系统或者组织结构图。 在ExtJS开发树效果时,我们首先要理解TreePanel的基本概念。TreePanel是一个可滚动的...

    Extjs-多功能下拉树列表

    4. **键盘导航**:支持使用键盘上的上下左右箭头键、回车键、ESC键以及TAB键来进行导航和操作,极大提升了可访问性。 5. **智能过滤**:用户可以通过输入汉字或拼音首字母来快速过滤树中的结点,实现高效的查找功能...

    columntree

    在IT行业中,Columntree是一种特殊的表格展示方式,它结合了树形结构和表格的特点,...通过分析"CColumnTreeCtrlDemo_src"中的代码,你可以更直观地了解EXTJS实现Columntree的具体方法,从而更好地应用到自己的项目中。

    extjs控件列表

    - **用途**: 组织和布局页面元素,如导航菜单、侧边栏等。 **Ext.Panel** - **描述**: 面板组件,具有标题、工具栏、布局等功能。 - **用途**: 创建包含标题、工具栏和内容区域的可折叠面板。 **Ext.TabPanel** - ...

Global site tag (gtag.js) - Google Analytics