J'avais creusé la tête pour créer un alignement vertical en CSS en utilisant ce qui suit
.base{
background-color:green;
width:200px;
height:200px;
overflow:auto;
position:relative;
}
.vert-align{
padding-top:50%;
height:50%;
}
<!-- and used the following div structure. -->
<div class="base">
<div class="vert-align">
Content Here
</div>
</div>
Bien que cela semble fonctionner pour ce cas, j'ai été surpris de constater que lorsque j'augmentais ou diminuais la largeur de mon div de base, l'alignement vertical se cassait. Je m'attendais à ce que lorsque je définissais la propriété padding-top, cela prendrait le rembourrage en pourcentage de la hauteur du conteneur parent, qui est la base dans notre cas, mais la valeur ci-dessus de 50% est calculée en pourcentage de la largeur. :(
Existe-t-il un moyen de définir le rembourrage et / ou la marge en pourcentage de la hauteur, sans recourir à JavaScript?
top
fonctionne très bien pour le redimensionnement en fonction de la hauteur du navigateur / de la fenêtre. Que diriez-vous d'avoir un div en dessous de ce div? Comment pouvez-vousclear
le 2ème div être sous le div qui est décalé vers le bas par untop:50%
??top: 50%
n'est pas très utile si vous devez aligner le contenu par son propre centre.Une réponse à une question légèrement différente: vous pouvez utiliser des
vh
unités pour garnir les éléments au centre de la fenêtre :la source
vh
est presque la même que les pourcentages ... encore pire dans certains cas. Cette réponse est sans rapport avec la questionVoici deux options pour émuler le comportement nécessaire. Pas une solution générale, mais peut aider dans certains cas. L'espacement vertical ici est calculé sur la base de la taille de l'élément extérieur, pas de son parent, mais cette taille elle-même peut être relative au parent et de cette façon, l'espacement sera également relatif.
Première option: utiliser des pseudo-éléments, ici les espacements verticaux et horizontaux sont relatifs à l'extérieur. Démo
Le déplacement de l'espacement horizontal vers l'élément extérieur le rend relatif au parent de l'extérieur. Démo
Deuxième option: utiliser le positionnement absolu. Démo
la source
Pour que l'élément enfant soit positionné absolument par rapport à son élément parent, vous devez définir la position relative sur l'élément parent ET la position absolue sur l'élément enfant.
Ensuite, l'élément enfant «top» est relatif à la hauteur du parent. Vous devez donc également «traduire» vers le haut l'enfant de 50% de sa propre taille.
Il existe une autre solution utilisant la boîte flexible.
Vous trouverez des avantages / désavantages pour les deux.
la source
Cela peut être réalisé avec la
writing-mode
propriété. Si vous définissez un élémentwriting-mode
sur un mode d'écriture vertical, tel quevertical-lr
, les valeurs de pourcentage de ses descendants pour le rembourrage et la marge, dans les deux dimensions, deviennent relatives à la hauteur au lieu de la largeur.De la spécification :
La définition de la taille en ligne :
Exemple, avec un élément redimensionnable, où les marges horizontales sont relatives à la largeur et les marges verticales sont relatives à la hauteur.
L'utilisation d'un mode d'écriture verticale peut être particulièrement utile dans les cas où vous souhaitez que le rapport d'aspect d'un élément reste constant, mais que sa taille soit mise à l'échelle en corrélation avec sa hauteur au lieu de sa largeur.
la source
-webkit-
préfixe, mais selon caniuse, il n'a pas exigé le préfixe depuis Safari 11. L'avez-vous essayé avec un navigateur dans lequel il ne fonctionnait pas?Une autre façon de centrer le texte d'une ligne est:
ou juste
la source
Un rembourrage à 50% ne centre pas votre enfant, il le placera en dessous du centre. Je pense que vous voulez vraiment un rembourrage de 25%. Peut-être que vous manquez d'espace à mesure que votre contenu grandit? Avez-vous également essayé de définir la marge supérieure au lieu de la garniture supérieure?
EDIT: Nevermind, le site w3schools dit
Alors peut-être qu'il utilise toujours la largeur? Je n'avais jamais remarqué.
Ce que vous faites peut être obtenu en utilisant display: table cependant (au moins pour les navigateurs modernes). La technique est expliquée ici .
la source
line-height
, c'est-à-dire faire la hauteur de ligne à 200 pixels?Ceci est un bug très intéressant. (A mon avis, c'est quand même un bug) Belle trouvaille!
En ce qui concerne la façon de le régler, je recommanderais la réponse de Camilo Martin. Mais pourquoi , je voudrais expliquer un peu cela si cela ne vous dérange pas.
Dans les spécifications CSS, j'ai trouvé:
… Ce qui est bizarre, mais d'accord.
Donc, avec un parent
width: 210px
et un enfantpadding-top: 50%
, j'obtiens une valeur calculée / calculée depadding-top: 96.5px
- qui n'est pas la valeur attendue105px
.En effet, dans Windows (je ne suis pas sûr des autres systèmes d'exploitation), la taille des barres de défilement courantes est par défaut
17px × 100%
(ou100% × 17px
pour les barres horizontales). Ceux-ci17px
sont soustraits avant de calculer le50%
, par conséquent50% of 193px = 96.5px
.la source