1

好吧,这将很难解释。我有一个带有两个可折叠菜单的页面。一个绝对位于左上角。当我折叠它时,剩余的内容都像预期的那样被挤压到左上角。

另一个菜单绝对位于右下角。当它展开时(加载页面时的默认状态),它位于右下角,距离右下角 5 个像素,正如预期的那样。但是,当我折叠它时,突然间剩余的内容从距底部和右侧 5 个像素处开始,然后从页面右侧和下方流出,扩展页面并导致滚动条。

期望的行为是将剩余内容压缩到页面的右下角,而不更改页面尺寸。

发布我的代码会很棘手,因为其中很多都是通过 JavaScript 动态生成的。

每个菜单由容器 div 内的两个子 div 组成。容器 div 绝对定位(左上角或右下角,取决于哪个菜单)。第一个子 div 是活动菜单选项卡的内容,向左浮动,顶部边距刚好足以将其放在菜单选项卡下。第二个子 div 是菜单选项卡。这个 div 是绝对定位的(以便让内容 div 在它后面流动)。选项卡 div 中的每个选项卡都向左浮动,因此我可以更动态地添加。

其中一个选项卡始终是“隐藏/显示”选项卡,基本上只是在菜单的内容 div 上切换显示:隐藏。

因此,据我了解,浮动内容 div 以某种方式阻止菜单从页面流出,并且当它“折叠”(即隐藏)时,没有什么可以阻止绝对定位的选项卡 div 从页面流出。

我想我会尝试将有问题的 div 和 css 代码撕掉到它自己的页面中,这样我就可以隔离行为,并发布一些连贯的代码。与此同时,任何建议都非常受欢迎。

谢谢!== 马特

PS 通常我会把菜单中的所有东西都放在相对位置。我在浮动内容 div 顶部使用绝对定位的 div 的原因是,我可以控制活动选项卡的底部是否看起来“连接”到内容 div。如果我有两个相对的 div 并且只是将选项卡 div 放在内容 div 的顶部,我无法在正确的位置删除内容 div 的黑色顶部边框,使其看起来像活动选项卡连接到它。如果有人可以想办法解决这个问题,同时仍然保持两个 div 的相对性,我也会为此感到沮丧。

我没有代表发布图片,所以这里有一些链接:

这是菜单扩展后的样子:http: //theroach.net/igp_menutest/css_menus1.png

他们在这里被折叠: http ://theroach.net/igp_menutest/css_menus2.png

这就是我想要的: http ://theroach.net/igp_menutest/css_menus3.png

更新:我已经尽可能地从我的 JavaScript 中删除了菜单代码。这是一个带有工作代码的JSFiddle 。出于某种原因,onclick 事件在 JSFiddle 中不起作用,但它与我的测试页面中的代码完全相同,因此如果您无法使其在 JSFiddle 中起作用,请尝试此链接以查看行为。仅供参考,javascript 通常不依赖于巨大的 if-else 语句,我只是这样做了,所以我不必发布所有动态菜单生成代码。

PPS 我基本上只在 Chrome v20 中对此进行了测试,尽管我刚刚测试了 Firefox v13 和 IE9 并得到了相同的行为。我不太关心跨浏览器支持。此页面仅适用于使用最新最好的浏览器的人。

UPDATE2:更新的链接。添加了 jsfiddle 代码的相关部分以满足新的问题代码要求:

JS

function tab(id) {
        if(id == 'menuCtrlTab1') {
            toggle('menuCtrlTab1');
            toggle('menuCtrlTab2');
            hide('menuCtrlForm2');
            show('menuCtrlForm1');
        }
        else if(id == 'menuCtrlTab2') {
            toggle('menuCtrlTab1');
            toggle('menuCtrlTab2');
            hide('menuCtrlForm1');
            show('menuCtrlForm2');
        }
        else if(id == 'menuCtrlTabHide') {
            hide('menuCtrlTab1');
            hide('menuCtrlTab2');
            hide('menuCtrlFormDiv');
            hide('menuCtrlTabHide');
            show('menuCtrlTabShow');
        }
        else if(id == 'menuCtrlTabShow') {
            show('menuCtrlTab1');
            show('menuCtrlTab2');
            show('menuCtrlFormDiv');
            hide('menuCtrlTabShow');
            show('menuCtrlTabHide');
        }

        else if(id == 'menuInfoTab1') {
            toggle('menuInfoTab1');
            toggle('menuInfoTab2');
            hide('menuInfoForm2');
            show('menuInfoForm1');
        }
        else if(id == 'menuInfoTab2') {
            toggle('menuInfoTab1');
            toggle('menuInfoTab2');
            hide('menuInfoForm1');
            show('menuInfoForm2');
        }
        else if(id == 'menuInfoTabHide') {
            hide('menuInfoTab1');
            hide('menuInfoTab2');
            hide('menuInfoFormDiv');
            hide('menuInfoTabHide');
            show('menuInfoTabShow');
        }
        else if(id == 'menuInfoTabShow') {
            show('menuInfoTab1');
            show('menuInfoTab2');
            show('menuInfoFormDiv');
            hide('menuInfoTabShow');
            show('menuInfoTabHide');
        }
        else {

        }
}

