Traduire 50% des éléments d'un axe Y le fera descendre de 50% de sa propre taille, et non de 50% de la taille de ses parents, comme je le pensais. Comment demander à un élément de traduction de baser son pourcentage de traduction sur l'élément parent? Ou est-ce que je ne comprends pas quelque chose?
Lorsque vous utilisez le pourcentage de translation, cela fait référence à la largeur ou à la hauteur de lui-même. Jetez un coup d’œil à https://davidwalsh.name/css-vertical-center ( demo ):
Une chose intéressante à propos des transformations CSS est que, lorsqu'elles sont appliquées avec des valeurs en pourcentage, elles basent cette valeur sur les dimensions de l'élément sur lequel elles sont implémentées, par opposition à des propriétés telles que haut, droite, bas, gauche, marge , qui utilise uniquement les dimensions du parent (ou en cas de positionnement absolu, qui utilise le parent le plus proche).
Vous pouvez utiliser vw et vh pour traduire en fonction de la taille de la fenêtre.
@keyframes bubbleup {
0% {
transform: translateY(100vh);
}
100% {
transform: translateY(0vh);
}
}
Ce qui fonctionne pour moi en utilisant seulement CSS est:
.child {
position: relative;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* Backward compatibility */
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
}
Comment ça marche:
Pour utiliser le pourcentage dans la propriété de traduction, vous devez utiliser le langage Javascript: http://jsfiddle.net/4wqEm/27/
Code HTML :
<div id="parent">
<div id="children"></div>
</div>
Code CSS:
#parent {
width: 200px;
height: 200px;
background: #ff0;
}
#children {
width: 10%;
height: 10%;
background: #f00;
}
Code Javascript:
parent = document.getElementById('parent');
children = document.getElementById('children');
parent_height = parent.clientHeight;
children_translate = parent_height * 50/100;
children.style.webkitTransform = "translateY("+children_translate+"px)";
J'espère pouvoir vous aider et me dire si vous avez un autre problème.
Votre affirmation est tout à fait juste au sujet des pourcentages provenant de l'élément même traduit. Au lieu d'utiliser la propriété translate dans votre cas, vous devriez utiliser le positionnement absolu pour rester relatif au div parent. J'ai absolument positionné verticalement votre div rouge ici: (n'oubliez pas d'ajouter une position par rapport au div parent. Il doit être positionné autrement que par défaut):
body {
margin: 0;
width: 100%;
height: 100%;
}
body > div {
width: 200px;
height: 200px;
background: #ff0;
position: relative;
}
body > div > div {
width: 10%;
height: 10%;
-webkit-transform: translateY(-50%);
background: #f00;
position: absolute;
top: 50%;
}
Vous pouvez également utiliser un bloc supplémentaire et utiliser la transition, sauf le nœud enfant.
Code HTML :
<div id="parent">
<div id="childrenWrapper">
<div id="children"></div>
</div>
</div>
css devrait être quelque chose comme ça
#parent {
position: relative;
width: 200px;
height: 200px;
background: #ff0;
}
#childrenWrapper{
width: 100%;
height: 100%;
}
#children {
width: 10%;
height: 10%;
background: #f00;
}
Son fork avec le positionnement requis sur l’URL suivante échantillon de travail
body {
margin: 0;
width: 100%;
height: 100%;
}
body>div {
position: relative;
width: 200px;
height: 200px;
background: #ff0;
}
body>div>div {
position: absolute;
left: 50%;
top: 50%;
width: 10%;
height: 10%;
background: #f00;
transform: translate(-50%, -50%);
}
remarques :
Vous pouvez rendre l'élément absolu positionné et utiliser les propriétés left et top pour prendre le pourcentage en tant que parent.
La solution à ce problème consiste à ne pas utiliser du tout la traduction. Lorsque vous traduisez un élément, le pourcentage que vous sélectionnez est basé sur sa propre hauteur.
Si vous souhaitez positionner l'élément en fonction de la hauteur du parent, utilisez top: 50%;
Donc, le code ressemblera à ceci:
body {
margin: 0;
width: 100%;
height: 100%;
}
body > div {
width: 200px;
height: 200px;
background: #ff0;
position: relative;
}
body > div > div {
position: absolute;
top: 50%;
width: 10%;
height: 10%;
/* -webkit-transform: translateY(50%); */
background: #f00;
}