28173 sujets

CSS et mise en forme, CSS3

bonjour,

je souhaiterai faire un positionnement de type tableau avec des div:

voici mon code html:

<div class="itemTable" >
<div class="itemTitle"><a class="itemTitle" href="http://www.example.com">texte</a></div>
<div class="itemDescriptif">descriptif</div>
<div class="itemPubDate">Fri, 18 Jan 2008 17:52:00 GMT</div>
<div class="itemScore">0.2</div>
</div>


le css dans l'état:



.itemTable {
border:1px solid black;
background-color:#CFE6FE;
margin: 2px;
width:99%;
height: auto;
font-size: smaller;
text-align: justify;
}
.itemTitle {
text-align:left;
text-align: justify;
background-color:#5788FB;
border:1px solid blue;
width: 700px;
height: 20px;
float:left;
padding: 2px;
display: block;
}
a.itemTitle {
	background-color:#5788FB;
    color: #000000;
    text-decoration: none;
    font-weight: bolder;
    font-size: 10px;
}


.itemDescriptif {
	text-align:left;
	background-color:#fff;
border:1px solid black;
width:700px;
height:auto;
margin: 25px 0 0 0px;
padding: 2px;
display: block;
}
.itemPubDate {
text-align:left;
background-color:#D0E0FD;
width:20px;
height:50px;
display: inline-block;
margin: 0px 15px 0 710px;
}
.itemScore {
text-align:left;
border: solid;
background-color:#D0E0FD;
width:10px;
height:50px;
float: right;
display: block;
margin-top: 0px;
}


le but est d'avoir le 1er div (title) et le 2e (descriptif) l'un au dessus de l'autre (display:block;)
mais les deux autres à droite inline, mais à la même hauteur.... est-ce possible, et si oui, comment?

on peut factoriser, mais pour l'instant je voudrait que ça marche Smiley cligne

merci pour votre aide

psyke
Modérateur
bonsoir

avec float , ça va bien , sinon un tableau va bien aussi.


.itemTable {
border:1px solid black;
background-color:#CFE6FE;
margin: 2px;
width:99%;
height: auto;
font-size: smaller;
text-align: justify;
overflow:hidden;/* englobage des flottant et maintient de la largeur dans IE6*/
}
.itemTitle {
background-color:#5788FB;
height: 20px;
padding: 2px;
}
a.itemTitle {
color: #000000;
text-decoration: none;
font-weight: bolder;
font-size: 10px;
}
.itemDescriptif {
background-color:#fff;
}
.itemPubDate {
float:right;
}
.itemScore {
float: left;
}



pourquoi se compliquer plus que ça ? Smiley smile
bonjour,
j'ai pas réussi à mettre en œuvre ta solution. En fait, ce que je voudrais faire, c'est un tableau de ce type:


<table >
    <tr>
      <td style="background-color:orange; border:none;">La Tribune.fr - A LA UNE</td>
	  <td rowspan=2 style="background-color:green;">Fri, 18 Jan 2008 17:55:00 GMT</td>
	  <td rowspan=2 style="background-color:blue;">score: 0.32</td>
	</tr>
	<tr>
      <td style="background-color:orange; ">Nullam hendrerit molestie justo. Phasellus porttitor lacus vel ipsum. Nullam lectus tellus, lacinia sit amet, luctus varius, porta vitae, urna. Maecenas vehicula neque. Pellentesque gravida quam quis pede. Mauris eleifend massa vitae velit. Praesent ultrices vestibulum justo. Quisque eget orci. In ligula nisi, aliquam ac, condimentum non, scelerisque ut, elit.
	  </td>
	  <td ></td>
	  <td ></td>
	</tr>
</table>


mais avec des <div> récupérés d'une source extérieure.


div class="itemTable" >

<div class="itemTitle"><a class="itemTitle" href="http://www.example.com">texte</a></div>

<div class="itemDescriptif">descriptif</div>

<div class="itemPubDate">Fri, 18 Jan 2008 17:52:00 GMT</div>

<div class="itemScore">0.2</div>

</div>


j'aurai aimé savoir si c'était possible, et si oui, comment.


merci pour votre aide
Modérateur
bonsoir

oki , je n'avais pas compris le résultat souhaité.

A priori le inline-block (façon W3c) ne peut convenir , car 4 élements se suivent dans le flux et peuvent alors etre inline (ou inline-block) sur la même ligne (idem si display:table-cell;) ou en block , l'un sur l'autre , le float a le même effet , le clear sur le second decallerait les suivant horizontalemnt (excepté IE qui bug sur ce point en faisant remonté les flottants suivants au niveau du premier , enfin , me semble t-il ).


