Marge sur body, par défaut, ne se laisse pas redéfinire [r

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

Marge sur body, par défaut, ne se laisse pas redéfinire [r

Message par hibou57 »

J'utilise mozilla firefox pour l'affichage de mes pages.

Il semblerait que l'élément body ait une marge par défaut. Donc si on commence à placer dans la page, un élément relative, alors il ne s'affichera pas en (0,0). Ors, cette marge par défaut, semble ne pas pouvoir être entièrement supprimée.

J'ai voulu supprimer les marges par défaut de body, en spécifiant margin:0%. Mais seule la marge left est supprimée, la marge top persiste, et l'élément s'affiche en x=0, mais pas en y=0.

J'ai simplifié avant de vous donner le code le plus simple produisant cette effet.

Fichier « site.css »:
site.css a écrit : .header {
position: relative;
width: 100%;
height: 5em;
top: 0;
left: 0;
border-style: none;
background-color: pink;
}
body {
clear: all;
margin: 0%;
}
Fichier « index.html »:
index.html a écrit : <HTML>
<HEAD>
<LINK href="site.css" rel="stylesheet" type="text/css">
</HEAD>
<BODY>
<DIV class="header">
<P>Header: Ici se trouve les repères de navigation</P>
</DIV>
</BODY>
</HTML>
Si vous créer les deux fichiers, et que vous afficher la page html, alors vous voyez que le bloc d'entête s'affiche avec un décalage vers le bas.

Pourquoi la marge, par défaut, top, de body persiste, et ne peut pas être supprimée ? Comment la supprimer ?
Dernière modification par hibou57 le 13 oct. 2005, 01:42, modifié 1 fois.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Tu es sur qu'il n'y a pas de padding (espacement) ?
Es-ce que le navigateur affiche la page en "mode de respect strict des standard" ? (Ça n'a pas l'air d'être le cas vu l'absence de doctype…) Si ce n'est pas le cas et que tu es en mode "quirk" c'est pas étonnant… et si tu es en mode standard n'oublie pas l'élément racine (html) :wink:
Avatar de l’utilisateur
pascal
Administrateur
Messages : 1515
Inscription : 28 juil. 2003, 15:13

Message par pascal »

à vue d'oeil tu confonds la marge de body avec le margin-top de ton paragraphe.

Quelques questions :
- quelle est la DTD de la page ?
- pourquoi tes balises sont en majuscules ?
- pourquoi tu mets 0% au lieu de 0 ?
- pourquoi tu utilises top et left dans un positionnement relatif ?
- clear: all ça n'existe pas
- à quoi sert de définir border-style:none alors que c'est déjà la valeur par défaut ?
- à quoi sert le width:100% ?
Mes opinions n'engagent que moi et pas mon employeur
Administrateur technique bénévole
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

Message par hibou57 »

Calimo

Je te suis, par étape...

J'ajoute <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> au début du document html : aucun résultat.

J'ajoute padding: 0%; au style de body : aucun résultat.

J'ajoute padding: 0%; au style de la classe header : aucun résultat.

Le mode respect stricte des standards est implicite avec Mozilla FireFox ;) J'ai tout de même chercher dans tout les menus s'il y a quelque chose d'équivalent. Je n'ai rien trouvé de tel.

Pascal

La DTD est HTML 4.01. Mais ça n'a pas de rapport direct.

Les balises peuvent être en majuscules ou en minuscules, ça n'a aucune importance, la norme W3C le spécifie bien, et aucun navigateur ne distingue minuscules et majuscules dans les balises html. (c.f. norme html)

Je met 0% au lieu de 0, parce qu'en css, il faut spécifier une unité. Sinon le navigateur ne sait pas de 0-quoi il s'agit. (c.f. norme css)

Un positionement relatif, est un positionement, il a donc besoin de coordonnées. (c.f. signification du mot « positionement »)

clear:all; existe bien en css. C'est une instruction qui permet de s'assurer de l'anulation de toute instruction de flottement en cours. Même si je le retire, ça ne change rien de toute façon.

J'enlève border-style:none; si tu as envie, mais ça ne change rien (comme tu le reconnais implicitement toi-même).

width:100%; donne la largeur de la boite (ça parrait évident), de manière à ce qu'elle occupe toute la largeure disponnible.

Nouvelle version (résultat inchangé)

Fichier site.css
site.css a écrit : .header {
position: relative;
width: 100%;
height: 5em;
top: 0;
left: 0;
background-color: pink;
padding: 0%;
}
body {
clear: all;
margin: 0%;
padding: 0%;
}
Fichier index.html
index.html a écrit : <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<LINK href="site.css" rel="stylesheet" type="text/css">
</HEAD>
<BODY>
<DIV class="header">
<P>Header: Ici se trouve les repères de navigation</P>
</DIV>
</BODY>
</HTML>
Si quelqu'un(e) a essayé cette page simple : est-ce que vous voyez aussi un espace entre le haut de la page et le haut de la boite ? ... Alors qu'il n'y en a pas entre le bord gauche de la page et le bord gauche de la boite...

S'agit-il d'un bug de Mozilla ? Parce que je n'ai pas ce problème avec IE... (quoique IE donne parfois des résultat qui sont dues au non-respect de la norme css)

Tout se passe comme si à la création du document, le pointeur de flux ne pouvait pas commencer en (0,0).
Avatar de l’utilisateur
pascal
Administrateur
Messages : 1515
Inscription : 28 juil. 2003, 15:13

Message par pascal »

hibou57 a écrit : La DTD est HTML 4.01. Mais ça n'a pas de rapport direct.
Oh que si, surtout si tu mets une DTD incomplète comme tu le fais !!
Les balises peuvent être en majuscules ou en minuscules, ça n'a aucune importance, la norme W3C le spécifie bien, et aucun navigateur ne distingue minuscules et majuscules dans les balises html.
Obligatoire en xhtml, créer ses pages aujourd'hui sans envisager une transition possible au xhtml est idiot et oui, firefox prend cela en compte sur les attributs notamment, onClick, onMouseOver... peuvent ne pas fonctionner en xhtml à cause de la majuscule.

Je met 0% au lieu de 0, parce qu'en css, il faut spécifier une unité. Sinon le navigateur ne sait pas de 0-quoi il s'agit. (c.f. norme css)
L'unité n'est pas nécessaire pour la valeur zéro, zéro tomate, pomme ou poire c'est toujours zéro.
Un positionement relatif, est un positionement, il a donc besoin de coordonnées. (c.f. signification du mot « positionement »)
N'importe quoi, à ton avis que veut dire relatif dans position:relative ?
clear:all; existe bien en css. C'est une instruction qui permet de s'assurer de l'anulation de toute instruction de flottement en cours. Même si je le retire, ça ne change rien de toute façon.
N'importe quoi.

'clear'
Value: none | left | right | both | inherit
J'enlève border-style:none; si tu as envie, mais ça ne change rien (comme tu le reconnais implicitement toi-même).
Ca complique ton code pour rien, si ça ne sert à rien, ne le mets pas, surtout dans une démo sensé montrer un bug.
width:100%; donne la largeur de la boite (ça parrait évident), de manière à ce qu'elle occupe toute la largeure disponnible.
Sauf que ce n'est pas ça, ça prend 100% du bloc conteneur et donc ça ne prend pas la largeur disponible mais la largeur actuellement disponible dans le bloc conteneur, rajoute une bordure ou une marge et tu veras apparaître les scrollbars, ça ne sert à rien donc sauf à provoquer des bugs.
Si quelqu'un(e) a essayé cette page simple : est-ce que vous voyez aussi un espace entre le haut de la page et le haut de la boite ? ... Alors qu'il n'y en a pas entre le bord gauche de la page et le bord gauche de la boite...

S'agit-il d'un bug de Mozilla ? Parce que je n'ai pas ce problème avec IE... (quoique IE donne parfois des résultat qui sont dues au non-respect de la norme css)

Tout se passe comme si à la création du document, le pointeur de flux ne pouvait pas commencer en (0,0).
Aucun problème chez moi, évidemment j'ai rajouté un .header p {margin-top:0;} puisque comme je l'avais dit dans mon premier message tu confonds la marge de body avec la marge externe du paragraphe.

Tu aurais testé dans Opera tu te serais rendu compte qu'il se comporte comme Firefox, quand deux navigateurs créés par des équipes différentes et excellents en CSS se comportent de la même manière, ça veut en général dire qu'ils appliquent la même norme et que c'est donc le bon comportement.
Mes opinions n'engagent que moi et pas mon employeur
Administrateur technique bénévole
Bacchus
Lézard vert
Messages : 103
Inscription : 28 avr. 2005, 19:02

Message par Bacchus »

Il faut faire ceci:

Code : Tout sélectionner

html, body {
margin: 0px;
padding: 0px;
width: 100px;
}
Et tu en aura plus.
Bacchus
Ancien pseudo: psyco_thug | Lézard vert | Inscrit le: 25 Fév 2004
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

Message par hibou57 »

Pascal

J'ai esssayé comme ça, avec une définition pour « .header p », effectivement ça marche. Merci.

« .header p » est une notation css2 si je ne me trompe pas... y at-il aussi un moyen d'obtenir la même chose avec css1 ?

Mais je comprends pas une chose : la classe header s'applique à un bloc div, et le p est contenu dans le div, donc comment pouvait-il ajouter une marge externe au div ? (je ne sais pas si j'exprime bien ma question, alors je reformulerai si je ne suis pas compréhensible)

