recherche

Maison  >  Questions et réponses  >  le corps du texte

Disposition de bureau à 3 colonnes vers mobile à 1 colonne sans requêtes multimédias

Certaines questions sont examinées ici, mais elles ne résolvent pas tout à fait le problème que je recherche.

Supposons que j'ai un site Web et que je le veuille. Sur le bureau, je veux ceci :

C'est facile. grid-template-columns: 重复(3, 33%) (En gros)

Mais sur mobile, je veux ça

Ce que j'ai rencontré s'est produit avant qu'il ne reste une seule colonne :

J'essaie clamp()minmax() et toutes sortes de choses, mais rien ne fonctionne comme je le souhaite. Oui, je pourrais certainement utiliser des requêtes multimédias, mais j'aimerais créer une mise en page grille/flex vraiment fluide en utilisant du CSS moderne (comme clamp, grid, minmax, etc.) afin qu'aucune requête multimédia ne soit nécessaire pour apporter des modifications de mise en page de base. < /p>

Je sais que cela ne fonctionne pas, mais comme point de départ pour les requêtes, voici une version simple d'une de mes 100 tentatives :) Dans cette version, j'essaie de passer de répétition(3) à répétition(1) en utilisant clamp) .

.wrapper {
  display: grid;
  gap: 15px;
  grid-template-columns: repeat(clamp(1, calc(100% - 500px), 3), 33%);
}

.one {
  background: red;
}

.two {
  background: green;
}

.three {
  background: blue;
}
<div class="wrapper">
  <div class="item one"><h3>Example A</h3></div>
  <div class="item two"><h3>Example Two</h3></div>
  <div class="item three"><h3>Third Example</h3></div>
</div>

P粉085689707P粉085689707343 Il y a quelques jours529

répondre à tous(1)je répondrai

  • P粉070918777

    P粉0709187772023-12-24 11:12:44

    Article complet avec des règles plus générales : https://css-tricks.com/responsive-layouts-fewer-media-queries/

    Ceci est utilisé en base flexible max(0px, (400px - 100vw)*1000) 的想法。如果 100vw(屏幕尺寸)大于 400px,则此公式将给出 0px,或者在相反情况下给出一个非常大的值,为每个元素提供一个big flex-basis 并创建一个包装。只需调整 400px 即可扮演 @media (max-width:400px)

    .container {
      display:flex;
      flex-wrap:wrap;
    }
    
    .container div {
      height:100px;
      border:2px solid;
      background:red;
      flex-basis:max(0px, (400px - 100vw)*1000);
      flex-grow:1;
    }
    <div class="container">
      <div></div>
      <div></div>
      <div></div>
    </div>

    En utilisant CSS Grid, cela peut ressembler à ceci :

    .container {
      display:grid;
      grid-template-columns:repeat(auto-fill,minmax(clamp(30%, (400px - 100vw)*1000, 100%),1fr));
      grid-gap:5px;
    }
    
    .container div {
      height:100px;
      border:2px solid;
      background:red;
    }
    <div class="container">
      <div></div>
      <div></div>
      <div></div>
    </div>

    Une question similaire où je contrôle le nombre maximum de colonnes sans requêtes multimédias : Grille CSS - Nombre maximum de colonnes sans requêtes multimédias< /a>


    Nous pouvons étendre la solution ci-dessus pour considérer des cas plus complexes.

    Exemple de passage de 6 colonnes à 3 colonnes à 1 colonne :

    .container {
      display:grid;
      grid-template-columns:
        repeat(auto-fill,
          minmax(clamp(clamp(15%,(800px - 100vw)*1000, 30%), (400px - 100vw)*1000, 100%)
          /* if(screen> 800px) 15% elseif(screen> 400px) 30% else 100% */
          ,1fr));
      grid-gap:5px;
    }
    
    .container div {
      height:100px;
      border:2px solid;
      background:red;
    }
    <div class="container">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>

    Pour comprendre ces valeurs, considérez les plages suivantes :

    100%/7  100%/6  100%/5  100%/4  100%/3  100%/2  100%/1
     14.3%  16.7%    20%     25%     33.3%   50%     100%

    Pour obtenir 6 colonnes dont nous avons besoin ]14.3% 16.7%] 范围内的值(我考虑的是 15%) Pour obtenir 3 colonnes dont nous avons besoin ]25% 33.3%] 范围内的值(我考虑的是 30%)

    Nous évitons simplement les bords pour nous assurer de tenir compte des espaces.

    Une solution plus générale utilisant des variables CSS, où j'ajouterais 0.1% pour m'assurer que la valeur est suffisamment grande pour obtenir le nombre de colonnes souhaité et peut combler les lacunes.

    Nous ajoutons également une coloration dynamique (en relation : Comment changer la couleur d'un

    élément en fonction de sa hauteur ou de sa largeur ? < /a>)

    .container {
      /* first breakpoint*/
      --w1:800px;
      --n1:6;
      /* second breakpoint*/
      --w2:400px;
      --n2:3;
    
      display:grid;
      grid-template-columns:
        repeat(auto-fill,
          minmax(clamp(clamp(100%/(var(--n1) + 1) + 0.1%, (var(--w1) - 100vw)*1000,
                             100%/(var(--n2) + 1) + 0.1%), (var(--w2) - 100vw)*1000,
                             100%), 1fr));
      grid-gap:5px;
      margin:10px 0;
    }
    
    .container div {
      height:100px;
      border:2px solid;
      background:
        linear-gradient(blue  0 0) 0 /1% calc(var(--w2) - 100vw),
        linear-gradient(green 0 0) 0 /1% calc(var(--w1) - 100vw),
        red;
    }
    <div class="container">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
    
    <div class="container" style="--w1:900px;--n1:8;--w2:500px;--n2:4;grid-gap:10px;">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
    
    <div class="container" style="--w1:600px;--n1:4;--n2:2;grid-gap:2vw;">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>

    Avec flexbox, nous pouvons avoir un comportement différent (éventuellement souhaité) où le dernier élément d'une ligne occupera tout l'espace disponible :

    .container {
      /* first breakpoint*/
      --w1:800px;
      --n1:6;
      /* second breakpoint*/
      --w2:400px;
      --n2:3;
    
      display:flex;
      flex-wrap:wrap;
      margin:10px 0;
    }
    
    .container div {
      height:100px;
      border:2px solid;
      margin:5px;
      flex-basis:clamp(clamp(100%/(var(--n1) + 1) + 0.1% ,(var(--w1) - 100vw)*1000, 
                             100%/(var(--n2) + 1) + 0.1%),(var(--w2) - 100vw)*1000, 
                             100%);
      flex-grow:1;
      box-sizing:border-box;
      background:
        linear-gradient(blue  0 0) 0 /1% calc(var(--w2) - 100vw),
        linear-gradient(green 0 0) 0 /1% calc(var(--w1) - 100vw),
        red;
    }
    <div class="container">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
    
    <div class="container" style="--w1:900px;--n1:8;--w2:500px;--n2:4;">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>
    
    <div class="container" style="--w1:600px;--n1:4;--n2:2;">
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
      <div></div>
    </div>

    répondre
    0
  • Annulerrépondre