On peut essayer en extrayant l'un des 2 premiers div , du flux , avec un position:absolute , et mettre en ligne les 3 suivant en float.
(la encore IE , n'est pas au top ) ,En jouant sur les marges negatives avec hauteur fixe sur le premier div , ça a l'air jouable .

donc avec ta contrainte html peut-etre que :

<div class="itemTable" >
	<div class="itemTitle">
	<a href="http://www.example.com">texte</a>
	La Tribune.fr - A LA UNE
	</div>
	<div class="itemDescriptif">
	Nullam hendrerit molestie justo. Phasellus porttitor lacus vel ipsum. 
	Nullam lectus tellus, lacinia sit amet, luctus varius, porta vitae, urna. 
	Maecenas vehicula neque. Pellentesque gravida quam quis pede. 
	Mauris eleifend massa vitae velit. Praesent ultrices vestibulum justo. 
	Quisque eget orci. 
	In ligula nisi, aliquam ac, condimentum non, scelerisque ut, elit.
	</div>
	<div class="itemPubDate">
	Fri, 18 Jan 2008 17:52:00 GMT
	</div>
	<div class="itemScore">
	score <br />0.2
	</div>
</div>
et

/* 
 * {padding:0;margin:0;} 
*/
/*reset pour test*/



div.itemTable {
	text-align:left;
	width:900px;
	background:#008000;
	margin:1em 0;
	overflow:hidden;
}
.itemTitle  {
	border-bottom:2px solid white;
	margin-bottom:-1.8em;
	width:700px;
	height:1.7em;
	position:relative;
	z-index:1;

}
div.itemTitle  a {
}
div.itemDescriptif {
	background:#FFA500;
	width:700px;
	margin:0;
	float:left;
	border-right:2px solid white;
	padding-top:1.7em;
	}
.itemPubDate , .itemScore  {
	float:left;
	padding-top:0.5em;
}
.itemPubDate {
	width:150px;

}
.itemScore  {
	background:blue;
	padding:6px;
	width:35px;
}
</style>
<!--[IF IE ]>
<style type='text/css'>
div.itemDescriptif {
	padding-bottom:1.8em;/* on recupere la marge négative de l'élement precedent.*/
}
</style>
<![ENDIF]-->


bon pas terrible ! difficile a maintenir et facile a mettre en vrac .

Sans contrainte html , en regoupant les 2 premiers div , le 'inline-block; devient possible.

Ceci dit , je me tournerais plus volontiers vers le display:table; avec un display:inline-block; forcé pour IE . Pour IE , la mise en place des fonds sera mal-aisé .

test html :
<div class="playtable">
	<div class="playcell un ">
		<h1><a href="http://www.example.com">texte</a>La Tribune.fr - A LA UNE</h1>
		<p>	Nullam hendrerit molestie justo. Phasellus porttitor lacus vel ipsum. 
		Nullam lectus tellus, lacinia sit amet, luctus varius, porta vitae, urna. 
		Maecenas vehicula neque. Pellentesque gravida quam quis pede. 
		Mauris eleifend massa vitae velit. Praesent ultrices vestibulum justo. 
		Quisque eget orci. 
		In ligula nisi, aliquam ac, condimentum non, scelerisque ut, elit.</p>
	</div>
	<div class="playcell deux">
		Fri, 18 Jan 2008 17:52:00 GMT
	</div>
	<div class="playcell trois">
		score<br />
		0.2
	</div>
</div>

et le css associé:

<style type='text/css'>.playtable , .playcell {
	vertical-align:middle;
	display:table-cell;
}
.playtable {
	background:green;
	width:80%;
	margin:1em 0;
	padding:0;
	display:table;
	min-width:800px;
}
.un {
	background:#FFA500;
	width:80%;
	border-right:2px solid white;
}
.un h1 {
	border-bottom:2px solid white;
	font-size:1.2em;
	margin:0;
	padding:1px;
}
.deux {
	width:15%;
	border-right:2px solid white;
}
.trois {
	background:blue;
}
</style>
<!--[IF IE ]>
<style type='text/css'>
.playtable ,  .playcell  {
	display:inline;
	zoom:1;
}
/* pour habiller le fond en simili colonnes , un fond une largeur fixe devra etre specifié pour IE pour div.playtable. */
</style>
<![ENDIF]-->


La fluidité est plus aisé , cependant IE ne reproduit toujours pas de tableau , un fond devra reproduire l'effet colonne dans IE , nécessitant de fixer la largeur.

En final , vaudrait quand-même mieux touver une soluce pour reprendre le html (coté serveur ?) , en balisant de façon plus pertinente , (tableau th , td ou si casse-coup en html , hn , p , ...).

page test reprenant les propositions :
http://gcyrillus.free.fr/essai/tableaudiv_inlineblock.html
merci merci pour ton aide.

au final, j'ai réussi à récupérer les données et en faire un vieux tableau html.

merci beaucoup pour ton aide!

psyke