Keskustelut - Web-ohjelmointi - <div> "ikkunaristikko" CSSllä?


ruoto 20:14 31.3.09 
Varmaan helppo juttu, jos osaa, mutta kun ei osaa :-|

Miten asetetaan CSS:llä viisi <div>-elementtiä niin, että neljä on yhden sisällä ja ne muodostaa ikään kuin ikkunaristikon?

Ikkunaruutujen korkeuden pitäisi sitten automaattisesti muuttua sen mukaan, paljonko tekstiä niissä on sisällä.
editoitu: 20:31 31.3.09
NiLon 20:28 31.3.09 

HTML
<div style="border: 1px solid black; width: 300px; height: 300px;">
<div style="float:left; width: 148px; height: 148px; border: 1px solid red;">a</div>
<div style="float:right; width: 148px; height: 148px; border: 1px solid blue; clear: right;">a</div>
<div style="float:left; width: 148px; height: 148px;  border: 1px solid green;">a</div>
<div style="float:right; width: 148px; height: 148px; border: 1px solid yellow;">a</div>
</div>
 

Jotain ton tapasta.
Yhden boksin koko kun muuttuu niin levähtää koko romu.

Vaihtoehto onkin:

HTML
<table border="1">
<tr><td>a</td><td>a</td></tr>
<tr><td>a</td><td>a</td></tr>
</table>
 
ruoto 21:32 31.3.09 
Juurikin tuon taulukolla toteutetun muotoilun korvaaminen css-muotoilulla oli mulla mielessä, kun kaikkialla toitotetaan, että taulukot on "out" ja css-muotoilu on "in". Kuitenkin melkein kaikki css-esimerkit on tyyppiä "yläpalkki ja pari, kolme saraketta alle".

Ehkä tommosen "joustavan" gridin toteuttaminen css:llä ei sitten kuitenkaan niin helppo juttu ole.
Grez 22:17 31.3.09 
Henk.koht. olen kyllä sitä mieltä että taulujen käyttäminen on edelleen perusteltua taulukoiden esittämiseen.
eis 01:08 1.4.09 
Eikä taida Grez olla ainoa tuon mielipiteen kanssa. Jos kyseessä on oikeasti taulukosta, niin kyllä se taulukko on edelleen perusteltu esitystapa.
editoitu: 03:06 1.4.09
Grez 03:04 1.4.09 
(Sori, tuli turha postaus)
T.M. 17:31 1.4.09 
jengi tuntuu luulevan että tablet kehiteltiin alunperin sivuston ulkoasun esittämiseen, kun kerran on näitä tablen vastustajia ja propagandan tekijöitä <div style="vuodatus:true">(oletteko nähneet sen sivun missä tableja haukutaan pahoiksi, ja esitetään kuinka vaikeaa on tablen soluihin laittaa paddingiä? esimerkissä oltiin luotu juuri tuollainen ristikko, ja he väittivät sitä vaikeaksi tehtäväksi taulukoilla, vaikka taulukot juuri kehiteltiin tuota käyttöä varten. Heidän über ratkaisu: laitetaan paddingi taulukon soluihin lisäämällä uusia tyhjiä soluja niihin kohtaan taulukkoa joihin halutaan päddingiä!, sitten seuraavana näkyy div esimerkki samasta, samannäköinen rakenne sillä koodilla, paitsi table, tr, td korvattu div elementeillä, ja lisätty koodiin "padding:5px" tjsp, ihan kuin taulukon soluille ei voisi näin tehdä lmao.)</div>

harmi etten muista tuota urlia enää :/
editoitu: 20:17 1.4.09
tsuriga 20:14 1.4.09 
Näistä tappelu on niin vuodelta 2005 (kuten varmaan myös T.M.:n yllä mainitsema sivu). Eiköhän nykyään kaikki jo tiedä div- ja table-elementtien käyttökohteet, on niistä sen verta tauhkottu.

EDIT: Komento takaste, luin ketjun. Noh, huonot ovat olleet lähteet. Kuten aina tietoa etsiessä, kannattaa kiinnittää huomiota myös lähdemateriaalin julkaisuaikaan mikäli vain mahdollista.
ruoto 16:48 2.4.09 
Kiitos kaikille kommenteista. Yhteenvetona tulkitsen, että tuommoisen joustavan ikkunaruutumallisen layoutin helpoin (ja ehkä jopa ainoa) toteutus on taulukko. Tämä sopii minulle ihan hyvin. Halusin vain varmistaa, etten tee turhia typeryyksiä.
editoitu: 20:54 4.4.09
Merri 20:50 4.4.09 
Käyttö ei ole riippuvainen siitä, millaisen visuaalisen lopputuloksen haluat, vaan ihan siitä, millaista sisältöä olet sijoittamassa HTML-sivulle. Alla on esimerkki, joka muuttaa otsikoidun listauksen taulukon näköiseksi käyttämättä CSS:n display tablea, joka on helpoin tapa tehdä taulukkoja ilman taulukoita. Tämä alla nähty temppu on tarpeellinen jos haluaa IE7 ja IE6 -yhteensopivuutta.


