J'essaie de centrer verticalement et horizontalement du contenu superposé à une diapositive d'image (flexslider). Il y avait quelques questions similaires à celle-ci, mais je ne trouvais pas de solution satisfaisante directement applicable à mon problème spécifique. En raison des limitations de FlexSlider, je ne peux pas utiliser position: absolute;
sur la balise img dans mon implémentation.
J'ai presque une solution de contournement ci-dessous de travail. Le seul problème est que je ne parviens pas à obtenir les déclarations width & height inner-wrapper
div avec le display: table-cell
propriété.
Est-ce comportement standard ou est-ce que je manque quelque chose avec mon code? Si c'est un comportement standard, quelle est la meilleure solution à mon problème?
[~ # ~] html [~ # ~]
<ul>
<li>
<img src="#">
<div class="outer-wrapper">
<div class="inner-wrapper">
<h1>My Title</h1>
<h5>Subtitle</h5>
</div>
</div>
</li>
</ul>
[~ # ~] css [~ # ~]
html, body {
margin: 0; padding: 0;
width: 100%; height: 100%;
}
ul {
background: #CCC;
height: 100%;
width: 100%;
list-style-position: outside;
margin: 0; padding: 0;
}
li {
width: 100%;
display: table;
}
img {
width: 100%;
height: 410px;
}
.outer-wrapper {
position: absolute;
width: 100%;
height: 100%;
top: 0;
margin: 0; padding: 0;
}
.inner-wrapper {
display: table-cell;
vertical-align: middle;
text-align: center;
width: 100%;
height: 100%;
}
Remarque: le contenu centré aura plus d'un élément, je ne peux donc pas utiliser l'astuce hauteur de ligne.
jsFiddle .
En mettant display:table;
à l'intérieur .outer-wrapper
semblait fonctionner ...
EDIT: deux wrappers utilisant la cellule d'affichage du tableau
Je voudrais commenter votre réponse, mais j'ai trop peu de rep :( de toute façon ...
Partir votre réponse , semble que tout ce que vous avez à faire est d’ajouter display:table;
à l'intérieur .outer-wrapper
(Dejavu?), Et vous pouvez vous débarrasser de table-wrapper
de tout cœur.
Mais oui, le position:absolute
vous permet de placer le div
sur le img
, j'ai lu trop vite et j'ai pensé que vous ne pouviez pas utiliser position:absolute
_ du tout, mais on dirait que vous l'avez déjà compris. Des accessoires!
Je ne vais pas poster le code source, après tout le travail de timshutes à 99%, alors référez-vous à sa réponse, ou utilisez simplement mon lien jsfiddle
Mise à jour: un wrapper utilisant Flexbox
Cela fait un moment, et tous les enfants cools utilisent flexbox:
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
stuff to be centered
</div>
Prise en charge du navigateur ( source ): IE 11+, FireFox 42+, Chrome 46+, Safari 8+, iOS 8.4+ (-webkit-
préfixe), Android 4.1+ (-webkit-
préfixe)
Astuces CSS: Un guide pour Flexbox
Comment centrer en CSS : indiquez comment vous souhaitez que votre contenu soit centré et comment le faire en HTML et en CSS. L'avenir est là!
J'ai compris celui-ci. Je sais que cela aidera quelqu'un un jour.
Comment centrer verticalement et horizontalement une div sur une image relativement positionnée
La clé était un 3ème emballage. Je voterais n'importe quelle réponse qui utilise moins de wrappers.
HTML
<div class="wrapper">
<img src="my-slide.jpg">
<div class="outer-wrapper">
<div class="table-wrapper">
<div class="table-cell-wrapper">
<h1>My Title</h1>
<p>Subtitle</p>
</div>
</div>
</div>
</div>
CSS
html, body {
margin: 0; padding: 0;
width: 100%; height: 100%;
}
ul {
width: 100%;
height: 100%;
list-style-position: outside;
margin: 0; padding: 0;
}
li {
width: 100%;
display: table;
}
img {
width: 100%;
height: 100%;
}
.outer-wrapper {
width: 100%;
height: 100%;
position: absolute;
top: 0;
margin: 0; padding: 0;
}
.table-wrapper {
width: 100%;
height: 100%;
display: table;
vertical-align: middle;
text-align: center;
}
.table-cell-wrapper {
width: 100%;
height: 100%;
display: table-cell;
vertical-align: middle;
text-align: center;
}
Vous pouvez voir le travail jsFiddle ici.
Bienvenue en 2017 ces jours-ci utiliseront vW
et vH
feront l'affaire
html, body {
margin: 0; padding: 0;
width: 100%; height: 100%;
}
ul {
background: #CCC;
height: 100%;
width: 100%;
list-style-position: outside;
margin: 0; padding: 0;
}
li {
width: 100%;
display: table;
}
img {
width: 100%;
height: 410px;
}
.outer-wrapper {
position: absolute;
width: 100%;
height: 100%;
top: 0;
margin: 0; padding: 0;
}
.inner-wrapper {
display: table-cell;
vertical-align: middle;
text-align: center;
width: 100vw; /* only change is here "%" to "vw" ! */
height: 100vh; /* only change is here "%" to "vh" ! */
}
<ul>
<li>
<img src="#">
<div class="outer-wrapper">
<div class="inner-wrapper">
<h1>My Title</h1>
<h5>Subtitle</h5>
</div>
</div>
</li>
</ul>
J'ai découvert que plus la valeur de 'width' est élevée, plus la largeur de la boîte est réduite et inversement. J'ai découvert cela parce que j'avais le même problème plus tôt. Alors:
.inner-wrapper {
width: 1%;
}
résout le problème.
Votre 100% signifie 100% de la fenêtre, vous pouvez y remédier en utilisant l'unité vw en plus du% unité à la largeur. Le problème est que 100vw est lié à la fenêtre d'affichage, outre que% est lié à la balise parent. Faire comme ça:
.table-cell-wrapper {
width: 100vw;
height: 100%;
display: table-cell;
vertical-align: middle;
text-align: center;
}
et à propos de ça? (Lien jsFiddle)
CSS
ul {
background: #CCC;
height: 1000%;
width: 100%;
list-style-position: outside;
margin: 0; padding: 0;
position: absolute;
}
li {
background-color: #EBEBEB;
border-bottom: 1px solid #CCCCCC;
border-right: 1px solid #CCCCCC;
display: table;
height: 180px;
overflow: hidden;
width: 200px;
}
.divone{
display: table-cell;
margin: 0 auto;
text-align: center;
vertical-align: middle;
width: 100%;
}
img {
width: 100%;
height: 410px;
}
.wrapper {
position: absolute;
}