par
finipe » 20 juil. 2016, 02:49
Bonjour à tous,
Je réalise un projet de frise chronologique qui reprend des compositeurs dans une base de données et génère la frise automatiquement. Ça fonctionne pas mal, mais je bute sur un problème de mise en page.
Voici le code :
echo "<div id='FRISE'>";
// -- CADRE CHRONOLOGIQUE
echo "<div id='CHRONO_SIECLES'>";
for($i=1400 ; $i<=2000 ; $i+=100) echo "<p>".$i."</p>";
// -- AFFICHAGE DES COMPOSITEURS DEPUIS LA BASE
for($i=1 ; $i<=7 ; $i++)
{
$result = mysqli_query($DB, "SELECT * FROM compositeurs WHERE periode='".$i."' ORDER BY naissance ASC");
while($row = mysqli_fetch_array($result))
{
// Naissance et mort du compositeur
// --> Si le compositeur n'est pas mort, la fin de la barre correspond à l'année en cours
if(empty($row['mort'])) $fin = date(Y);
else $fin = intval($row['mort']);
$debut = intval($row['naissance']);
// Durée de vie
$longevite = $fin - $debut;
// Naissance du compositeur à partir de l'origine (année 1400)
// Multiplicateur pixels = 4
$left = ($debut - 1400)*4;
echo "<div class='CHRONO_COMPO' style='margin-left:".$left."px; color:".$__PERIODE[intval($row['periode'])][2]."; background-color:".$__PERIODE[intval($row['periode'])][1]."; width:".($longevite*4)."px;'>".$row['prenom']." ".$row['nom']."<br />".$row['naissance']."-".$row['mort']."</div>";
}
}
echo "</div>"; // Fin #CHRONO_SIECLES
echo "</div>"; // Fin #FRISE
Et le CSS qui va avec...
Code : Tout sélectionner
#FRISE { width:2800px; margin:0; font-family:Georgia, serif; }
#CHRONO_SIECLES { background:#EFEFEF url(Images/fond_frise.png); width:2800px; position:absolute; z-index:-1; overflow:auto; }
#CHRONO_SIECLES p { font-size:1.5em; margin:0 0 20px 0; padding-left:2px; width:398px; display:inline-block; }
.CHRONO_COMPO { margin-top:3px; cursor:pointer; text-align:center; font-size:0.7em; height:36px; display:block; color:black; line-height:18px; }
.CHRONO_COMPO:hover { box-shadow:0px 0px 0px 2px #000000 inset; }
Et enfin, le résultat obtenu :
Je suis plutôt satisfait, mais je voudrais que les compositeurs ne se succèdent pas les uns en dessous des autres, sans quoi au bout d'un moment la frise va devenir trop haute et impraticable.
Comment faire pour que :
- si les dates se chevauchent, les barres des compositeurs se décalent l'une en dessous de l'autre ?
- et si les dates ne se chevauchent pas, la nouvelle barre se place au même niveau qu'une précédente ?
(par exemple, dans la copie d'écran ci-dessous, la barre de Claudio Monteverdi se placerait au même niveau que celle de Clément Janequin, puis Lully au niveau de Palestrina, Purcell au niveau de Janequin et Monteverdi, etc.)
Merci pour votre aide !
Bonjour à tous,
Je réalise un projet de frise chronologique qui reprend des compositeurs dans une base de données et génère la frise automatiquement. Ça fonctionne pas mal, mais je bute sur un problème de mise en page.
Voici le code :
[php]echo "<div id='FRISE'>";
// -- CADRE CHRONOLOGIQUE
echo "<div id='CHRONO_SIECLES'>";
for($i=1400 ; $i<=2000 ; $i+=100) echo "<p>".$i."</p>";
// -- AFFICHAGE DES COMPOSITEURS DEPUIS LA BASE
for($i=1 ; $i<=7 ; $i++)
{
$result = mysqli_query($DB, "SELECT * FROM compositeurs WHERE periode='".$i."' ORDER BY naissance ASC");
while($row = mysqli_fetch_array($result))
{
// Naissance et mort du compositeur
// --> Si le compositeur n'est pas mort, la fin de la barre correspond à l'année en cours
if(empty($row['mort'])) $fin = date(Y);
else $fin = intval($row['mort']);
$debut = intval($row['naissance']);
// Durée de vie
$longevite = $fin - $debut;
// Naissance du compositeur à partir de l'origine (année 1400)
// Multiplicateur pixels = 4
$left = ($debut - 1400)*4;
echo "<div class='CHRONO_COMPO' style='margin-left:".$left."px; color:".$__PERIODE[intval($row['periode'])][2]."; background-color:".$__PERIODE[intval($row['periode'])][1]."; width:".($longevite*4)."px;'>".$row['prenom']." ".$row['nom']."<br />".$row['naissance']."-".$row['mort']."</div>";
}
}
echo "</div>"; // Fin #CHRONO_SIECLES
echo "</div>"; // Fin #FRISE[/php]
Et le CSS qui va avec...
[code]#FRISE { width:2800px; margin:0; font-family:Georgia, serif; }
#CHRONO_SIECLES { background:#EFEFEF url(Images/fond_frise.png); width:2800px; position:absolute; z-index:-1; overflow:auto; }
#CHRONO_SIECLES p { font-size:1.5em; margin:0 0 20px 0; padding-left:2px; width:398px; display:inline-block; }
.CHRONO_COMPO { margin-top:3px; cursor:pointer; text-align:center; font-size:0.7em; height:36px; display:block; color:black; line-height:18px; }
.CHRONO_COMPO:hover { box-shadow:0px 0px 0px 2px #000000 inset; }[/code]
Et enfin, le résultat obtenu :
[img]http://www.scriptendo.fr/frise.jpg[/img]
Je suis plutôt satisfait, mais je voudrais que les compositeurs ne se succèdent pas les uns en dessous des autres, sans quoi au bout d'un moment la frise va devenir trop haute et impraticable.
Comment faire pour que :
- si les dates se chevauchent, les barres des compositeurs se décalent l'une en dessous de l'autre ?
- et si les dates ne se chevauchent pas, la nouvelle barre se place au même niveau qu'une précédente ?
(par exemple, dans la copie d'écran ci-dessous, la barre de Claudio Monteverdi se placerait au même niveau que celle de Clément Janequin, puis Lully au niveau de Palestrina, Purcell au niveau de Janequin et Monteverdi, etc.)
[img]http://www.scriptendo.fr/frise2.jpg[/img]
Merci pour votre aide !