HTML
<!DOCTYPE <!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="fi">
        <head>
                <meta http-equiv="content-type" content="text/html; charset=utf-8" />
                <title>Ikkunaruutu</title>
                <style type="text/css">/*<![CDATA[*/

dl.ikkuna {
        border: 1px solid #DDD;
        margin: 0 auto;
        padding: 0;
        width: 400px;
}

dl.ikkuna dt {
        float: left;
        margin: 0;
        padding: 5px;
        width: 190px;
}

dl.ikkuna dd {
        border-left: 200px solid #EEE;
        margin: 0;
        padding: 1px 0;
}

dl.ikkuna dd p {
        margin: 4px 0;
        padding: 0 5px;
}

dl.ikkuna:after,dl.ikkuna dd:after {
        clear: both;
        content: '';
        display: block;
}

                /*]]>
*/</style>
        </head>
        <body>
                <h1>Mihin ikkunaasi tarvitset?</h1>
                <dl class="ikkuna">
                        <dt>Esittääkö se taulukkomuotoista dataa?</dt>
                        <dd>
                                <p>Mikäli se ei esitä, niin silloin voi miettiä vaihtoehtoisia esitystapoja.</p>
                                <p>HTML:ssä on runsaasti erilaisia tageja, joista valita <i>sisällölle</i> sopivin.</p>
                        </dd>
                        <dt>CSS on hyödyllistä,<br />loogista ja hauskaa,<br />mutta vaatii opettelua<br />ja paneutumista</dt>
                        <dd>
                                <p>Kun tyylit ovat CSS:n varassa, on päivitettävyys helppoa.</p>
                        </dd>
                </dl>
        </body>
</html>


Tämä temppu perustuu CSS:n floatti + margin leiskantaittoon: viimeiseksi jätettävä palsta jätetään kelluttamatta (float) ja sille määritellään kellutettujen elementtien leveyden edestä marginaalia. Tässä esimerkissä tosin olen käyttänyt borderia, joka ei salli prosentuaalisten leveyksien määrittelyä kellutetulle elementille, mutta antaa tavallaan mahdollisuuden määritellä taustavärin kellutetulle elementille. Myös taustakuvan voi laittaa, silloin pitää vaan käyttää paddingia marginin/borderin sijasta.

Lopuksi varmistetaan se, että kelluttamaton elementti on aina vähintään kellutetun elementin pituinen. Tämä onnistuu käyttäen :after-pseudoelementtiä. IE:llä pitäisi määritellä leveys isännöivälle elementille, mutta tämmöisessä ruudukossa se ei ihan onnistu täysin halutulla tavalla. Ainoaksi korjaukseksi IE6:lle ja IE7:lle jää määritellä JavaScriptiä käyttöön, helpoimmillaan:
<!--[if lt IE 8]><script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE8.js" type="text/javascript"></script><![endif]-->
Kyseessä siis Dean Edwardsin IE8-skripti, joka kasvattaa IE6:n ja IE7:n CSS-tuen määrää. Bugeja sekään ei korjaa, plus monimutkaiset tyylit voivat toimia raskaasti, joten sitä pitää käyttää harkiten.

Tämän tempun etuna oikeaan taulukkoon verrattuna on se, että graafista tyylittelyä on paljon monipuolisempaa tehdä. Taulukkomaisuutta voi lähteä hajoittelemaan monin eri tavoin, mikäli niin haluaa tehdä, mutta silti taulukon perusominaisuudet saa pysymään. Sisältö kuitenkin lopulta määrää sen, onko kyseessä oikea taulukko, listaus, palstoitus vai mitä. Yhtä ainutta oikeaa tapaakaan ei ole, ja joskus sisältö voi sopia useammalla eri tavalla esitettäväksi. Tämä on sitä CSS-taittoa: HTML:llä ryhmitellään sisältö rakenteeksi ja CSS tyylittelee rakenteen. Joskus toki tulee selainten rajallisuuksia vastaan kuin myös HTML:n rajat, onhan XHTML:kin jo 10 vuotta vanha. HTML 5 sisältää paljon uusia elementtejä, jotka hieman helpottavat sivun perusrakenteen luomista: linkkinavigoinnin voi tehdä nav-elementillä listaelementin sijaan jne.