Comme tu as l'air de bien connaître, je me permet quelques autres questions, si je n'abuse pas.

Tu dis que la DTD est incomplète ? J'ai repris la déclaration qu'utilise mon N|vu. Pourquoi est-elle incomplète ? C'est par que c'est une DTD de transition ? Je l'utilise pour la compatibilité avec les anciens navigateur (fondamental dans mon état d'esprit) : ce n'est pas une bonne chose, ou ce n'est pas la meilleure manière ?

Je note pour la casse des lettre, même si je n'envisage pas de transition vers xhtml, car je vise la compatibilté avec les anciens navigateur : je tiens à ce qu'on mon site soit accessible à tous/toutes, au sens populaire du terme, c'est-à-dire même par les catégories sociales défavorisées, qui sont équipé avec d'ancien pc et d'ancien logiciel, et qui ne passe par leur temps à bricoler sous linux...

Ok pour la zéro, je suis d'accord, c'est logique. Mais mettre une unité ne mange pas de pain. Well, passons.

Par contre je n'ai pas bien compris la remarque sur les positions relative, parce qu'il faut quand même bien précisé une coordonnée relative, c'est-à-dire un offset, un déplacement.

Pour clear, c'est exact, j'ai vérifié... quoique le ton employé pour le faire remarquer n'est pas trés pédagogique.

