2012-07-14 85 views
1

好吧,這將很難解釋。我有一個包含兩個可摺疊菜單的頁面。其中一個絕對位於左上方。當我將它摺疊時,其餘的內容都像預期的那樣被擠壓到左上角。保持絕對定位,從頁面滾動到右下方的可摺疊div

其他菜單絕對位於右下方。展開後(加載頁面時的默認狀態),它位於右下角,距離底部和右側5個像素,如預期的那樣。但是,當我摺疊它時,突然間剩下的內容從底部和右側5個像素開始,然後從頁面向右和向下流動,擴展頁面並導致滾動條。

希望的行爲是將剩餘內容壓扁到頁面的右下角,而不更改頁面尺寸。

發佈我的代碼會很棘手,因爲它很多是通過JavaScript動態生成的。

每個菜單由一個容器div內的兩個子div組成。容器div完全定位(左上或右下,取決於哪個菜單)。第一個子div是活動菜單選項卡的內容,向左浮動並具有足夠高的邊距以將其放在菜單選項卡下。第二個子div是菜單選項卡。這個div絕對定位(以便讓內容div在它後面流動)。選項卡div內的每個選項卡都向左浮動,因此可以動態添加更多選項卡。

其中一個標籤總是「隱藏/顯示」選項卡,基本上只是切換顯示:隱藏在菜單的內容div上。

所以,據我瞭解,浮動的內容div保持菜單不流出頁面,當它「摺疊」(即隱藏)時,沒有任何東西可以使絕對定位的標籤div不會流出頁面。

我想我會嘗試將有問題的div和css代碼翻錄到它自己的頁面中,以便我可以隔離行爲併發布一些連貫的代碼。同時,任何建議都非常受歡迎。

謝謝! == Matt

P.S.通常我會將菜單中的所有內容都放在相對位置。我在絕對定位div上浮動內容div的原因是,我可以控制活動選項卡的底部是否與內容div「連接」。如果我有兩個相對的div,並且只有tab 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

UPDATE:我儘可能地從我的JavaScript中刪除了菜單代碼。這是一個帶有工作代碼的JSFiddle。出於某種原因,onclick事件在JSFiddle中不起作用,但它與我的測試頁完全相同,所以如果您無法在JSFiddle中使用它,請嘗試this link以查看行爲。僅供參考,JavaScript通常不依賴於巨大的if-else語句,我只是這樣做,所以我不必發佈所有的動態菜單生成代碼。

P.P.S.我基本上只在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; 
} 
+0

請問您可以在底部發布div的html和css ...我可以在jsfiddle中使用它並嘗試探索它。 – AdityaSaxena 2012-07-14 07:05:46

+0

由於您尚未添加任何代碼,因此無論如何我都必須拍攝。 我認爲當你摺疊底部div時,這是正確的,這個div的底部邊緣不是你認爲它們的地方。因此,定位越來越混亂。你可能想檢查一下。 – AdityaSaxena 2012-07-14 07:31:43

+0

我使用JSFiddle更新了OP,並鏈接到了我的工作代碼。 – mmseng 2012-07-14 08:43:00

回答

4

請嘗試以下方法:http://jsfiddle.net/bQ6vZ/1/

這是表現你想要的?

添加以下CSS規則:

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

而且添加了兩行的JS,即下方觀察hide('menuInfoWrapper');show('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'); 
    } 

希望這有助於。

+0

謝謝。我明天會試一試。我主要關心的是,這是否也適用於頂級股利。由於菜單是動態生成的,我試圖儘量避免使用id選擇器。我還沒有在我的實際代碼中實現它,但我想最終將任何和所有單個菜單特定的CSS定義放入JavaScript中。例如infoMenu =新菜單('Info','右下');並從中動態構建CSS。 但我會看到我用你給出的東西來想出。謝謝。 – mmseng 2012-07-14 09:54:33

+0

對不起,我還沒有時間繼續這個項目呢。我保證我會在我回來的時候回來! – mmseng 2012-07-22 20:23:41

+0

@mmseng - 3年後,仍然在等待項目繼續並獲得公認的答案。 :D – Roberto 2017-02-25 00:07:52