function toggle(id) {
    if(activated(id)) {
        deactivate(id);
    }
    else {
        activate(id);
    }
}

function hide(id) {
    docAddClass(id, 'hidden');
}
function show(id) {
    docRemoveClass(id, 'hidden');
}

function activate(id) {
    docRemoveClass(id, 'inActive');
    docAddClass(id, 'active');
}
function deactivate(id) {
    docRemoveClass(id, 'active');
    docAddClass(id, 'inActive');
}

function activated(id) {
    var e = docGet(id);
    if(e.className.search('active') == -1) {
        return false;
    }
    return true;
}



function docGet(id) {
    return document.getElementById(id);
}
function docAddClass(id, classToAdd) {
    var e = docGet(id);
    if(e.className.length <= 0) {
        e.className = classToAdd;
    }
    else {
        if(e.className.search(classToAdd) == -1) {
            e.className = e.className + ' ' + classToAdd;
        }
    }
}

function docRemoveClass(id, classToRem) {
    var e = docGet(id);
    if(e.className.length > 0) {
        if(e.className.search(classToRem) != -1) {
            e.className = e.className.replace(classToRem, "");
        }
    }
}

HTML

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta name='Author' content='Matt Seng' />
        <meta name="Description" content="IGP" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <link rel="stylesheet" type="text/css" href="./style.css" media="screen" />
    </head>

    <body>

        <div id="menuDiv">
            <div id="menuCtrl">
                <div id="menuCtrlWrapper" class="menuWrapper">
                    <div id='menuCtrlFormDiv'>
                        <div id="menuCtrlForm1" class="menuForm">
                            Tab 1 contents<br>
                            Lorem ipsum dolor sit amet, consectetur<br>
                            adipiscing elit. Duis est orci, malesuada<br>
                            vitae pulvinar nec, varius id felis. Vivamus<br>
                            et accumsan dui. Donec a nisl id dui gravida<br>
                            porttitor. Integer sed turpis arcu. Curabitur<br>
                            nec dolor urna, ac molestie neque. Nunc ac<br>
                            augue non mi imperdiet semper.
                        </div>
                        <div id="menuCtrlForm2" class="menuForm hidden">
                            Tab 2 contents<br>
                            Lorem ipsum dolor sit amet, consectetur<br>
                            adipiscing elit. Duis est orci, malesuada<br>
                            vitae pulvinar nec, varius id felis. Vivamus<br>
                            et accumsan dui. Donec a nisl id dui gravida<br>
                            porttitor. Integer sed turpis arcu. Curabitur<br>
                            nec dolor urna, ac molestie neque. Nunc ac<br>
                            augue non mi imperdiet semper.
                        </div>
                    </div>
                    <div id="menuCtrlTabs" class="menuTabs">
                        <div id="menuCtrlTabShow" class="clickable tab showHide inActive hidden" onclick="tab(this.id);">
                            Show
                        </div>
                        <div id="menuCtrlTabHide" class="clickable tab showHide inActive" onclick="tab(this.id);">
                            Hide
                        </div>
                        <div id="menuCtrlTab1" class="clickable tab secondary  active" onclick="tab(this.id);">
                            1
                        </div>
                        <div id="menuCtrlTab2" class="clickable tab secondary inActive" onclick="tab(this.id);">
                            2
                        </div>
                    </div>
                </div>
            </div>
            <div id="menuInfo">
                <div id="menuInfoWrapper" class="menuWrapper">
                    <div id='menuInfoFormDiv'>
                        <div id="menuInfoForm1" class="menuForm">
                            Tab 1 contents<br>
                            Lorem ipsum dolor sit amet, consectetur<br>
                            adipiscing elit. Duis est orci, malesuada<br>
                            vitae pulvinar nec, varius id felis. Vivamus<br>
                            et accumsan dui. Donec a nisl id dui gravida<br>
                            porttitor. Integer sed turpis arcu. Curabitur<br>
                            nec dolor urna, ac molestie neque. Nunc ac<br>
                            augue non mi imperdiet semper.
                        </div>
                        <div id="menuInfoForm2" class="menuForm hidden">
                            Tab 2 contents<br>
                            Lorem ipsum dolor sit amet, consectetur<br>
                            adipiscing elit. Duis est orci, malesuada<br>
                            vitae pulvinar nec, varius id felis. Vivamus<br>
                            et accumsan dui. Donec a nisl id dui gravida<br>
                            porttitor. Integer sed turpis arcu. Curabitur<br>
                            nec dolor urna, ac molestie neque. Nunc ac<br>
                            augue non mi imperdiet semper.
                        </div>
                    </div>
                    <div id="menuInfoTabs" class="menuTabs">

                        <div id="menuInfoTabShow" class="clickable tab showHide inActive hidden" onclick="tab(this.id);">
                            Show
                        </div>
                        <div id="menuInfoTabHide" class="clickable tab showHide inActive" onclick="tab(this.id);">
                            Hide
                        </div>
                        <div id="menuInfoTab1" class="clickable tab secondary  active" onclick="tab(this.id);">
                            1
                        </div>
                        <div id="menuInfoTab2" class="clickable tab secondary inActive" onclick="tab(this.id);">
                            2
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script type='text/javascript' src='./script.js'></script>
    </body>
