官方首页 | 无图版 | BBS首页
PJBlog3 2.8.5.157 新版发布 下载|升级(2008.8.26) 来给PJ3提提发展建议 2008版 PJHOME 珍藏/纪念版官方T恤 正式发布! PJ3内测团队主创人员身份,性格,特点吐血大曝光
PJBlog技术支持论坛使用问题总索引 PJ-Blog 3 斑竹日志 【独家】我使用过的三种空间,与客服的精彩故事 Z-Blog,Wordpress,Bo-Blog转换到PJBlog
 31 1234
发新话题
打印

为侧边栏添加面板开关功能(增加动态效果)

本主题由 thomas 于 2007-2-12 10:18 解除高亮

为侧边栏添加面板开关功能(增加动态效果)

本来想把这个添加侧边栏面板开关功能做到皮肤的CSS文件里面的,无奈FF和IE6对expression支持不好(IE6甚至会死掉)。于是最终决定把这个功能做到JS里面,所有的浏览器都可以用。

当然这只是一个小小的功能,有什么不足的还望大家批评指出

原理:给每一个sidepanel添加一个onclick处理函数。
效果如图:

具体修改如下(在IE 6、IE 7、FF 2、Opera中均测试通过):
common\common.js
修改函数initJS:
复制内容到剪贴板
代码:
//初始化JS代码
function initJS(){
        ReImgSize() //自动缩放代码
        initAccessKey()  //转换AccessKey For IE
        addPanelOnClick(); // 添加面板标题鼠标点击处理函数
}
在后面添加两个函数:
复制内容到剪贴板
代码:
// 添加面板标题鼠标点击处理函数
function addPanelOnClick(){
        var sideBar, panel;
        sideBar = document.getElementById("innersidebar");
        if (isIE()){// 是IE
                for(i = 1; i<sideBar.childNodes.length - 1; i++){
                        panel = sideBar.childNodes[i];
                        panel.childNodes[0].onclick = panelOnOff;
                }
        }
        else{// 不是IE,是Netscape, FireFox, Opera
                for(i = 3; i<sideBar.childNodes.length - 3; i++){
                        panel = sideBar.childNodes[i];
                        panel.childNodes[0].onclick = panelOnOff;
                }
        }
}

// 面板开关函数
function panelOnOff(){
        var node;
        node = this.parentNode.childNodes[1];
        node.style.display = (node.style.display == "") ? "none" : "";
}
==================== 华丽的分割线 ====================
看到有朋友发了一个示例代码,受到启发又修改了,增加动态效果
还是修改common\common.js,将上面新增的函数替换下面的代码~
复制内容到剪贴板
代码:
// 面板高度数组
var maxHeight;

// 获得面板索引
function getPanelIndex(obj){
        var sideBar, panel, start;
        sideBar = document.getElementById("innersidebar");
        start = isIE() ? 1 : 3;
        for(i = start; i < sideBar.childNodes.length - start; i++){
                panel = sideBar.childNodes[i];
                if (obj == panel.childNodes[1]){
                        return i - start;
                }
        }
        return -1;
}

// 面板开关动态效果
function panleOpenClose(obj, action){
        var index, curHeight, delat;
        var funcOpen, funcClose, intervalID;
        index = getPanelIndex(obj);
        delta = 1;
        if (action == "Open"){
                curHeight = 0;
                obj.style.display = "";
                funcOpen = function(){
                        delta *= 2.5;
                        curHeight += delta;                       
                        if (curHeight > maxHeight[index]){
                                obj.style.height = maxHeight[index] + "px";                               
                                clearInterval(intervalID);
                        }else{
                                obj.style.height = curHeight + "px";
                        }
                }
                intervalID = setInterval(funcOpen, 10);
        }
        if (action == "Close"){
                curHeight = maxHeight[index];
                obj.style.overflow = "hidden";
                funcClose = function(){
                        delta *= 2.5;
                        curHeight -= delta;
                        if (curHeight < 10){
                                obj.style.height = "0px";
                                obj.style.display = "none";
                                clearInterval(intervalID);
                        }else{
                                obj.style.height = curHeight + "px";
                        }
                }               
                intervalID = setInterval(funcClose, 10);
        }
}

// 面板开关函数
function panelOnClick(){
        var node, index;
        node = this.parentNode.childNodes[1];
        index = getPanelIndex(node);
        if (index == -1){
                return;
        }
        if (node.style.display == ""){
                panleOpenClose(node, "Close");
        }else{
                panleOpenClose(node, "Open");
        }
}

// 添加面板标题鼠标点击处理函数
function addPanelOnClick(){
        var sideBar, panel, start, tmpPT, tmpPB;
        sideBar = document.getElementById("innersidebar");
        start = isIE() ? 1 : 3;
        maxHeight = new Array(sideBar.childNodes.length - 2 * start);
        for(i = start; i<sideBar.childNodes.length - start; i++){
                panel = sideBar.childNodes[i];
                panel.childNodes[0].onclick = panelOnClick;
                panel.childNodes[0].title = "点击我试试看";        // 标题栏提示框,大家自己发挥创意改
                tmpPT = panel.childNodes[1].style.paddingTop;
                tmpPB = panel.childNodes[1].style.paddingBottom
                panel.childNodes[1].style.paddingTop = "0px";
                panel.childNodes[1].style.paddingBottom = "0px";
                maxHeight[i - start] = panel.childNodes[1].offsetHeight;
                panel.childNodes[1].style.paddingTop = tmpPT;
                panel.childNodes[1].style.paddingBottom = tmpPB;
        }
}
方便各位朋友,这里是修改过后的common.js文件:

不过唯一的不足在于,需要等页面完全载入以后功能才能开启。
演示地址:http://www.eternity3.com.cn/blog/

[ 本帖最后由 yzk0370 于 2007-2-11 01 编辑 ]
附件: 您所在的用户组无法下载或查看附件
本帖最近评分记录
  • 52077 PJ币 +30 好帖!希望再接再厉!! 2007-2-9 14:16

TOP

支持一下
我的博客小站Tom's Blog

TOP

一起来就看到好东西
www.oin8.com
我的博客----O时尚吧
欢迎来访

TOP

頂了
好像之有PJ沒有這個東西吧

TOP

不错,很喜欢!!!!!!!!

[ 本帖最后由 风影 于 2007-2-9 14:30 编辑 ]

TOP

终于见到啦!!等了好久了....

TOP

是不是默认全部关闭 然后打开一个就自动关闭另一个哇

TOP

最新更新,增加动态效果~大家看看吧~

TOP

这种效果不错!!!!

TOP

牛B啊!

TOP

 31 1234
发新话题