PDA

Pogčedajte punu verziju : CSS floatovanje text boxova


MorenoArdohain
18. 01. 2008., 12:24
Treba da napravim da se kraci blokovi teksta (vesti) prikazuju u 2 kolone.
Trenutno se vesti podele u 2 kolone, pa recimo za 6 vesti imamo po 3 vesti u levoj i desnoj koloni, ali se desava da je jedna kolona znacajno duza od druge (zbog duzine samih vesti), pa se napravi "rupa" u toj drugoj koloni.

Meni treba da se ti tekst boxovi floatuju u zavisnosti od duzine teksta, s leva nadesno, i popunjava prazan prostor. U attachmentu saljem primer kako treba to da izgleda.

Probao sam neke CSS float varijante, ali ne mogu da postignem to sto zelim.

Zna li neko resenje?

ivanhoe
18. 01. 2008., 17:25
eh, ovo me zaitrigiralo, pa sam ti sklepao jedno unobtrusive JS resenje (ako nema JS-a svi boxovi ce da budu floatovani na levo, as usual):

<!doctype html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script type="text/javascript" src="jquery-latest.js"></script>

<style type="text/css">

#wrap { position:relative; width:400px }

#wrap div {
float:left;
width:49%;
border:1px solid red;
margin-bottom:5px;
}

#wrap div.colB {
float:right;
border:1px solid blue;
}

</style>

<script type="text/javascript">
/**
* Optimize vertical space for 2 column layout
* @author: Ivan Dilber (aka ivanhoe)
*/
$(function(){
var gHeightA=0, gHeightB = 0; // ovo je closure, nisu globalne promenjive
$('#wrap div').each( function() {
var box = $(this);
if(gHeightA > gHeightB)
gHeightB += box.addClass('colB').height();
else
gHeightA += box.height();

});
});
</script>

</head>
<body>

<div style="" id="wrap">
<!-- some random boxes -->
<div style="height:100px">1</div>
<div style="height:200px">2</div>
<div style="height:50px">3</div>
<div style="height:450px">4</div>
<div style="height:50px">5</div>
<div style="height:150px;">6</div>
<div style="height:50px">7</div>
<div style="height:100px">8</div>
</div>

</body>
</html>


koristio sam jQuery zbog lakoce i brzine rada, ali moze da se koristi bilo koja biblioteka koja ume da izracuna height() elementa.. borderi su naravno tu cisto da bih video da li se klase lepo dodeljuju..

EDIT: Sad sam isprobao na IE6, FF2 i Operi9 i lepo radi. Ajd nek neko pls. proba na Safariju, pa javite dal radi ?

MorenoArdohain
18. 01. 2008., 17:33
Majstore :)

Inace, na projektu se vec koristi jQuery, tako da je to elegantno resenje.
Mada, mislio sam da postoji neki CSS hack za ovo, ali ako stvarno nema, ovo ce posluziti.

Hvala jos jednom!

kaizen
18. 01. 2008., 17:36
EDIT: Sad sam isprobao na IE6, FF2 i Operi9 i lepo radi. Ajd nek neko pls. proba na Safariju, pa javite dal radi ?

radi...

ivanhoe
19. 01. 2008., 03:16
UPDATE: Moreno je pronasao da u nekim situacijama kad se poklope visine postoji CSS bug da se boxovi "zaglave", ne rasporede se lepo... evo izmenjena verzija koja to resava (dodat je samo clear:left/right koji spreci ovo):

<style type="text/css">

#wrap { position:relative; width:400px }

#wrap div {
float:left;
width:49%;
border:1px solid red;
margin-bottom:5px;
}

#wrap div.colB {
float:right;
border:1px solid blue;
clear:right; /* <------------- OVO JE DODATO */
}
</style>
<script type="text/javascript">
/**
* Optimize vertical space for 2 column layout
* @author: Ivan Dilber (aka ivanhoe)
*/
$(function(){
var gHeightA=0, gHeightB = 0;

$('#wrap div').each( function() {

if(gHeightA > gHeightB)
gHeightB += $(this).addClass('colB').height();
else
gHeightA += $(this).css('clear','left').height(); // <-- ovde je dodato clear:left
});
});
</script>