2010-05-21 4 views
7

Ich fange an zu denken, dass das unmöglich ist, aber ich dachte, dass ich euch fragen würde.Das unmögliche Layout?

Im Grunde ist es ein 2-Spalten-Layout, aber das „Geschäft“ will der folgende:

-Immer das gesamte Browserfenster

-Accommodate Redimensionierung des Browserfensters

-Links Spalte aufnehmen feste Breite sein, aber diese Breite sollte von Seite zu Seite flexibel sein.

-Lefte Spalte hat einen Bereich oben mit fester Höhe.

-Lefte Spalte hat einen unteren Bereich. Es sollte den verbleibenden vertikalen Platz des Browserfensters einnehmen. Wenn der Inhalt sehr groß ist, wird nur für diese Region eine Bildlaufleiste angezeigt.

-Rechtsspalte sollte den verbleibenden horizontalen Platz des Browserfensters einnehmen.

-Rechtssäule hat oben einen Bereich mit fester Höhe.

-Rechtssäule hat einen unteren Bereich. Es sollte den verbleibenden vertikalen Platz des Browserfensters einnehmen. Wenn der Inhalt sehr groß ist, wird nur für diese Region eine Bildlaufleiste angezeigt.

Ich habe versucht, alles ... divs schwebte, absolut positioniert, Tabellen, div-Tags in Tabellen ...

Ist das überhaupt möglich?

ist hier ein Bild, wie es aussehen sollte: http://imgur.com/zk1jP.png

+0

sollte ziemlich einfach sein, solange links und rechts kann das Verhältnis der Bildschirmbreite sein. Kann ich einen deiner Versuche sehen? – edl

+1

Welche Browser unterstützen Sie? – drusnov

+0

Sollte ziemlich einfach sein, wenn Sie bereit sind, etwas Arbeit zu machen. – User

Antwort

11

Es ist überhaupt nicht unmöglich, und Sie sollten Javascript nicht benötigen. Sie benötigen einige IE6-spezifische Hacks, wenn Sie diesen Browser interessieren.

Der Schlüssel zum Layout ist die Tatsache, dass Sie eine oder mehr Kantenpositionen auf einem absolut positionierten Element setzen können. Hier ist ein guter Artikel über die Technik: http://www.alistapart.com/articles/conflictingabsolutepositions/

Hier ist eine Demo: http://www.spookandpuff.com/examples/2col2section.html

und Quelle:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 

    <title>2 col, 2 section layout.</title> 

    <style type="text/css" media="screen"> 
    #leftColumn { 
     position:absolute; 
     top:10px; 
     bottom:10px; 
     left:10px; 
     width:400px; 
    } 

    #rightColumn { 
     position:absolute; 
     top:10px; 
     bottom:10px; 
     right:10px; 
     left:410px;/* This must equal the total width of the #leftColumn, incl padding, border, margin, etc. */ 
    } 

    .topSection{ 
    position:absolute; 
    top:10px; 
    height:120px; 
    left:10px; 
    right:10px; 
    padding:10px; 
    } 

    .bottomSection{ 
    position:absolute; 
    bottom:10px; 
    top:160px; /* This must equal the total height of the .topSection, incl padding, border, margin, etc. */ 
    left:10px; 
    right:10px; 
    padding:10px; 
    overflow-y:auto; 
    } 

    /* Debug styles */ 
    body {background-color:#CCC;} 
    div {border:1px solid #FFF;} 

    #leftColumn {background-color:#7EF4B0;} 
    #rightColumn {background-color:#EEF4A7;} 
    #leftColumn .topSection{background-color:#56A97A;} 
    #rightColumn .topSection{background-color:#D6D06D;} 

    </style> 

</head> 

<body> 
    <div id="leftColumn"> 
     <div class="topSection"> 
     <p>Left column, top section.</p> 
     </div> 

     <div class="bottomSection"> 
     <p>Left column, bottom section.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     </div> 
    </div> 

    <div id="rightColumn"> 
     <div class="topSection"> 
     <p>Right column, top section.</p> 

     </div> 

     <div class="bottomSection"> 
     <p>Right column, bottom section.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     </div> 
    </div> 
</body> 
</html> 

Es gibt ein paar Tricks: Zunächst einmal, ich getestet dies nur in Firefox, um Sie Die allgemeine Idee - es gibt einige notwendige Korrekturen für IE, die ich nicht hinzugefügt habe: Überprüfen Sie die Liste auseinander Artikel oben für Details.

Ich habe 10px zusätzlichen Platz um alle Boxen erlaubt, nur um die Idee zu veranschaulichen - Sie würden diese wahrscheinlich auf 0 in einem echten Layout setzen.

Sie die Höhe .topSection unterschiedlich zwischen den Spalten mit einigen Regeln wie festlegen können:

#leftColumn .topSection {height:xxx} 
#leftColumn .bottomSection {top:xxx} 

#rightColumn .topSection {height:yyy} 
#rightColumn .bottomSection {top:yyy} 

ich einen Behälter mit einer Klasse (oder eine Klasse auf dem Body-Tag) verwenden würde die Breite der spezifizieren linke Spalte, so etwas wie:

#container.narrow #leftColumn {width:100px} 
#container.medium #leftColumn {width:200px} 
#container.wide #leftColumn {width:400px} 

Damit können Sie eine Reihe von 'Vorlagen' Breite definieren, zwischen denen Sie wechseln können.

+0

+1: sehr gut! – ANeves

+0

Das ist großartig. Vielen Dank! –

+0

Wow, dachte nie daran, das zu versuchen. Schraube meinen Javascript-Vorschlag - das ist genial !!! +1 – Addsy

1

Es könnte sich lohnen erwägen einige Javascript verwenden mit Ihrem Layout Problemen zu helfen. Obwohl ich weiß, dass dies nicht ideal ist, ist es eine Lösung, die ich zuvor erfolgreich verwendet habe, als ich versuchte, mit Layouts voller Höhe umzugehen.

Es sollte in Ordnung sein, das Layout, das Sie ohne die volle Höhe Spalten beschreiben zu bekommen Scrollen verwenden Sie dann nur ein wenig Javascript, um sie zu halten, die Höhe des Browsers Füllung

+0

Hast du zufällig irgendwelche Beispiele? –

1

Ich glaube, das ist ziemlich einfach, wenn zu tun Sie haben den Luxus, das ext.js-Framework zu verwenden. Wird mit Code aktualisiert, wenn niemand eine bessere Antwort anbietet und wenn Sie interessiert sind.

Update: Hier ist der Code. Getestet und funktioniert auch mit IE6. Nachteil im Vergleich zu css-only-Lösung ist (i) JavaScript (meist wahrscheinlich die App verwendet bereits JS); (ii) Ext.js-Anforderung (die möglicherweise nicht durchführbar ist):

Beachten Sie die Verwendung von style = "height: 100px;" int html und autoScroll: true im JavaScript-Code. Dies ermöglicht die feste Höhe der oberen 2 Platten und Überlauf mit Scrollbars in den unteren zwei.

Ext.onReady(function(){ 

    Ext.state.Manager.setProvider(new Ext.state.CookieProvider()); 

    var viewport = new Ext.Viewport({ 
     layout: 'border', 
     resizable: false, 
     items: [ 
      { 
       region: 'west', 
       id: 'west-panel',      
       split: false, 
       width: 300,           
       margins: '0 0 0 0', 
       layout: 'border',      
       items: [{ 
        region: 'north', 
        contentEl: 'west1',            
        border: false 
       },{ 
        region: 'center', 
        contentEl: 'west2',       
        border:false, 
        autoScroll: true 
       }] 
      }, 
      { 
       region:'center', 
       id:'center-panel',      
       split:false,      
       margins:'0 0 0 0', 
       layout:'border',      
       items: [{ 
        region: 'north', 
        contentEl: 'center1',       
        border:false 
       },{ 
        region: 'center', 
        contentEl: 'center2',       
        border:false, 
        autoScroll: true 
       }] 
      }         
     ] 
    });   
}); 

und die html:

<div id="west1" style="height: 70px;background-color: #AAA;"> 
    <p>Hi. I'm fixed.</p> 
</div> 
<div id="west2"> 
    <p> long content goes here</p> 
</div> 
<div id="center1" style="height: 100px;background-color: #333;color: #FFF;"> 
    <p>Hi. I'm fixed too.</p>    
</div> 
<div id="center2">   
<p> long content goes here</p> 
</div> 

Demo wird später wieder zur Verfügung, wenn Sie oder jemand interessiert ist. Bitte geben Sie dies an, wenn Sie könnten.

+0

Das Problem mit ExtJS ist, dass Sie viel zu viel von Ihrem Layout in Javascript verschieben, wenn es so weit wie möglich in einem Stylesheet definiert werden sollte. Es gibt wirklich keine Notwendigkeit, Javascript auf einem Layout wie diesem zu verwenden, außer vielleicht als ein bisschen Extra-Politur. – Beejamin

+0

@Beejamin: stimme dem zu, was du gesagt hast und leugne nicht, dass deine CSS-Lösung nur eine clevere Lösung ist. Ich bevorzuge auch CSS-Layout, habe einfach keine clevere Lösung wie Ihre gefunden. Extjs hat seinen Platz und vielleicht nicht in diesem Fall. In dem Moment, in dem Ihre Kunden oder Sie einen vertikalen Splitter (zwischen dem linken und dem rechten Fenster) haben möchten, hat Extjs es bereits, während mit CSS-only-Lösung müsste man ein jQuery Split-Panel-Plugin oder etwas ähnliches suchen. Dann Tabs, dann Symbolleiste usw., die Liste geht weiter. ExtJS macht es dann einfach. Will nicht leugnen, dass ich heute einen coolen CSS-Trick von Ihnen gelernt –

0

Sie werden mit faux columns dorthin gelangen.

Sie können diese Technik verwenden, um die beiden vertikalen Abstände zu erstellen.
Wenn Sie separate Bildlaufleisten benötigen (bitte nicht, Sie werden Usability Kätzchen weinen) können Sie jede der vertikalen Separationen max-height: 100%; overflow: auto; haben, damit sie scroll wenn sie 100% Höhe erreichen.

Für die blauen Balken "Floating-top" können Sie die Elterntrennung position: relative; padding-top: 150px; angeben und dann den blauen Balken position: absolute; top: 0px; left: 0px; width: 100%; height: 150px; overflow: hidden; eingeben. (Ich bin nicht sicher über die 100% Breite.)
Dann wird der grüne und gelbe Inhalt nicht überlappen.