AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79563597
Accepted
vespino
vespino
Asked: 2025-04-09 14:17:16 +0800 CST2025-04-09 14:17:16 +0800 CST 2025-04-09 14:17:16 +0800 CST

última linha na grade de imagens

  • 772

Estou usando o seguinte código para criar um álbum (dentro do WordPress, mas para este exemplo isso é irrelevante):

É assim que acontece:

insira a descrição da imagem aqui

O que eu esperava fazer é que as imagens da última linha sempre se estendessem por essa linha. Assim, quando houver apenas uma imagem, deixe-a com 100% de largura e maior em altura, e para duas imagens, com 50% de largura e maior em altura.

O número de imagens é diferente para cada página. Alguma dica de como fazer isso?

.gallery {
  display: grid;
  grid-template-columns: auto auto auto;
  gap: 8px;
}

.gallery>.img {
  width: 100% !important;
  position: relative;
  padding-bottom: 75%;
}

.gallery img {
  object-fit: cover;
  object-position: 50%;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  height: 100%;
  width: 100%;
}
<div class="gallery">
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
  <div class="img">
    <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
  </div>
</div>

html
  • 3 3 respostas
  • 58 Views

3 respostas

  • Voted
  1. Best Answer
    G-Cyrillus
    2025-04-09T17:42:05+08:002025-04-09T17:42:05+08:00

    A partir do seu código, explicado por Temani Afif, você deve começar com um layout de grade de seis colunas, para que os elementos possam abranger um terço, metade ou uma linha inteira.

    O snippet abaixo usa o mesmo método proposto anteriormente usando seu código . O CSS funciona com uma quantidade desconhecida de filhos para contêineres .gallerycom div.imgX.

    Também troquei algumas regras CSS: gridem vez de absolute, e aspect-ratioem vez de padding-bottom. Você pode manter as suas próprias para o dimensionamento e posicionamento, isto é apenas para informação.

    Abaixo, um exemplo de trecho de código que vai de 6 para 1 elemento. A posição dos últimos elementos na grade é filtrada via https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes#tree-structural_pseudo-classes e https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_selectors/Selectors_and_combinators#subsequent-sibling_combinator

    .gallery {
      display: grid;
      grid-template-columns: repeat(6, 1fr); /* mind this one */
      gap: 8px;
    }
    .gallery > .img {
      display: grid;
      aspect-ratio: 3/2;
      grid-column: span 2;/* a third of 6 columns */
    }
    .gallery img {
      object-fit: cover;
      height: 100%;
      width: 100%;
    }
    
    
    /********************************************/
    /* selectors to filter position in the flow */
    /********************************************/
    .gallery > .img:last-child:nth-child(3n + 1) /* standing alone on a row */
    {
      grid-column: span 6; /* 100 % of 6 columns */
    }
    .gallery > .img:nth-last-child(2):first-child,/* first of a serie of only 2 first row */
    .gallery > .img:nth-last-child(2):first-child ~ .img,/* last one of a serie of only 2 first row */
    .gallery > .img:nth-last-child(3):nth-child(3n - 3) ~ .img /* only 2 on the last -row */
    {
      grid-column: span 3; /* 50% of 6 columns */
    }
    /********************************************/
    /******** end filtering position ************/
    /********************************************/
    
    
    /* below CSS is only for the demo purpose, there's no need to mind it */
    /* demo */
    body {
      max-width: 400px;
      margin: auto;
      display: grid;
      gap: 1.6em;
      padding:1.2em;
    }
    .gallery {
      border: solid red 1px;
      counter-reset : gal;
    }
    .img {
      counter-increment:gal
    }
    .gallery::after {
      content:counter(gal) ' element(s)';
    position:absolute;
      translate:-1ch -1.2em;
      color:green;
      font-weight:bolder;
    }
    /* EO demo */
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>
    <div class="gallery">
      <div class="img">
        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
      </div>
    </div>

    • 2
  2. Temani Afif
    2025-04-09T15:40:50+08:002025-04-09T15:40:50+08:00

    Você pode confiar em :nth-childdirecionar imagens específicas

    .container {
      display: grid;
      grid-template-columns: repeat(6,1fr); /* 6 columns and not 3 */
      gap: 5px;
      border: 2px solid red;
      margin: 10px;
    }
    .container img {
      width: 100%;
      grid-column: span 2; /* span 2 cells to get a 3-column layout */
    }
    
    /* if one image is alone in the last row */
    .container img:nth-child(3n + 1):nth-last-child(1) {
      grid-column: span 6;
    }
    /* if two images are in the last row */
    .container img:nth-child(3n + 2):nth-last-child(1),
    .container img:nth-child(3n + 1):nth-last-child(2){
      grid-column: span 3;
    }
    <div class="container">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
    </div>
    <div class="container">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
    </div>
    <div class="container">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
     <img src="https://picsum.photos/id/1/400/200">
    </div>

    • 0
  3. kartik kukadiya
    2025-04-09T14:30:13+08:002025-04-09T14:30:13+08:00
    <?php
    $totalImages = 7; // change this as needed
    $columns = 3; // number of columns in the grid
    $fullRows = floor($totalImages / $columns);
    $remaining = $totalImages % $columns;
    ?>
    <html>
        <head>
            <style>
                .gallery {
                    display: grid;
                    grid-template-columns: repeat(3, 1fr);
                    gap: 8px;
                }
                .gallery > .img {
                    width: 100%;
                    position: relative;
                    padding-bottom: 75%;
                }
                .gallery img {
                    object-fit: cover;
                    object-position: 50%;
                    position: absolute;
                    top: 0;
                    right: 0;
                    bottom: 0;
                    left: 0;
                    height: 100%;
                    width: 100%;
                }
    
                /* Special handling for last row */
                .last-row-1 {
                    grid-column: span 3;
                    padding-bottom: 50%; /* taller image */
                }
                .last-row-2 {
                    grid-column: span 2;
                    padding-bottom: 60%;
                }
                .last-row-2 + .last-row-2 {
                    grid-column: span 1;
                    padding-bottom: 60%;
                }
            </style>
        </head>
        <body>
            <div class="gallery">
                <?php for($i=0; $i<$totalImages; $i++): ?>
                    <?php
                        $class = '';
                        if ($i >= $fullRows * $columns) {
                            // This image is in the last (incomplete) row
                            if ($remaining == 1) {
                                $class = 'last-row-1';
                            } elseif ($remaining == 2) {
                                $class = 'last-row-2';
                            }
                        }
                    ?>
                    <div class="img <?= $class ?>">
                        <img src="https://fastly.picsum.photos/id/266/200/300.jpg?hmac=nAZYC6vsnq4fuOzfge00Ylvi9ALRMbMA8wxBxIPTjs0">
                    </div>
                <?php endfor; ?>
            </div>
        </body>
    </html>
    

    Como funciona

    A grade tem 3 colunas.

    A lógica do PHP calcula quantas imagens estão na última linha ($remaining).

    Com base nisso, atribuímos uma classe personalizada às imagens da última linha.

    Em CSS, usamos grid-column: span X para fazer com que as imagens da última linha ocupem a linha inteira (para 1 imagem) ou metade (para 2 imagens).

    Também ajustamos o preenchimento inferior para torná-los mais altos e proporcionar equilíbrio visual.

    • -1

relate perguntas

  • Usando o ponto de código para renderizar o ícone delineado em vez de preenchido no Material Design Google Fonts

  • Como fazer tab como uma forma de seta usando css

  • Desenhando linhas inclinadas dentro da tabela em html e css

  • Tabela HTML com 2 linhas de células seguidas

  • Como criar material angular mat-grid-list

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve