<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: frontendfacile.it</title>
    <description>The latest articles on DEV Community by frontendfacile.it (@frontendfacile).</description>
    <link>https://dev.to/frontendfacile</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3986194%2F6a12755f-c390-45ae-8119-a64e94ad2a63.jpg</url>
      <title>DEV Community: frontendfacile.it</title>
      <link>https://dev.to/frontendfacile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frontendfacile"/>
    <language>en</language>
    <item>
      <title>3 pattern CSS per layout moderni (più due “boost” estetici)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Mon, 15 Jun 2026 20:45:20 +0000</pubDate>
      <link>https://dev.to/frontendfacile/3-pattern-css-per-layout-moderni-piu-due-boost-estetici-18pk</link>
      <guid>https://dev.to/frontendfacile/3-pattern-css-per-layout-moderni-piu-due-boost-estetici-18pk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Scroller orizzontali senza JS, griglie che non vanno in overflow e componenti davvero adattivi con le container query.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I pattern di layout più utili sono spesso quelli che ti risolvono problemi ricorrenti con poche righe, senza introdurre complessità (o JavaScript) dove non serve. Qui raccolgo tre soluzioni che uso spesso in progetti reali, con un paio di “upgrade” estetici/funzionali che puoi applicare come progressive enhancement.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Overflow scroller a card con CSS Grid (e scroll snapping)
&lt;/h2&gt;

&lt;p&gt;Lo scenario classico: una lista di card orizzontale che su mobile si sfoglia naturalmente, e su desktop deve restare confinata (senza far scorrere l’intera pagina).&lt;/p&gt;

&lt;h3&gt;
  
  
  Base: Grid che “scorre” in colonne
&lt;/h3&gt;

&lt;p&gt;Puoi farlo con Flexbox, ma con Grid spesso è più comodo perché &lt;strong&gt;il contenitore governa dimensioni e flusso&lt;/strong&gt; in modo molto prevedibile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.scroller&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* invece di riempire righe, crea colonne */&lt;/span&gt;
  &lt;span class="py"&gt;grid-auto-flow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* larghezza “standard” di ogni card/colonna */&lt;/span&gt;
  &lt;span class="py"&gt;grid-auto-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c"&gt;/* lo scorrimento resta nel componente */&lt;/span&gt;
  &lt;span class="nl"&gt;overflow-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;grid-auto-flow: column&lt;/code&gt; è la chiave: cambia il flusso e ti mette gli item “in fila”.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grid-auto-columns&lt;/code&gt; ti evita card con larghezze imprevedibili.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;overflow-x: auto&lt;/code&gt; (o &lt;code&gt;scroll&lt;/code&gt;) confina lo scroll nell’elemento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Upgrade: scroll-snap per un feeling più “UI”
&lt;/h3&gt;

&lt;p&gt;Lo snapping è perfetto per card orizzontali: rende lo scroll più controllato, soprattutto su touch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.scroller&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scroll-snap-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;mandatory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.scroller&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scroll-snap-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* oppure start/end */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note pratiche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mandatory&lt;/code&gt; è più “deciso” (snappa sempre). &lt;code&gt;proximity&lt;/code&gt; è più permissivo.&lt;/li&gt;
&lt;li&gt;Lo snap &lt;strong&gt;non funziona&lt;/strong&gt; se definisci solo &lt;code&gt;scroll-snap-type&lt;/code&gt;: serve anche &lt;code&gt;scroll-snap-align&lt;/code&gt; sui figli.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2) Auto-grid responsive con &lt;code&gt;repeat(auto-fit, minmax())&lt;/code&gt;… senza overflow
&lt;/h2&gt;

&lt;p&gt;Il pattern “auto-grid” è comune: colonne che si aggiungono/tolgono automaticamente e si adattano alla larghezza disponibile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.auto-grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funziona bene… finché non alzi troppo il minimo. Se imposti &lt;code&gt;minmax(400px, 1fr)&lt;/code&gt; e il viewport (o il contenitore) scende sotto 400px, rischi overflow orizzontale.&lt;/p&gt;

&lt;h3&gt;
  
  
  La correzione robusta: &lt;code&gt;min()&lt;/code&gt; dentro il minimo
&lt;/h3&gt;

