Existe-t-il un moyen plus flexible d’aligner à droite le "Contact" plutôt que d’utiliser position: absolute
?
.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c { position: absolute; right: 0; }
<h2>With title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<!--<div class="b"><a href="#">Some title centered</a></div>-->
<div class="c"><a href="#">Contact</a></div>
</div>
Voici. Définissez justify-content: space-between
sur le conteneur flexible.
.main {
display: flex;
justify-content: space-between;
}
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { text-align: center; }
<h2>With title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<!-- <div class="b"><a href="#">Some title centered</a></div> -->
<div class="c"><a href="#">Contact</a></div>
</div>
Une approche plus flexible consisterait à utiliser une marge gauche auto
(traiter les éléments flex marges automatiques un peu différemment que dans un contexte de formatage de bloc).
.c {
margin-left: auto;
}
Violon mis à jour:
.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c {margin-left: auto;}
<h2>With title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<!--<div class="b"><a href="#">Some title centered</a></div>-->
<div class="c"><a href="#">Contact</a></div>
</div>
<h1>Problem</h1>
<p>Is there a more flexbox-ish way to right align "Contact" than to use position absolute?</p>
Si vous voulez utiliser flexbox pour cela, vous devriez pouvoir: (display: flex
sur le conteneur, flex: 1
sur les éléments et text-align: right
sur .c
):
.main { display: flex; }
.a, .b, .c {
background: #efefef;
border: 1px solid #999;
flex: 1;
}
.b { text-align: center; }
.c { text-align: right; }
... ou bien (encore plus simple), si les éléments ne doivent pas se rencontrer, vous pouvez utiliser justify-content: space-between
sur le conteneur et supprimer complètement les règles text-align
:
.main { display: flex; justify-content: space-between; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
Voici une démo sur Codepen pour vous permettre d'essayer rapidement ce qui précède.
Vous pouvez également utiliser un remplisseur pour remplir l'espace restant.
<div class="main">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="filler"></div>
<div class="c"><a href="#">Contact</a></div>
</div>
.filler{
flex-grow: 1;
}
J'ai mis à jour la solution avec 3 versions différentes. Ceci en raison de la discussion sur la validité de l’utilisation d’un élément de remplissage supplémentaire. Si vous exécutez le code extrait, vous constatez que toutes les solutions ont des effets différents. Par exemple, si vous définissez la classe de remplissage sur l'élément b, cet élément remplira l'espace restant. Cela a l'avantage qu'il n'y a pas d'espace "mort" qui ne soit pas cliquable.
<div class="mainfiller">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="filler"></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<div class="mainfiller">
<div class="a"><a href="#">Home</a></div>
<div class="filler b"><a href="#">Some title centered</a></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<div class="main">
<div class="a"><a href="#">Home</a></div>
<div class="b"><a href="#">Some title centered</a></div>
<div class="c"><a href="#">Contact</a></div>
</div>
<style>
.main { display: flex; justify-content: space-between; }
.mainfiller{display: flex;}
.filler{flex-grow:1; text-align:center}
.a, .b, .c { background: yellow; border: 1px solid #999; }
</style>
Ou vous pouvez simplement utiliser justify-content: flex-end
.main { display: flex; }
.c { justify-content: flex-end; }
Aussi facile que
.main {
display: flex;
flex-direction:row-reverse;
}
Ajoutez la classe CSS suivante à votre feuille de style:
.my-spacer {
flex: 1 1 auto;
}
Placez un élément vide entre l'élément de gauche et l'élément que vous souhaitez aligner à droite:
<span class="my-spacer"></span>
Si vous souhaitez qu'un élément soit aligné à gauche (comme un en-tête), mais que plusieurs éléments soient alignés à droite (comme 3 images), procédez comme suit:
h1 {
flex-basis: 100%; // forces this element to take up any remaining space
}
img {
margin: 0 5px; // small margin between images
height: 50px; // image width will be in relation to height, in case images are large - optional if images are already the proper size
}
Voici à quoi cela ressemblera (seuls les CSS pertinents ont été inclus dans l'extrait ci-dessus)
'justifier-contenu: flex-end' a travaillé dans le conteneur de la boîte de prix.
.price-box {
justify-content: flex-end;
}
Je trouve que l'ajout de 'justification-contenu: flex-end' au conteneur flex résout le problème alors que 'justification-contenu: espace-entre' ne fait rien.
Cette solution devrait fonctionner
.main{
position: relative;
display: -ms-flexbox;
display: flex;
vertical-align: middle;
}
.main .c{
margin-left: auto;
order: 2;
}
<div class="main">
<div class="a"><a href="#">Home</a></div>
<!--<div class="b"><a href="#">Some title centered</a></div>-->
<div class="c"><a href="#">Contact</a></div>
</div>
Exemple de code basé sur réponse par TetraDev
Images à droite:
* {
outline: .4px dashed red;
}
.main {
display: flex;
flex-direction: row;
align-items: center;
}
h1 {
flex-basis: 100%;
}
img {
margin: 0 5px;
height: 30px;
}
<div class="main">
<h1>Secure Payment</h1>
<img src="https://i.stack.imgur.com/i65gn.png">
<img src="https://i.stack.imgur.com/i65gn.png">
</div>
Images à gauche:
* {
outline: .4px dashed red;
}
.main {
display: flex;
flex-direction: row;
align-items: center;
}
h1 {
flex-basis: 100%;
text-align: right;
}
img {
margin: 0 5px;
height: 30px;
}
<div class="main">
<img src="https://i.stack.imgur.com/i65gn.png">
<img src="https://i.stack.imgur.com/i65gn.png">
<h1>Secure Payment</h1>
</div>