Comment modifier l'ordre des éléments sans modifier le code html?

ce sont 3 inline-block et les éléments qui signifie qu'ils seront rangés les uns à côté des autres.

Voici un violon pour tout voir en live: https://jsfiddle.net/8mdm8eox/

.wrapper {
  background: #fff;
  width: 100%
}

.firstElement,
.secondElement,
.thirdElement {
  display: inline-block;
  width: calc(100%/3)
}

.firstElement {
  background: #000;
  color: #fff
}

.secondElement {
  background: grey
}

.thirdElement {
  background: #ddd
}

@media (max-width: 767px) {}
<div class="wrapper">
  <div class="firstElement">First Element</div>
  <div class="secondElement">Second Element</div>
  <div class="thirdElement">Third Element</div>
</div>

alors voici ce que je veux, je veux quand la largeur de l'écran est de 767px ou moins:

@media (max-width: 767px){}

les deux premiers éléments sont ordonnés verticalement et le troisième est ordonné horizontalement avec les deux autres éléments, de sorte qu'ils devenir de la forme:

   _______________    ________________
   |First Element|    |ٍ              |
   _______________    |              |  
                      |Third Element |
   ________________   |              |
   |Second Element|   |              |
   _________________  _______________

ne vous inquiétez pas pour le troisième élément , le texte sera cassé , je veux juste que les deux premiers éléments ressemblent à ça sans changer le html.

10
demandé sur Dhaval Jardosh 2018-05-22 23:39:06

5 réponses

il y a plusieurs façons de réorganiser vos éléments sans modifier le HTML.

CSS flexbox fournit le order propriété. Cependant, flex peut ne pas être une bonne option pour vous puisque vous voulez qu'un élément Couvre deux rangées. Les problèmes que vous pourriez rencontrer sont discutés ici:

la disposition de la grille CSS, cependant, offre beaucoup de bonnes solutions à votre problème. order la propriété est aussi disponible ici, mais ce n'est pas nécessaire.

Voici une solution en utilisant le grid-template-areas propriété.

.wrapper {
  display: grid;
  grid-gap: 5px;
  grid-template-areas: "first second third";
}

.firstElement {
  grid-area: first;
  background: #000;
  color: #fff
}

.secondElement {
  grid-area: second;
  background: grey
}

.thirdElement {
  grid-area: third;
  background: #ddd
}