</html>

CSS

/* removes the top and left whitespace */
* { margin:0; padding:0; }

/* ensure full screen */
html, body {
    width:100%;
    height:100%;
    font-family: "Courier New", Courier, monospace;
    font-size: 95%;
}

/* remove the scrollbars */
canvas {
    display:block;
}

#menuCtrl {
    position: absolute;
    margin: 5px;
}

#menuInfo {
    position: absolute;
    bottom: 0;
    right: 0;
    margin: 5px;
}

.menuWrapper {
}

.menuForm {
    float: left;
    margin-top: 22px;
    padding: 5px;
    background-color: white;
    border: 2px solid black;
    border-radius: 10px;
    border-top-left-radius: 0;
    box-shadow: 3px 3px 5px #333;
}

.menuForm table {
    padding-top: 3px;
}
.menuForm td, th {
    white-space: nowrap;
}
.menuForm th {
    text-align: left;
}

.menuTabs {
    position: absolute;
    white-space: nowrap;
    top: 0;
}

.menuTabs div.tab {
    float: left;
    height: 20px;
    min-width: 20px;
    margin: 0;
    padding: 0 5px 0 5px;
    text-align: center;
    background-color: white;
    border: 2px solid black;
    border-top-left-radius: 5px;
    border-top-right-radius: 5px;
}
.menuTabs div.secondary {
    border-left: 0px;
}
.menuTabs div.active {
    opacity: 1;
    border-bottom: 2px solid white;
}
.menuTabs div.active.showHide {
    border-bottom: 2px solid black;
}
.menuTabs div.inActive {
    opacity: .75;
    border-bottom: 2px solid black;
}

.clickable {
    cursor: pointer;
}
.visible {
    text-decoration: underline;
    text-decoration-color: black;
}
.invisible {
    text-decoration: line-through;
    text-decoration-color: red;
}
.hidden {
    display: none;
}
4

1 回答 1

5

请尝试以下方法:http: //jsfiddle.net/bQ6vZ/1/

那是你想要的表现吗?

我添加了以下 CSS 规则:

#menuInfoWrapper.hidden {
    display: block;
}
#menuInfoWrapper.hidden #menuInfoTabs {
    top: auto;
    bottom: 0;
    right: 0;
}

并在 JS 中添加了两行,即下图的hide('menuInfoWrapper');andshow('menuInfoWrapper');行:

    else if(id == 'menuInfoTabHide') {
        hide('menuInfoTab1');
        hide('menuInfoTab2');
        hide('menuInfoFormDiv');
        hide('menuInfoFormWrapper');
        hide('menuInfoTabHide');
        show('menuInfoTabShow');
    }
    else if(id == 'menuInfoTabShow') {
        show('menuInfoTab1');
        show('menuInfoTab2');
        show('menuInfoFormDiv');
        show('menuInfoWrapper');
        hide('menuInfoTabShow');
        show('menuInfoTabHide');
    }

希望这可以帮助。

于 2012-07-14T09:37:37.197 回答