Étant donné un modèle où le HTML ne peut pas être modifié en raison d'autres exigences, comment est-il possible d'afficher (réorganiser) un div
au - dessus d'un autre div
alors qu'ils ne sont pas dans cet ordre dans le HTML? Les deux div
s contiennent des données dont la hauteur et la largeur varient.
<div id="wrapper">
<div id="firstDiv">
Content to be below in this situation
</div>
<div id="secondDiv">
Content to be above in this situation
</div>
</div>
Other elements
J'espère qu'il est évident que le résultat souhaité est:
Content to be above in this situation
Content to be below in this situation
Other elements
Lorsque les dimensions sont fixes, il est facile de les positionner là où c'est nécessaire, mais j'ai besoin de quelques idées pour quand le contenu est variable. Pour ce scénario, veuillez simplement considérer la largeur à 100% sur les deux.
Je recherche spécifiquement une solution CSS uniquement (et elle devra probablement être rencontrée avec d'autres solutions si cela ne fonctionne pas).
Il y a d'autres éléments après cela. Une bonne suggestion a été mentionnée étant donné le scénario limité que j'ai démontré - étant donné que cela pourrait être la meilleure réponse, mais je cherche également à m'assurer que les éléments suivants ne sont pas affectés.
img { max-width: 100% }
ne fonctionnera pas à l'intérieur des éléments réorganisés.Une solution CSS uniquement (fonctionne pour IE10 + ) - utilisez Flexbox
order
propriété :Démo: http://jsfiddle.net/hqya7q6o/596/
Plus d'informations: https://developer.mozilla.org/en-US/docs/Web/CSS/order
la source
#flex { display: flex; flex-direction: column; }
affichera des rangées de 100% de largeur. jsfiddle.net/2fcj8s9etransform
un support de navigateur plus largeComme d'autres l'ont dit, ce n'est pas quelque chose que vous voudriez faire en CSS. Vous pouvez le truquer avec un positionnement absolu et des marges étranges, mais ce n'est tout simplement pas une solution robuste. La meilleure option dans votre cas serait de vous tourner vers javascript. Dans jQuery, c'est une tâche très simple:
ou plus génériquement:
la source
Cela peut être fait en utilisant Flexbox.
Créez un conteneur qui applique à la fois display: flex et flex-flow: column-reverse .
Sources:
la source
Il n'y a absolument aucun moyen d'atteindre ce que vous voulez via CSS seul tout en prenant en charge les agents utilisateurs pré-flexbox ( principalement les anciens IE ) - à moins que :
Si ce qui précède est vrai, vous pouvez faire ce que vous voulez en positionnant absolument les éléments -
Encore une fois, si vous ne connaissez pas la hauteur souhaitée pour au moins #firstDiv, il n'y a aucun moyen de faire ce que vous voulez via CSS seul. Si l'un de ces contenus est dynamique, vous devrez utiliser javascript.
la source
Voici une solution:
Mais je soupçonne que vous avez du contenu qui suit la div wrapper ...
la source
Avec le module de mise en page CSS3 flexbox, vous pouvez commander des divs.
la source
Si vous connaissez ou pouvez appliquer la taille de l'élément à être supérieur, vous pouvez utiliser
Dans votre css et donnez aux divs leur position.
sinon javascript semble la seule solution:
ou quelque chose de similaire.
edit: Je viens de trouver ce qui pourrait être utile: w3 document css3 move-to
la source
Les marges supérieures négatives peuvent produire cet effet, mais elles devraient être personnalisées pour chaque page. Par exemple, ce balisage ...
... et ce CSS ...
... vous permettrait de tirer le deuxième paragraphe au-dessus du premier.
Bien sûr, vous devrez modifier manuellement votre CSS pour différentes longueurs de description afin que le paragraphe d'introduction augmente la quantité appropriée, mais si vous avez un contrôle limité sur les autres parties et un contrôle total sur le balisage et le CSS, cela pourrait être une option .
la source
Eh bien, avec un peu de positionnement absolu et un réglage de marge douteux, je peux me rapprocher, mais ce n'est pas parfait ou joli:
Le "margin-top: 4em" est le bit particulièrement méchant: cette marge doit être ajustée en fonction de la quantité de contenu dans le premierDiv. En fonction de vos besoins exacts, cela pourrait être possible, mais j'espère quand même que quelqu'un pourra s'appuyer sur cela pour une solution solide.
Le commentaire d'Eric sur JavaScript devrait probablement être poursuivi.
la source
Cela ne peut être fait qu'avec CSS!
Veuillez vérifier ma réponse à cette question similaire:
https://stackoverflow.com/a/25462829/1077230
Je ne veux pas poster deux fois ma réponse, mais le plus court est que le parent doit devenir un élément flexbox. Par exemple:
(en utilisant uniquement le préfixe du fournisseur de webkit ici.)
Ensuite, permutez les divisions en indiquant leur ordre avec:
la source
Dans votre CSS, faites flotter le premier div à gauche ou à droite. Faites flotter le deuxième div à gauche ou à droite comme le premier. Appliquer
clear: left
ouright
les mêmes que les deux div ci-dessus pour le deuxième div.Par exemple:
la source
Si vous utilisez simplement css, vous pouvez utiliser flex.
la source
Je cherchais un moyen de modifier les ordres des divs uniquement pour la version mobile, alors je peux le styler bien. Grâce à la réponse de Nickf, j'ai pu créer ce morceau de code qui fonctionnait bien pour ce que je voulais, alors j'ai pensé à le partager avec vous:
la source
Une solution avec un support de navigateur plus grand que la flexbox (fonctionne dans IE≥9):
Contrairement à la
display: table;
solution, cette solution fonctionne quand.wrapper
a une quantité d'enfants.la source
Utilisez simplement flex pour le parent div en spécifiant
display: flex
etflex-direction : column
. Ensuite, utilisez l'ordre pour déterminer lequel des enfants div vient en premierla source
CSS ne devrait vraiment pas être utilisé pour restructurer le backend HTML. Cependant, cela est possible si vous connaissez la hauteur des deux éléments impliqués et que vous vous sentez hackish. De plus, la sélection de texte sera gâchée lors du passage entre les divs, mais c'est parce que l'ordre HTML et CSS sont opposés.
Où XXX et YYY sont respectivement les hauteurs de firstDiv et secondDiv. Cela fonctionnera avec les éléments de fin, contrairement à la réponse du haut.
la source
J'ai un bien meilleur code, fait par moi, il est si gros, juste pour montrer les deux choses ... créer un tableau 4x4 et aligner verticalement plus d'une cellule.
Il n'utilise aucun hack IE, pas d'alignement vertical: middle; du tout...
Il n'utilise pas pour le centrage vertical display-table, display: table-rom; affichage: table-cellule;
Il utilise l'astuce d'un conteneur qui a deux divs, un caché (la position n'est pas correcte mais fait que le parent a la bonne taille variable), un visible juste après le caché mais avec top: -50%; il est donc nécessaire de corriger la position.
Voir les classes div qui font l'affaire: BloqueTipoContenedor BloqueTipoContenedor_VerticalmenteCentrado BloqueTipoContenido_VerticalmenteCentrado_Oculto BloqueTipoContenido_VerticalmenteCentrado_Visible
Veuillez m'excuser d'utiliser l'espagnol sur les noms de cours (c'est parce que je parle espagnol et c'est tellement délicat que si j'utilise l'anglais je me perds).
Le code complet:
la source
Un peu tard pour la fête, mais vous pouvez aussi le faire:
la source
Ou définissez une position absolue pour l'élément et travaillez hors des marges en les déclarant à partir du bord de la page plutôt que du bord de l'objet. Utilisez% comme son plus approprié pour les autres tailles d'écran ect. C'est ainsi que j'ai surmonté le problème ... Merci, j'espère que c'est ce que vous cherchez ...
la source
Pour la solution CSS uniquement 1. La hauteur du wrapper doit être fixe ou la hauteur du deuxième div doit être fixe
la source
la source
C'est facile avec css, il suffit d'utiliser
display:block
et dez-index
propriétéVoici un exemple:
HTML:
CSS:
Edit: Il est bon de mettre un peu
background-color
àdiv-s
voir les choses correctement.la source
J'ai un moyen simple de le faire.
la source