160 votes

Changer l'ordre des éléments du bloc avec CSS

Histoire courte

Disons que mon HTML est déjà fixé dans la pierre :

<div id="blockA">Block A</div>
<div id="blockB">Block B</div>
<div id="blockC">Block C</div>

Cela ressemblera à ceci :

------------
| Block A  |
------------
| Block B  |
------------
| Block C  |
------------

Maintenant, je veux changer l'ordre des blocs. Comment puis-je le faire avec seulement CSS ?

------------
| Block C  |
------------
| Block A  |
------------
| Block B  |
------------

Je suis conscient qu'il existe des solutions de fortune comme l'utilisation de position:absolute mais cela ne préserve pas l'utilisation efficace de l'outil de gestion de l'information. display:block propriété. En d'autres termes, les blocs poussent les autres blocs vers le bas lorsqu'ils augmentent en taille.

Longue histoire

Lorsque l'utilisateur utilise un ordinateur pour consulter ma page Web, les blocs sont affichés dans cet ordre :

  1. Informations générales.
  2. Calendrier des événements.
  3. Publicité pour les applications iPhone

La publicité pour l'application iPhone est placée en dernier car elle n'est pas très importante pour les utilisateurs d'ordinateurs. Un faible pourcentage d'utilisateurs d'ordinateurs sortiront leur téléphone et installeront l'application.

Si un utilisateur mobile vient sur ce site, l'annonce de l'application iPhone devrait être la chose la plus importante sur la page. Elle doit donc être déplacée en haut de la page :

  1. Publicité pour les applications iPhone
  2. Informations générales.
  3. Calendrier des événements.

Je voudrais que les utilisateurs de l'iPhone et de l'ordinateur partagent le même code HTML, mais qu'une requête média CSS permette de changer l'ordre des blocs.

@media only screen and (max-device-width: 480px) {
   #blockC {
      /* magic order switching */
   }
}

0 votes

Pourquoi auriez-vous besoin de faire cela avec sólo CSS, si je peux me permettre ?

1 votes

position: absolute ne change pas display: block .

0 votes

Y a-t-il une raison pour laquelle vous voulez faire cela en CSS et non en JavaScript ? Êtes-vous inquiet pour les utilisateurs dont le JavaScript est désactivé ?

152voto

devnull Points 171

Voici un exemple "aussi simple que possible", pour changer l'ordre des éléments div (lors du redimensionnement de la fenêtre du navigateur) :

<!DOCTYPE html>
<html>
  <head>
    <title>foobar</title>
    <style>
      @media screen and (max-width:300px){
        #parent{
          display:flex;
          flex-flow: column;
        }
        #a{order:2;}
        #c{order:1;}
        #b{order:3;}
      }
    </style>
  </head>
  <body>
    <div id="parent">
      <div id="a">one</div>
      <div id="b">two</div>
      <div id="c">three</div>
    </div>
  </body>
</html>

Exemple : http://jsfiddle.net/devnull/qyroxexv/ (changez la largeur de la fenêtre pour voir l'effet du changement de l'ordre des divs)

6 votes

C'est en fait assez magnifique... !

14 votes

Si vous déclarez #c { order: -1; } alors vous n'avez pas besoin de modifier l'ordre de l'option #a y #b .

1 votes

Simple et beau

124voto

thirtydot Points 114021

Comme cela a déjà été suggéré, Flexbox est la solution, notamment parce que vous n'avez besoin que de pour soutenir un seul navigateur moderne : Mobile Safari.

Voir : http://jsfiddle.net/thirtydot/hLUHL/

Vous pouvez retirer le -moz- si vous le souhaitez, je les ai simplement laissés pour les futurs lecteurs.

    #blockContainer {
        display: -webkit-box;
        display: -moz-box;
        display: box;

        -webkit-box-orient: vertical;
        -moz-box-orient: vertical;
        box-orient: vertical;
    }
    #blockA {
        -webkit-box-ordinal-group: 2;
        -moz-box-ordinal-group: 2;
        box-ordinal-group: 2;
    }
    #blockB {
        -webkit-box-ordinal-group: 3;
        -moz-box-ordinal-group: 3;
        box-ordinal-group: 3;
    }

    <div id="blockContainer">
        <div id="blockA">Block A</div>
        <div id="blockB">Block B</div>
        <div id="blockC">Block C</div>
    </div>

13 votes

Espérons que le téléphone Windows 7, avec son IE flippant, ne sera jamais généralisé pour que nous puissions continuer à utiliser des CSS aussi cool.

0 votes

Brillant mais peut être très lent sur les pages complexes

0 votes

@thirtydot merveilleux ! Je n'ai jamais su cela merci beaucoup

39voto

Rubone Points 43

Je sais que c'est vieux, mais j'ai trouvé une solution plus facile et ça marche sur ie10, firefox et chrome :

<div id="wrapper">
  <div id="one">One</div>
  <div id="two">Two</div>
  <div id="three">Three</div>
</div> 

C'est le css :

#wrapper {display:table;}
#one {display:table-footer-group;}
#three {display:table-header-group;}

Et le résultat :

"Three"
"Two"
"One"

Je l'ai trouvé aquí .

2 votes

Très utile pour l'utilisation d'une table !

2voto

fceruti Points 1511
<div id="container">
    <div id="a">Block A</div>
    <div id="b">Block B</div>
    <div id="c">Block C</div>
</div>

disons que la hauteur d'un bloc est de 100px

#container     {position:relative; height: 300px;}
#a, #b, #c     {position:absolute; height: 100px}
#c             {top: 0px;}
#b             {top: 100px;}
#a             {top: 200px;}

4 votes

Je ne veux pas coder en dur les hauteurs. Les éléments à l'intérieur sont dynamiques, donc la hauteur n'est pas connue.

2voto

Red Points 484

Vous pourriez essayer quelque chose de nouveau comme le CSS3 Flexbox . En combinant cela avec des requêtes média, vous devriez atteindre votre objectif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X