Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

3 colunas com flexxbox

<!doctype html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <title>Notícias.com</title>

    <link rel="stylesheet" href="css/estilo.css">
    <link rel="stylesheet" href="css/exercicios.css">
</head>
<body>

    <header class="header">
        <div class="container">

            <h1 class="logo">
                <img src="img/logo.png" alt="Notícias.com">
            </h1>

            <nav class="barra-nav">
                <ul class="menu-principal">
                    <li><a href="noticias.html" class="noticias">Notícias</a>
                    <li><a href="esportes.html" class="esportes">Esportes</a>
                    <li><a href="famosos.html" class="famosos">Famosos</a>
                </ul>

                <form class="busca">
                    <input type="search" id="campo-busca">
                    <button type="submit">Buscar</button>
                </form>
            </nav>
        </div>
    </header>

    <main class="destaques container">

        <div class="secao">
            <section class="column1">    
            <a href="noticia1.html" class="chamada noticias principal">
                <h2>Descoberto mais um esquema de espionagem da NSA</h2>
            </a>
            <a href="noticia2.html" class="chamada noticias normal">
                <h2>Deputado é pego em vídeo pedindo propina</h2>
            </a>
            <a href="noticia3.html" class="chamada noticias normal">
                <h2>Acidente na BR-42 mata 12 da mesma família</h2>
            </a>
            <a href="noticia4.html" class="chamada noticias normal mini">
                <h2>NASA acha indícios de vida em Marte</h2>
            </a>
            <a href="noticia5.html" class="chamada noticias normal mini">
                <h2>Recorde de vendas do Xbox One</h2>
            </a>
            <!--<a href="noticia14.html" class="chamada noticias normal">
                <h2>BC anuncia nova alta nos juros</h2>
            </a>-->
            <a href="noticia11.html" class="chamada famosos normal">
                <img src="img/entretenimento1.jpg" alt="Atriz na praia">
                <h2>Atriz da Globo passeia com filho em Copacabana</h2>
            </a>
            <a href="noticia6.html" class="chamada esportes normal">
                <!-- <h2>Estádios das Olimpíadas estão atrasados</h2> -->
            </a>
        </div>
        </section>

        <div class="secao">
            <section class="column2">
            <a href="noticia7.html" class="chamada esportes normal mini">
                <img src="img/esporte1.jpg" alt="Time perdedor">
                <h2>Time perdedor é rebaixado para Série B</h2>
            </a>
            <a href="noticia8.html" class="chamada esportes normal mini">
                <img src="img/esporte2.jpg" alt="Time vencedor">
                <h2>Time vencedor sobe para Série A da Copa</h2>
            </a>
            <a href="noticia9.html" class="chamada esportes normal">
                <h2>Transferência milionária de craque para a Europa</h2>
            </a>
            <a href="noticia10.html" class="chamada famosos normal">
                <h2>BBB: brothers vão pra piscina</h2>
            </a>
            <a href="noticia12.html" class="chamada famosos normal">
                <h2>Subcelebridade faz algo estúpido para aparecer</h2>
            </a>
            <a href="noticia16.html" class="chamada famosos">
                <h2>Casal de famosos se separa</h2>
            </a>
            <a href="noticia13.html" class="chamada famosos normal">
                <!-- <h2>Novela tem cena decisiva nessa sexta-feira</h2> -->
            </a>
            <a href="noticia15.html" class="chamada esportes">
                <!-- <h2>Jogador é flagrado em festança promíscua</h2> -->
            </a>
            </section>
        </div>

        <div class="secao">
            <section class="column3">
            <a href="video.html" class="tv chamada normal famosos">
                <img src="img/tv1.jpg" alt="Roupão">

                <p>BBB</p>
                <h2>Jeílson usa roupão de bolinhas verdes e é consolado</h2>

                <span class="bolinha"></span>
                <span class="bolinha"></span>
                <span class="bolinha"></span>
            </a>
        </div>
            </section>

    </main>

    <script src="js/menu.js"></script>
</body>
</html>

Gostaria de saber como faço pra deixar as 3 div's com classe "secao" em 3 colunas usando flexbox, alguem ajuda por favor ?

2 respostas
solução!

Bom dia, Nicolas! Tudo certo? =)

Para usar o flexbox, você deve mexer tanto no elemento pai, que terá a declaração do uso de tal propriedade, quanto nos filhos, ou seja, no seu <main>, você deve informar que usará a propriedade flexbox, assim;

main {
    display: flex;
}

Por padrão, o flex se dá da esquerda para direita, então não precisamos utilizar a propriedade flex-direction, mas se quisesse explicitar isso, bastaria adicioná-la no seletor do main:

main {
    display: flex;
    flex-direction: row;
}

Só de curiosidade, os possíveis valores de flex-direction são:

  • row: Os elementos serão posicionados em linha, da esquerda para a direita;
  • row-reverse: Os elementos serão posicionados em linha, mas da direita para a esquerda;
  • column: Os elementos serão posicionados em coluna, de cima para baixo;
  • column-reverse: Os elementos serão posicionados em coluna, mas de baixo para cima.

A ideia é que você quer três colunas, ou seja, se tivéssemos mais do que três elementos, eles deveriam entrar na linha debaixo, então usamos o flex-wrap, para dizer que queremos quebra de linha:

main {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
}

Por padrão, o valor de flex-wrap é nowrap, ou seja, ele não quebra a linha, então precisamos alterá-lo para utilizar o wrap!

Basicamente isso é o que você precisa colocar no elemento pai (<main>), agora vamos fazer algumas alterações nos filhos!

A estrutura que temos é parecida com a que se segue:

<main>
    <div class="secao">...</div>
    <div class="secao">...</div>
    <div class="secao">...</div>
</main>

Agora, a primeira coisa que faremos é informar o quanto de espaço cada um desses elementos poderá ocupar! Se queremos três colunas, podemos falar que a base do tamanho será 30%! Dessa forma, teremos uma folga na largura, assim:

.secao {
    flex-basis: 30%;
}

Aqui vale freezar que a propriedade flex-basis é usada para definir uma base para o tamanho dos elementos!

Em seguida, podemos fazer uso da propriedade flex-grow, que somos nós informando se o elemento possui, ou não, habilidade para crescer e ocupar mais espaço!

.secao {
    flex-basis: 30%;
    flex-grow: 1;
}

Se você for fazendo essas alterações passo-a-passo, vai ver que algumas coisas vão mudar, especialmente nesse último passo. Com flex-grow, os elementos passarão a ocupar 100% da largura do pai, ao invés de 90%, como deveria. Lembre-se, o flex-basis é a base. O flex-grow é a habilidade de "esticar" o elemento.

Para essa última propriedade, podemos passar números inteiros que serão utilizados para dar as proporções para os elementos. Se todos possuem o mesmo valor 1, todos devem ter a mesma largura, sacou? =)

Se você usar o 2, ao invés de 1, em um dos elementos, verá que ele ocupará o dobro do espaço que estava sobrando previamente, ou seja, se tinha 10% sobrando, cada um usaria 3.33%. Passando 2 para um dos elementos e 1, para os dois restantes, o primeiro passará a ocupar 5%, enquanto os outros dois usarão 2.5% cada. =)

Espero ter ajudado, cara!

Mas qualquer dúvida não deixe de postar por aqui para que possamos continuar a ajudá-lo! =)

Abraço e bons estudos,

Fábio

Excelente explicação, ajudou muito. Obrigado Fábio!