Si l'on veut créer une bordure uniquement entre les éléments d'une liste par exemple (ni avant le premier, ni après le dernier) l'utilisation du sélecteur first-child permet de le faire facilement. On définit une bordure pour les éléments de la liste et à l'aide de first-child, on supprime la bordure du premier élément.
Le problème est que first-child n'est pas reconnu par tous les navigateurs, notamment internet explorer.
Pour réaliser la même chose, on peut alors donner une classe spécifique au premier élément de la liste pour en supprimer la bordure.
Cette solution n'est pas toujours utilisable, lorsque l'on travaille avec un CMS ou une équipe de développeurs par exemple et que l'on n'a pas un contrôle complet sur le code généré.
Plutôt que chercher à cibler le premier élément pour en supprimer la bordure ou l'image de fond, on peut essayer de "masquer" la bordure indésirable.
La propriété clip qui permet de définir la zone d'affichage peut être une solution, mais elle nécessite l'utilisation de position absolue ce qui n'est pas toujours pratique.
Une autre piste est l'utilisation des marges négatives.
Pour une liste classique, on peut facilement obtenir le résultat suivant :
Ici, les balises li ont un border-top ainsi qu'une marge négative haute de 1px.
La première bordure est masquée sous ie car sortante du bloc conteneur, pour firefox, on ajoute une suppression de bordure avec first-child : li {
margin: -1px 0 0 0;
padding:0;
text-align: center;
height:22px;
line-height:20px;
border-top: 1px #cc0066 solid;
list-style-type: none;
}
li:first-child {
border:0;
}
Si maintenant on applique la même technique pour une liste horizontale :li {Voici ce que l'on obtient :
margin:0 0 0 -1px;
padding:0 10px;
text-align: center;
height:22px;
line-height:20px;
border-left: 1px #cc0066 solid;
float:left;
list-style-type: none;
}
li:first-child {
border:0;
}
Sous ie, cela ne fonctionne pas ... sauf si l'on décide de mettre la balise ul en float:left, on aura alors :
Internet explorer a en effet tendance à masquer les éléments situés dans des marges négatives dans certains cas, et si il ne le fait pas, il suffit que le conteneur soit positionné en float pour que la règle devienne une généralité.
Pour voir d'autres exemples d'applications :
bordures entre des éléments de liste et entre des cellules
Sous explorer:mac ça ne fonctionne pas pour les listes horizontale.
Le premier exemple fonctionne, pas les 2 suivants.
Sur la page d'exemples, le premier fonction; les 2 suivant non; les tableaux fonctionnent tous les 2.
Tout fonctionne sous Safari.
Merci pour cette astuce, et vive Firefox quand même... (merci IE de nous compliquer les standards >_<" )
le problème de ie mac venait des éléments de liste en float dont la largeur n'était pas définie, c'est souvent le cas avec ie mac, si on ne définit pas de largeur pour un élément en float, celui-ci fera 100% de large
je viens de corriger les exemples et tester sur mac, tout fonctionne maintenant
merci pour l'exemple, mais est-il bien nécessaire de se casser la tête sur IE Mac?
pour ma part je l'ai complètement abandonné (comme microsoft d'ailleur..:o)
Merci
Merci
Commentaires momentanément fermés. Merci de votre compréhension.