Pour le 100%, c'est bien ce que je signifiais... le contenant est implicite... d'autant que dans mon exemple, le contenant est bien le document lui même... Donc il s'agit bien de la totalité de la largeur disponnible au sens absolue. Dans ce cas précis du moins.

Pour ce qui est de la remarque sur la conformité, oui, tout à fait d'accord, c'est bien pour cela que je donnais un bémole en parlant d'IE. Et ça me rassure de voir que l'erreur venait de moi, et non pas de Firefox. Ca me rassure...

En tous cas, Encore Merci pour Tout :)

Bacchus

J'ai essayé ta solution, ça ne fonctionne pas :(. Ca ne m'a pas surpris, parce que les dimmension doivent être fourni pour la class header, et non pas pour les éléments html et body.

Merci quand même, c'est gentil à toi.
Avatar de l’utilisateur
pascal
Administrateur
Messages : 1515
Inscription : 28 juil. 2003, 15:13

Message par pascal »

hibou57 a écrit :Pascal

J'ai esssayé comme ça, avec une définition pour « .header p », effectivement ça marche. Merci.

« .header p » est une notation css2 si je ne me trompe pas... y at-il aussi un moyen d'obtenir la même chose avec css1 ?
C'est un sélecteur css1. tous les navigateurs actuels supportent d'ailleurs CSS1 + au moins une grosse part de CSS2, en fait tous les navigateurs actuels ont un excelent support de CSS2 sauf IE qui a pas mal de bugs, mais ces bugs étant documentés et contournables assez facilement rien n'empêche aujourdéhui d'utiliser CSS2.
Mais je comprends pas une chose : la classe header s'applique à un bloc div, et le p est contenu dans le div, donc comment pouvait-il ajouter une marge externe au div ? (je ne sais pas si j'exprime bien ma question, alors je reformulerai si je ne suis pas compréhensible)
C'est ce qu'on appelle en css les "collapsing margins", deux blocs consécutifs sans bordures ni contenu ont leurs marges qui fusionnent, la margin-top du paragraphe est fusionné avec le margin-top du div puisque ce div n'a ni bordure ni contenu avant le paragraphe (c'est un des points complexes de CSS2, je te le concède). Le comportement d'IE est donc buggué puisqu'il n'a pas fusionné les marges comme le demande la norme.
Comme tu as l'air de bien connaître, je me permet quelques autres questions, si je n'abuse pas.
Pas de problème, ne t'offusque pas si je suis sec, c'est ma personnalité, pense seulement que j'ai déjà répondu à ce type de question une bonne centaine de fois cette année en fait, à force ça lasse ;)
Tu dis que la DTD est incomplète ? J'ai repris la déclaration qu'utilise mon N|vu. Pourquoi est-elle incomplète ? C'est par que c'est une DTD de transition ? Je l'utilise pour la compatibilité avec les anciens navigateur (fondamental dans mon état d'esprit) : ce n'est pas une bonne chose, ou ce n'est pas la meilleure manière ?
C'est ok de faire du transitionnel (même si à mon avis ça cause plus de travail que de bénéfice), mais la bonne DTD est :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">