@media (max-width: 767px) {
  .wrapper {
    grid-template-areas: "first third" 
                         "second third";
  }
<div class="wrapper">
  <div class="firstElement">First Element</div>
  <div class="secondElement">Second Element</div>
  <div class="thirdElement">Third Element</div>
</div>

jsFiddle démo

prise en charge du navigateur pour CSS Grid.

5
répondu Michael_B 2018-05-22 21:10:26

Vous devez utiliser flex-wrap sur le .wrapper et order sur les enfants.

.wrapper {
  max-width: calc(100%/2);  //Just to keep your original width intact
  display: flex;
  flex-wrap:wrap;
}

.firstElement, .secondElement, .thirdElement{
    min-width:50%; //This will force your width to 50% of your wrapper class
}
.firstElement{ order: 1;}
.secondElement{ order: 2;}
.thirdElement{ order: 3;}

.wrapper {
  background: #fff;
  max-width: calc(100%/2);
  display: flex;
  flex-wrap: wrap;
}

.firstElement,
.secondElement,
.thirdElement {
  display: inline-block;
  min-width: 50%
}

.firstElement {
  background: #000;
  color: #fff;
  order: 1;
}

.secondElement {
  background: grey;
  order: 3;
}

.thirdElement {
  background: #ddd;
  order: 2;
}

@media (max-width: 767px) {}
<div class="wrapper">
  <div class="firstElement">First Element</div>
  <div class="secondElement">Second Element</div>
  <div class="thirdElement">Third Element</div>
</div>
1
répondu Dhaval Jardosh 2018-05-22 20:45:27

si vous ne voulez pas utiliser flex, les propriétés table-layout peuvent vous aider .

jouer avec https://codepen.io/gc-nomade/pen/yjrOJJ ou exécutez simplement la démo ci-dessous.

.wrapper {
  background: #fff;
  width: 100%;
}

.firstElement,
.secondElement,
.thirdElement {
  display: inline-block;
  min-width: 33%;/* will be usefull for the mediaquerie . tune to your own value / needs */
  margin: 0.11%;/* if ever needed */
}

.firstElement {
  background: #000;
  color: #fff;
}

.secondElement {
  background: grey;
}

.thirdElement {
  background: rgba(0, 0, 0, 0.3);
}

@media (max-width: 767px) {
  .wrapper {
    display: table;/* trigger the table-layout */
  }
  .a {
    display: block;
    margin: 2px;
  }
  .b {
    display: table-cell;/* make this one only acting as a cell aside previous */
  }
}
<div class="wrapper">
  <div class="firstElement a">First Element</div><!-- comment to override inline-block side effect 
  --><div class="secondElement a">Second Element</div><!--
  --><div class="thirdElement b">Third Element</div>
</div>

pour de vrai réorganiser, flex ou grid le fera à l'intérieur de n'importe quelle quantité d'enfants.

les propriétés table-layout permettent cet effet visuel sur une seule ligne mais fonctionne avec les anciens navigateurs.

0
répondu G-Cyr 2018-05-22 21:07:05

puisque la question n'est pas étiquetée avec flex ou new tech, ni incluse dans le code source, c'est une solution reflétant que:

*s'il vous Plaît noter, j'ai changé la largeur des éléments à 100%/3.1 pour l'effet visuel, vous pouvez le modifier pour l'adapter à vos besoins.

.wrapper {
  background: #fff;
  position: relative;
  width: 100%;
  height: 500px;
}

.firstElement,
.secondElement,
.thirdElement {
  display: inline-block;
  width: calc(100%/3.1)
}

.firstElement {
  background: #000;
  color: #fff;
  height: 33%;
}

.secondElement {
  background: grey;
  height: 33%
}

.thirdElement {
  background: #ddd;
  height: 33%
}

@media (max-width: 767px) {
  .firstElement, .secondElement, .thirdElement {
    width: 50%;
  }
  .firstElement {
    float: left;
  }
  .secondElement {
    position: absolute;
    left: 0;
    bottom: 0;
  }
  .thirdElement {
    float: left;
    height: 100%;
  }
}
<div class="wrapper">
  <div class="firstElement">First Element</div>
  <div class="secondElement">Second Element</div>
  <div class="thirdElement">Third Element</div>
</div>

essentiellement, faire l'emballage position parent nous donne la liberté de positionnement absolu à l'intérieur de lui pour les enfants. Nous pouvons profiter de cette

0
répondu soulshined 2018-05-22 21:10:53

Vous pouvez le faire facilement avec l' positionnement, qui a un grand support, et éventuellement combiné avec le variables CSS, dont le soutien augmente et n'est pas petit:

:root {
  --firstElementHeight: 50px; /* adjust */
  --secondElementHeight: 50px; /* adjust */
  --thirdElementHeight: calc(var(--firstElementHeight) + var(--secondElementHeight)); /* the sum of other siblings heights so that the "columns" always match */
}

.firstElement,
.secondElement,
.thirdElement {display: inline-block; width: 33.33%}

.firstElement {background: #000; color: #fff}
.secondElement {background: grey}
.thirdElement {background: #ddd}

@media (max-width: 767px) {
  .wrapper {position: relative}
  .firstElement {height: var(--firstElementHeight)}
  .secondElement {height: var(--secondElementHeight); position: absolute; left: 0; top: var(--firstElementHeight)} /* moved down by the height of the .firstElement */
  .thirdElement {height: var(--thirdElementHeight)}
}
<div class="wrapper">
  <div class="firstElement">First Element</div>
  <div class="secondElement">Second Element</div>
  <div class="thirdElement">Third Element</div>
</div>

Même sans variables CSS, le positionnement la solution est assez simple et fiable.

0
répondu VXp 2018-09-17 20:43:10