Fondamentalement, vous avez ajouté plus d'encombrement dans votre code, ce qui crée plus de confusion, donc j'essaie d'abord de supprimer l'encombrement qui empêche de comprendre le vrai problème.
Tout d'abord, nous devons établir que quelle est la vraie question?
C'est pour cela que l' inline-block
élément " " est poussé vers le bas.
Maintenant, nous commençons à le comprendre et à éliminer le désordre en premier.
1 -
Pourquoi ne pas donner aux trois div la même largeur de bordure?
Donnons-le.
2 - L'élément flottant a-t - il un lien avec l'élément de bloc en ligne poussé vers le bas? Non, cela n'a rien à voir avec ça.
Nous avons donc complètement supprimé cette division . Et vous êtes témoin du même comportement d'élément de bloc en ligne poussé vers le bas.
Voici le tour de la littérature pour saisir l'idée des boîtes de ligne et comment elles sont alignées sur la même ligne, surtout lisez attentivement le dernier paragraphe car c'est là que réside la réponse à votre question.
La ligne de base d'un "bloc en ligne" est la ligne de base de sa dernière boîte de ligne dans le flux normal, sauf si elle n'a pas de boîtes de ligne en flux ou si sa propriété "overflow" a une valeur calculée autre que "visible", dans auquel cas la ligne de base est le bord inférieur de la marge.
Si vous n'êtes pas sûr de la base, voici une brève explication en termes simples.
Tous les caractères sauf «gjpqy» sont écrits sur la ligne de base, vous pouvez penser à la ligne de base comme si vous dessiniez une simple ligne horizontale identique à celle soulignée juste en dessous de ces «caractères aléatoires», alors ce sera la ligne de base mais maintenant si vous écrivez l'un des «gjpqy» caractère (s) sur la même ligne puis la partie inférieure de ces caractères tomberait en dessous de la ligne.
Donc, nous pouvons dire que tous les caractères à l'exception de «gjpqy» sont écrits complètement au-dessus de la ligne de base tandis qu'une partie de ces caractères est écrite en dessous de la ligne de base.
3 - Pourquoi ne pas vérifier où se situe la ligne de base de notre ligne? J'ai ajouté quelques caractères qui montrent la ligne de base de notre ligne.
4 - Pourquoi ne pas ajouter aussi des personnages dans nos divs pour trouver leurs références dans les div? Ici, certains caractères ajoutés dans les divs pour clarifier la ligne de base .
Maintenant, lorsque vous comprenez la ligne de base, lisez la version simplifiée suivante sur la ligne de base des blocs en ligne.
i) Si le bloc en ligne en question a sa propriété de débordement définie sur visible (ce qui est par défaut, il n'est donc pas nécessaire de le définir). Alors sa ligne de base serait la ligne de base du bloc conteneur de la ligne.
ii) Si le bloc en ligne en question a sa propriété de débordement définie sur AUTRE QUE visible. Ensuite, sa marge inférieure serait sur la ligne de base de la ligne de la boîte contenant.
Maintenant, regardez à nouveau pour clarifier votre concept que ce qui se passe avec la div verte . En cas de confusion, des caractères sont ajoutés à proximité de la division verte pour établir la ligne de base du bloc contenant et la ligne de base de la division verte est alignée.
Eh bien, je prétends maintenant qu'ils ont la même base de référence? DROITE?
5 - Alors pourquoi ne pas les superposer et voir s'ils sont bien ajustés les uns aux autres? Donc, j'apporte le troisième div à gauche: 35px; pour vérifier s'ils ont la même ligne de base maintenant ?
Maintenant, nous avons fait prouver notre premier point.
Eh bien, après l'explication du premier point, le deuxième point est facilement digestible et vous voyez que le premier div qui a une propriété de débordement définie sur autre que visible (caché) a sa marge inférieure sur la ligne de base de la ligne.
Maintenant, vous pouvez faire quelques expériences pour l'illustrer davantage.
- Définissez le premier débordement div: visible (ou supprimez-le complètement) .
- Définir le deuxième débordement div: autre que visible .
- Définissez le débordement des deux divs: autre que visible .
Maintenant, ramenez votre fouillis et voyez si tout va bien pour vous.
- Ramenez votre div flotté (bien sûr, il est nécessaire d'
augmenter une certaine largeur du corps) Vous voyez que cela n'a aucun effet.
- Ramenez les mêmes marges impaires .
- Réglez le div vert sur le débordement: visible lorsque vous définissez votre question (ce désalignement est dû à l'augmentation de la largeur de la bordure de 1px à 5px, donc si vous ajustez la gauche à gauche, vous verrez qu'il n'y a pas de problème)
- Supprimez maintenant les caractères supplémentaires que j'ai ajoutés pour faciliter la compréhension . (et bien sûr, supprimez le négatif à gauche)
- Enfin, réduisez la largeur du corps car nous n'en avons plus besoin de plus large.
Et maintenant, nous revenons à notre point de départ.
J'espère avoir répondu à votre question.
La valeur par défaut
vertical-align
en CSS estbaseline
& cette règle s'applique également à lainline-block
lecture de ce http://www.brunildo.org/test/inline-block.htmlÉcrivez
vertical-align:top
dans votreinline-block
DIV.Consultez ce http://jsfiddle.net/WGCyu/1/
la source
display:inline-block
combiné avecfloat:left/right
.vertical-align
propriété, aucune de la complexité décrite dans le la réponse acceptée s'applique.Utilisez simplement
vertical-align:top;
Démo
la source
Consultez cet exemple alternatif. La raison d'un tel comportement est décrite dans le module CSS3: ligne: 3.2. Habillage de la boîte de ligne [1] :
Comme vous pouvez le voir, le troisième élément est poussé vers le bas, bien qu'il n'ait pas de
overflow
propriété. La raison doit être ailleurs. Le deuxième comportement que vous remarquez est décrit dans les feuilles de style en cascade, niveau 2, révision 1 (CSS 2.1): 9.5 Flotteurs [2] :Tous vos
display:inline-block;
divs utilisent un type spécial debaseline
dans ce cas 10.8 Calculs de hauteur de ligne: les propriétés 'line-height' et 'vertical-align' (très fin) [3] :Ainsi, lorsque vous utilisez des éléments flottants et des
inline-block
éléments, l'élément flottant sera poussé sur le côté et le formatage en ligne sera recalculé selon 1 . D'un autre côté, les éléments suivants sont raccourcis s'ils ne correspondent pas. Puisque vous travaillez déjà avec un minimum d'espace, il n'y a pas d'autre moyen de modifier vos éléments que de les pousser 2 . Dans ce cas, l'élément le plus élevé définira la taille de votre div enveloppante, définissant ainsi lebaseline
3 , tandis que d'autre part la modification de position et de largeur indiquée en 2 ne peut pas être appliquée à de tels éléments de hauteur maximale espacée minimale. Dans ce cas, un comportement comme dans ma toute première démo en résultera.Enfin, la raison pour laquelle vous
overflow:hidden
empêcherez#firstDiv
d'être poussé vers le bord inférieur de votre#container
, même si je n'ai pas trouvé de raison dans la section 11 . Sansoverflow:hidden
cela fonctionne comme excepté et défini par 2 et 3 . DémoTL; DR: Examinez de très près les recommandations W3 et les implémentations dans le navigateur. À mon humble avis, les éléments flottants sont déterminés à montrer un comportement inattendu si vous ne connaissez pas tous les changements qu'ils apportent aux éléments environnants. Voici une autre démo qui montre un problème commun avec les flotteurs.
la source
À l'origine, j'ai commencé à répondre à cette question , mais elle a été verrouillée en tant que dupe avant de pouvoir terminer, alors je poste la réponse ici à la place.
Tout d'abord, nous devons comprendre ce qui
inline-block
est.La définition dans MDN dit:
Pour comprendre ce qui se passe ici, nous devons regarder
vertical-align
, et c'est la valeur par défautbaseline
.Dans cette illustration, vous avez ce nuancier:
Bleu: La ligne de base
Rouge: Le haut et le bas de la hauteur de ligne
Vert: Le haut et le bas de la zone de contenu en ligne.
Dans l'élément #left, vous avez du contenu textuel qui contrôle quelle est la ligne de base. Cela signifie que le texte à l'intérieur définit la ligne de base pour #left.
Dans le #right, il n'y a pas de contenu, donc le navigateur n'a pas d'autre option que d'utiliser le bas de la boîte comme ligne de base.
Voir cette visualisation où j'ai dessiné la ligne de base sur un exemple où le premier conteneur en ligne a du texte et le suivant est vide:
Si vous alignez spécifiquement un élément sur le dessus, vous dites vraiment que vous alignez le haut de cet élément sur le haut de la zone de ligne.
Cela pourrait être plus facile à comprendre par un exemple.
Le résultat est le suivant - et j'ai ajouté la ligne de base bleue et la zone de ligne rouge: ce qui se passe ici, c'est que la hauteur de la zone de ligne dépend de la façon dont le contenu de la ligne entière est disposé. Cela signifie que pour calculer l'alignement supérieur, les alignements de ligne de base doivent être calculés en premier. L' élément a , donc ce n'est pas utilisé pour le positionnement de la ligne de base. mais les et sont positionnés verticalement de sorte que leurs lignes de base soient alignées. Lorsque cela est fait, la hauteur de la zone de ligne a augmenté, car l' élément a été légèrement poussé en raison de la taille de police plus grande. Ensuite, la position supérieure de l' élément peut être calculée, et ce le long du haut de la zone de ligne.
#middle
vertical-align:top
#left
#right
#right
#middle
la source
le problème est que vous avez appliqué float: à gauche sur la deuxième div. ce qui fait que le deuxième div vient sur le côté gauche et votre premier div tombe et vient après votre deuxième div. Si vous appliquez float: à gauche sur le premier div également, votre problème aura disparu.
débordement: caché ne cause aucun problème à votre mise en page, débordement: caché affecte uniquement les éléments internes d'une div, il n'a rien à voir avec d'autres éléments qui sont à l'extérieur.
la source
Essayez d'ajouter
padding:0;
au corps et de supprimer la marge de vos divs.Ajoutez de la
background-color:*any
couleur à l'arrière-plan * pour vérifier la différence.la source
code
par exemple:.background-color:any color
Essayez de rendre toutes les propriétés CSS de tous les éléments identiques.
J'ai eu un problème similaire et en résolvant cela, j'ai identifié que je déposais un élément avec la propriété Font dans l'élément Div.
Après avoir supprimé cet élément avec la propriété Font, l'alignement de tous les DIV a été perturbé. Pour résoudre ce problème, j'ai défini la propriété Font sur tous les éléments DIV de la même manière que l'élément qui y est déposé.
Dans l'exemple suivant, l'élément Dropped de la classe ".dldCuboidButton" défini avec la taille de police: 30 px.
J'ai donc ajouté la même propriété aux classes restantes, à savoir .cuboidRecycle, .liCollect, .dldCollect qui sont utilisées par les éléments DIV. De cette façon, tous les éléments DIV suivent les mêmes mesures avant et après y avoir déposé l'élément.
Voici l'exemple de HTML créé dynamiquement à l'aide de CSS ci-dessus.
la source