&lt;p&gt;L’idea è: “non scendere sotto 400px &lt;em&gt;se possibile&lt;/em&gt;, ma se il contenitore è più stretto allora usa 100%”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.auto-grid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--min-col&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;auto-fit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--min-col&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perché funziona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;min(100%, var(--min-col))&lt;/code&gt; sceglie il valore più piccolo.&lt;/li&gt;
&lt;li&gt;Se il contenitore è stretto, il minimo diventa &lt;code&gt;100%&lt;/code&gt; → niente overflow.&lt;/li&gt;
&lt;li&gt;Appena c’è spazio, torna a rispettare &lt;code&gt;--min-col&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È una dichiarazione lunga, ma è un pattern “scrivi una volta, riusa ovunque”: cambi solo &lt;code&gt;--min-col&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Layout davvero adattivi con Container Queries (perfetti per sidebar)
&lt;/h2&gt;

&lt;p&gt;Ci sono componenti che cambiano “personalità” non in base al viewport, ma in base a &lt;strong&gt;dove li metti&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esempio tipico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lo stesso blocco (es. lista di promo) in sidebar è stretto → layout in colonna.&lt;/li&gt;
&lt;li&gt;In una sezione centrale può diventare largo → meglio 3 colonne.&lt;/li&gt;
&lt;li&gt;Riducendo il viewport, quell’area può allargarsi o stringersi in modi non lineari.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con le media query diventa un incastro di breakpoint. Con le &lt;strong&gt;container query&lt;/strong&gt; è diretto: il componente reagisce alla larghezza del suo contenitore.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Definisci un container
&lt;/h3&gt;

&lt;p&gt;Sul wrapper più sensato (spesso l’&lt;code&gt;aside&lt;/code&gt; o la sezione che contiene il componente):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Applica la regola al componente quando &lt;em&gt;il container&lt;/em&gt; supera una soglia
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;500px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.promo-list&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Risultato: lo stesso markup è riusabile e “intelligente” in contesti diversi, senza dipendere dal viewport.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus 1) Angoli “scooped” con &lt;code&gt;corner-shape&lt;/code&gt; (progressive enhancement)
&lt;/h2&gt;

&lt;p&gt;Se vuoi dare un look da “ticket/coupon” a card o pill, puoi combinare &lt;code&gt;border-radius&lt;/code&gt; con &lt;code&gt;corner-shape&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.promo-list&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;corner-shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scoop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dove non supportato, resta semplicemente il &lt;code&gt;border-radius&lt;/code&gt;. Dove supportato, ottieni lo “scavo” agli angoli.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus 2) Rendere lo scroller più “soddisfacente” con animazioni guidate dallo scroll
&lt;/h2&gt;

&lt;p&gt;Un’idea carina per gli scroller orizzontali: far sì che le card &lt;strong&gt;in evidenza&lt;/strong&gt; risultino più grandi/leggibili, mentre quelle ai lati siano leggermente ridotte e più trasparenti.&lt;/p&gt;

&lt;p&gt;Un’impostazione di base (keyframe) può essere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;scroller-focus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%,&lt;/span&gt; &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;.9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;35&lt;/span&gt;&lt;span class="o"&gt;%,&lt;/span&gt; &lt;span class="err"&gt;65&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Questo tipo di effetto dà il meglio con animazioni legate allo scroll (progressive enhancement, perché supporto e dettagli dipendono dalle feature di scroll-driven animations). Se lo applichi, fallo con attenzione: deve migliorare la percezione, non distrarre.&lt;/p&gt;




&lt;h2&gt;
  
  
  In sintesi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scroller orizzontale&lt;/strong&gt;: Grid + &lt;code&gt;grid-auto-flow: column&lt;/code&gt; + &lt;code&gt;grid-auto-columns&lt;/code&gt; + &lt;code&gt;overflow-x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-grid solida&lt;/strong&gt;: &lt;code&gt;minmax(min(100%, --min-col), 1fr)&lt;/code&gt; per evitare overflow sui contenitori stretti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Componenti adattivi&lt;/strong&gt;: container queries per layout che dipendono dal contesto (sidebar vs main).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finiture&lt;/strong&gt;: &lt;code&gt;corner-shape&lt;/code&gt; e animazioni scroll-driven come miglioramenti opzionali.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se vuoi, posso prepararti una mini demo completa (HTML + CSS) con tutti e tre i pattern, pronta da copiare in un CodePen/StackBlitz.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/3-pattern-css-per-layout-moderni-piu-due-boost-estetici" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/3-pattern-css-per-layout-moderni-piu-due-boost-estetici&lt;/a&gt;&lt;/p&gt;

</description>
      <category>scrollsnap</category>
      <category>cssgridautofit</category>
      <category>containerqueries</category>
      <category>overflowscroller</category>
    </item>
  </channel>
</rss>