A la base NVU est fait pour faire du code valide en strict (HTML4 ou XHTML). Je pense que Daniel a mis cette dtd incomplète dans un soucis de compatribilité avec la reprise de pages créées dans d'autres outils. Personnellement je trouve ça idiot parce que ça provoque l'utilisation dans les navigateurs du mode "Quirks" (bizarreries en anglais). C'est à dire un mode où les navigateurs affichent dans un mélange de respect des normes et de bidouilles d'avant la normalisation. Quand on a un site à reprendre qui date d'il y a longtemps, ça se justifie, quand on commence à zéro quelque chose il n'y a aucune raison d'utiliser un mode quirks et quasiment aucune d'être en transitionnel.

Je note pour la casse des lettre, même si je n'envisage pas de transition vers xhtml, car je vise la compatibilté avec les anciens navigateur : je tiens à ce qu'on mon site soit accessible à tous/toutes, au sens populaire du terme, c'est-à-dire même par les catégories sociales défavorisées, qui sont équipé avec d'ancien pc et d'ancien logiciel, et qui ne passe par leur temps à bricoler sous linux...
Les anciens navigateurs ne prennent pas en compte les minuscules/majuscules, aucun dégâts donc pour eux. maintenant il faut définir ce qui est ancien pour toi, tu remontes jusqu'où ? personnellement je zappe NS4 et IE4, ils ont accès à mes pages mais sans aucune feuille de style donc ils ne sont pas rejetés, mais bon, si j'ai eu 10 visites sur 300.000 cette années avec des trucs aussi vieux c'est bien le maximum...

Si tu vises IE5+/Gecko/Opera/Safari, il n'y a aucun avantage à se limiter à css1. Il existe par ailleurs des navigateurs modernes gratuits très performants pour de vieilles machines, on pourra citer Kmeleon pour windows 95 qui a le même moteur que Firefox, il n'y a donc pas d'excuse de fracture sociale possible, ou alors il faut aussi décider d'être compatible avec Netscape 3, voire Mosaic...
Ok pour la zéro, je suis d'accord, c'est logique. Mais mettre une unité ne mange pas de pain. Well, passons.
Dans ce cas là je mettrais plutôt des points ou des pixels vu que le % n'est pas une unité de mesure par défaut des navigateurs.

Par contre je n'ai pas bien compris la remarque sur les positions relative, parce qu'il faut quand même bien précisé une coordonnée relative, c'est-à-dire un offset, un déplacement.
Top et left s'appliquent à du positionnement absolu, quand tu utilises du positionnement relatif c'est que tu veux que ton block soit pris en compte dans le calcul de hauteur du flux, il est donc plus logique dans ce cas d'utiliser des margin-top et margin-left. Le calcul du positionnement de top et left avec un block en relatif est particulier :

Computed value: for 'position:relative', see section Relative Positioning. For 'position:static', 'auto'. Otherwise: if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, 'auto'.

This property specifies how far an absolutely positioned box's top margin edge is offset below the top edge of the box's containing block. For relatively positioned boxes, the offset is with respect to the top edges of the box itself (i.e., the box is given a position in the normal flow, then offset from that position according to these properties). Note: For absolutely positioned elements whose containing block is based on a block-level element, this property is an offset from the padding edge of that element. "

Pour le 100%, c'est bien ce que je signifiais... le contenant est implicite... d'autant que dans mon exemple, le contenant est bien le document lui même... Donc il s'agit bien de la totalité de la largeur disponnible au sens absolue. Dans ce cas précis du moins.
Quel est l'intérêt par rapport à un margin:auto qui est la valeur par défaut d'un élément de type block et qui fait excatement ça sans causer de problèmes de barres de défilement intempestives?

Pour résumer : le plus important est de faire du code ultra-simplifié, c'est plus efficace, plus lisible et ça permet de repérer les sources de vrais problèmes bien plus rapidement. Par qilleurs, travailler en mode strict force IE6 à se comporter presque bien, beaucoup de ses bugs disparaissent dans ce mode, donc ça n'a que des avantages, le seul prix étant une plus grande rigueur à avoir dans sa syntaxe.
Mes opinions n'engagent que moi et pas mon employeur
Administrateur technique bénévole
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités