/*
    *返回元素e的第n层祖先算元素,如果不存在此类祖先或祖先不是Element,
    *(例如Document或者DocumentFragment)则返回null
    *如果n为0,则返回本身。如果n为1(或省略),则返回其父元素
    *如果n为2,则返回其祖父元素,依次类推
        
*/

function parent(e, n) {
    if (n === undefined) {
        n = 1;
    }
    while (n-- && e) {
        e = e.parentNode;
    }
    if (!e || e.nodeType !== 1) {
        return null;
    }
}

/*
 *返回元素e的第n个兄弟元素
 *如果n为正,返回后续的第n个兄弟元素
 *如果n为负,返回前面的第n个兄弟元素
 *如果n为零,返回e本身
 */
function sibling(e, n) {
    while (e && n !== 0) { //如果e未定义,即刻返回它。
        if (n > 0) {
            if (e.nextElementSibling) {
                e = e.nextElementSibling;
            } else {
                for (e = e.nextSibling; e.nodeType !== 1; e = e.nextSibling)
                // 空循环
            }
            n--;
        } else { //查找前面的兄弟节点
            if (e.previousElementSibling) {e=e.previousElementSibling;}
            else{
                for(e.previousSibling;e&&.nodeType!==1;e=e.previousSibling)
                    // 空循环
            }
            n++;
        }
    }
    return e;
}

/*
*返回元素e的第n代子元素,如果不存在则为null
*负值n代表从后往前计数,0代表第一子元素,而-1代表最后一个,-2代表倒数第二个,依次类推
*/

function child(e,n){
    if (e.children) {//如果children数组存在
        if (n<0) {n+=e.children.length;}//转换负的n为数组索引
        if (n<0) {return null;}//如果仍然为负,说明没有子元素
        return e.children[n];//返回指定的子元素
    }

    //如果e没有children数组,找到第一个子元素并向前数,或者找到最好一个子元素并往回数
    if (n>=0) {//n非负数:从第一个子元素向前数
        if (e.firstElementChild) {e=e.firstElementChild;}
        else{
            for(e=e.firstChild;e&&e.nodeType!==1;e=e.nextSibling)
            {
                //空循环
            }
            return sibling(e,n);//返回第一个子元素的第n个兄弟元素
        }
    }else{//n为负:从最后一个子元素往回数
        if (e.lastElementChild){e=e.lastElementChild;}
        else (e=e.lastChild;e&&e.nodeType!==1;e=e.previousSibling){
            //空循环
        }
    }
    return sibling(e,n+1);//+1来转化最后一个子元素为最后1个兄弟元素

}