J'ai une image que j'aimerais étendre au-delà de son conteneur parent, juste en haut et en bas, à la même distance. Je peux obtenir cet effet en haut, mais je ne peux pas le faire en bas. Comment puis-je obtenir cet effet tout en restant réactif et en conservant le contenu restant chez le parent?
J'ai essayé différentes méthodes de positionnement absolu, mais j'ai continué à casser la grille. J'ai pu réaliser ce que j'ai jusqu'à présent en utilisant des marges négatives, mais seulement en plus.
C'est le code très basique que j'ai jusqu'à présent et voici le jsfiddle. :
<div class="band"> <div class="contain"> <div class="row"> <div class="col"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> </div> <div class="col col-image"> <img src="https://via.placeholder.com/800x450?text=fpo"> </div> </div> </div> </div>
.band { background-color: #ddd; margin-top: 100px; } .contain { margin: 0 auto; max-width: 600px; } .row { align-content: flex-start; clear: both; display: flex; flex-flow: row wrap; overflow: visible; } .col { width: 50%; } .col-image { margin-top: -20px; } p { padding: 20px; } img { display: block; height: auto; max-width: 100%; }
3 Réponses :
Le positionnement semble fonctionner
<div class="band"> <div class="contain"> <div class="row"> <div class="col"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> </div> <div class="col col-image"> <img src="https://via.placeholder.com/800x450?text=fpo"> </div> </div> </div> </div>
.band { background-color: #ddd; margin-top: 100px; } .contain { margin: 0 auto; max-width: 600px; } .row { align-content: flex-start; clear: both; display: flex; flex-flow: row wrap; overflow: visible; position: relative; } .col { width: 50%; } .col-image { position: absolute; top: -20px; bottom: -20px; left: 50% } p { padding: 20px; } img { display: block; height: 100%; }
Merci pour les commentaires. J'avais initialement commencé avec quelque chose comme ça, mais je suis tombé sur le problème où la largeur de l'image ne s'ajusterait pas avec la largeur du conteneur parent.
Vous pouvez également jouer avec l'arrière-plan de l'élément band
pour simuler ceci
<div class="band"> <div class="contain"> <div class="row"> <div class="col"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> </div> </div> </div> </div>
.band { background: url(https://via.placeholder.com/800x450?text=fpo) calc(50% + 160px) 0/auto 100%, linear-gradient(#ddd,#ddd) center/100% calc(100% - 40px); background-repeat:no-repeat; margin-top: 100px; } .contain { margin: 0 auto; max-width: 600px; } .row { display: flex; flex-flow: row wrap; } .col { width: 50%; } p { padding:40px 20px; }
J'aime ça! Une façon que je n'avais pas envisagée. Cependant, pour l'avenir, cette image pourrait également devenir une vidéo. Je vais devoir l'ajouter à ma boîte à outils malgré tout. Merci!
Autre solution utilisant un positionnement marges négatives et absolu sur l'image:
utiliser des marges négatives pour la compensation de la deuxième colonne,
l'utilisation du positionnement absolu de l'image dans la deuxième colonne garantit que la hauteur est déterminée par la colonne de gauche (car le conteneur row
est une flexbox et align-items: stretch est la valeur par défaut), et
utilisez object-fit: cover
pour conserver les proportions de l'image.
Voir la démo ci-dessous:
<div class="band"> <div class="contain"> <div class="row"> <div class="col"> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> </div> <div class="col col-image"> <img src="https://via.placeholder.com/800x450?text=fpo"> </div> </div> </div> </div>
.band { background-color: #ddd; margin-top: 100px; } .contain { margin: 0 auto; max-width: 600px; } .row { align-content: flex-start; clear: both; display: flex; flex-flow: row wrap; overflow: visible; } .col { width: 50%; } .col-image { margin: -20px 0 -20px 0; /* negative margin */ position: relative; } p { padding: 20px; } img { display: block; height: 100%; width: 100%; object-fit: cover; /* absolute positioning */ position: absolute; top: 0; left: 0; }
@joewindetc violon simplifié pour ce qui précède: jsfiddle.net/xhue8bvw
C'est parfait, exactement ce que je cherchais. Merci beaucoup. Et puis merci pour l'introduction à object-fit
, c'est une nouveauté pour moi.