7 Stimmen

Das unmögliche Layout?

Ich fange an zu glauben, dass das unmöglich ist, aber ich dachte, ich frage euch mal.

Im Grunde handelt es sich um ein zweispaltiges Layout, aber das "Unternehmen" möchte Folgendes:

-Immer das gesamte Browserfenster einnehmen

-Anpassung der Größe des Browserfensters

-Die linke Spalte wird eine feste Breite haben, die jedoch von Seite zu Seite flexibel sein sollte.

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

-Die linke Spalte hat einen unteren Bereich. Sie sollte den verbleibenden vertikalen Platz des Browserfensters einnehmen. Wenn der Inhalt sehr groß ist, wird eine Bildlaufleiste nur für diesen Bereich angezeigt.

-Die rechte Spalte sollte den verbleibenden horizontalen Platz des Browserfensters einnehmen.

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

-Die rechte Spalte hat einen unteren Bereich. Sie sollte den verbleibenden vertikalen Platz des Browserfensters einnehmen. Wenn der Inhalt sehr groß ist, wird eine Bildlaufleiste nur für diesen Bereich eingeblendet.

Ich habe alles versucht... divs, schwebend, absolut positioniert, Tabellen, divs in Tabellen...

Ist das überhaupt möglich?

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

11voto

Ben Hull Punkte 7663

Das ist keineswegs unmöglich, und Sie sollten kein Javascript benötigen. Sie benötigen einige IE6-spezifische Hacks, wenn Sie über diesen Browser kümmern.

Der Schlüssel zum Layout ist die Tatsache, dass Sie eine oder mehr Kantenpositionen bei einem absolut positionierten Element. Hier ist ein guter Artikel über diese 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 habe ich dies nur in Firefox getestet, um Ihnen eine allgemeine Vorstellung zu geben - es gibt einige notwendige Korrekturen für den IE, die ich nicht hinzugefügt habe: Schauen Sie sich die Liste abgesehen Artikel oben für Details.

Ich habe 10px zusätzlichen Raum um alle Boxen nur zur Veranschaulichung der Idee erlaubt - Sie würden wahrscheinlich diese auf 0 in einem realen Layout gesetzt.

Sie können die Höhe von .topSection zwischen den Spalten unterschiedlich einstellen, indem Sie einige Regeln anwenden:

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

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

Ich würde einen Container mit einer Klasse (oder einer Klasse auf dem Body-Tag) verwenden, um die Breite der linken Spalte anzugeben, etwa so:

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

Auf diese Weise können Sie eine Reihe von Breitenvorlagen" definieren, zwischen denen Sie wechseln können.

1voto

Addsy Punkte 3894

Es könnte sich lohnen, die Verwendung von Javascript zu erwägen, um Ihre Layout-Probleme zu lösen. Ich weiß zwar, dass dies nicht ideal ist, aber es ist eine Lösung, die ich schon einmal erfolgreich verwendet habe, als ich versuchte, mit Layouts in voller Höhe umzugehen.

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

1voto

Kevin Le - Khnle Punkte 9990

Ich glaube, dies ist ziemlich einfach zu tun, wenn Sie den Luxus der Verwendung der ext.js Framework haben. Wird mit Code aktualisieren, wenn niemand sonst bietet eine bessere Antwort und wenn Sie interessiert sind.

Update: Hier ist der Code. Getestet und funktioniert gut, sogar mit IE6. Nachteil im Vergleich zu css-only-Lösung ist (i) erfordern JavaScript (meist wahrscheinlich die app verwendet bereits JS); (ii) Ext.js Anforderung (die könnte oder könnte nicht zu machbar sein):

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 beiden Felder und den Überlauf mit Bildlaufleisten in den unteren beiden Feldern.

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>

Eine Demo wird später verfügbar sein, falls Sie oder jemand anderes daran interessiert ist. Bitte geben Sie dies an, wenn Sie können.

0voto

ANeves Punkte 5941

Sie erreichen Ihr Ziel mit Fauxpas-Säulen .

Sie können diese Technik verwenden, um die beiden vertikalen Trennungen zu erstellen.
Wenn Sie getrennte Bildlaufleisten wünschen (bitte nicht, sonst weint das Usability-Kätzchen), können Sie jede der vertikalen Trennungen mit max-height: 100%; overflow: auto; damit sie bei Erreichen von 100 % Höhe rollen können.

Für die blauen Balken mit "schwebender Spitze" können Sie die übergeordnete Trennung angeben position: relative; padding-top: 150px; und geben Sie dann den blauen Balken position: absolute; top: 0px; left: 0px; width: 100%; height: 150px; overflow: hidden; . (Ich bin mir nicht sicher, ob die Breite 100 % beträgt).
Dann wird der grüne und gelbe Inhalt nicht überlappen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X