Implementação de Barra de Navegação Estilo Jianshu com CSS Flexbox

Este guia demonstra como criar uma barra de navegação moderna e funcional, inspirada no design da plataforma Jianshu, utilizando HTML5 e CSS3. O foco principal é o uso de Flexbox para o layout e transições suaves para elementos interativos, como a barra de busca e menus suspensos.

Estrutura de Estilziação (CSS)

O CSS abaixo define o layout fixo no topo, o comportamento responsivo básico e os efeitos de hover. Utilizamos flexbox para distribuir os elementos entre o logotipo, a navegação centralizada e os botões de ação à direita.


/* Reset básico e configurações globais */
* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

ul, li {
    list-style: none;
}

a {
    text-decoration: none;
    color: inherit;
}

.centro-flex {
    display: flex;
    justify-content: center;
    align-items: center;
}

/* Header Fixo */
#navbar-principal {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 58px;
    background-color: #fff;
    border-bottom: 1px solid #f0f0f0;
    z-index: 1000;
}

.container-nav {
    max-width: 1440px;
    min-width: 768px;
    margin: 0 auto;
    height: 100%;
    display: flex;
    justify-content: space-between;
    padding: 0 15px;
}

.logo-link img {
    height: 100%;
    padding: 10px 0;
}

/* Área de Busca e Links de Navegação */
.wrapper-centro {
    flex: 1;
    display: flex;
    margin-left: 50px;
}

.lista-links {
    display: flex;
    height: 100%;
}

.item-link {
    padding: 0 20px;
    transition: background 0.2s;
    cursor: pointer;
}

.item-link:hover {
    background-color: #f5f5f5;
}

.item-link span {
    margin-left: 8px;
    font-size: 17px;
}

/* Busca Dinâmica */
.secao-busca {
    align-self: center;
    margin-left: 20px;
    position: relative;
}

.secao-busca input {
    background-color: #eee;
    border: 1px solid #eee;
    border-radius: 20px;
    height: 38px;
    padding: 0 40px 0 20px;
    width: 160px;
    transition: width 0.4s ease-in-out;
    outline: none;
}

.secao-busca input:focus {
    width: 260px;
}

.icon-lupa {
    position: absolute;
    right: 12px;
    top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
}

/* Botões e Perfil do Usuário */
.acoes-usuario {
    display: flex;
    align-items: center;
}

.btn-publicar {
    background-color: #ea6f5a;
    color: #fff;
    width: 100px;
    height: 40px;
    border-radius: 20px;
    margin-left: 15px;
    font-weight: 400;
}

.perfil-dropdown {
    position: relative;
    margin: 0 20px;
}

.avatar-img {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    border: 1px solid #ddd;
}

.menu-suspenso {
    display: none;
    position: absolute;
    top: 100%;
    right: 0;
    background: #fff;
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
    border-radius: 4px;
    padding: 5px 0;
    min-width: 160px;
}

.perfil-dropdown:hover .menu-suspenso {
    display: block;
}

.menu-suspenso li a {
    display: block;
    padding: 10px 20px;
    font-size: 14px;
}

.menu-suspenso li a:hover {
    background-color: #f8f8f8;
}

Estrutura de Marcação (HTML)

Abaixo está o esqueleto HTML que utiliza as classes CSS definidas acima. Note o uso de SVGs embuitdos para manter a fidelidade visual sem depender de bibliotecas externas de ícones.


<header id="navbar-principal">
    <nav class="container-nav">
        <!-- Logotipo -->
        <a href="/" class="logo-link">
            <img src="https://cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png" alt="Logo">
        </a>

        <div class="wrapper-centro">
            <ul class="lista-links">
                <li class="item-link centro-flex">
                    <svg width="20" height="20" viewBox="0 0 1024 1024"><path d="M513.1 951.2c-9.3 0-18.1-0.6-27.4-1.2h-1.7c-43.1-2.9-84.5-11.7-122.9-25.6-121.2-46.6-208-131.1-257.5-251.1-15.7-39.6-25.6-81.6-29.1-125.2 0-2.3-0.6-4.7-0.6-7s-0.6-5.2-0.6-8.2l-0.6-7v-27.4l0.6-5.8c0-3.5 0.6-7 1.2-10.5 0.6-3.5 1.2-7.6 1.2-11.1 0.6-3.5 0.6-6.4 1.2-9.9 1.2-12.2 2.3-25.6 5.2-37.9 14-69.3 43.7-131.7 87.4-185.8 47.2-58.8 107.2-103.7 177.1-132.2 41.9-17.5 86.2-28 131.1-30.9 2.9-0.6 5.2-0.6 8.2-0.6 2.3 0 5.2-0.6 7.6-0.6l7-0.6h29.1c1.2 0 1.7 0.6 2.3 0.6 40.8 1.7 79.8 8.7 117.1 21 81 26.8 149.1 73.4 202.7 138.6 57.1 69.3 90.3 150.3 98.4 240.6 3.5 43.7 1.2 85.6-7 125.2-8.7 46-26.2 92-51.8 136.3-41.9 70.5-99 125.8-170.1 164.3-65.8 34.4-135.7 51.8-208 51.8z" fill="#ea6f5a"></path></svg>
                    <span>Descobrir</span>
                </li>
                <li class="item-link centro-flex">
                    <span>Mensagens</span>
                </li>
            </ul>

            <div class="secao-busca">
                <form>
                    <input type="text" placeholder="Pesquisar...">
                    <span class="icon-lupa">🔍</span>
                </form>
            </div>
        </div>

        <div class="acoes-usuario">
            <div class="perfil-dropdown">
                <a href="#">
                    <img class="avatar-img" src="http://upload.jianshu.io/users/upload_avatars/6481861/35e9a803-bcdc-477f-ac76-79ff2697f7fd.jpg" alt="Avatar">
                </a>
                <ul class="menu-suspenso">
                    <li><a href="#">Meu Perfil</a></li>
                    <li><a href="#">Favoritos</a></li>
                    <li><a href="#">Configurações</a></li>
                    <hr>
                    <li><a href="#">Sair</a></li>
                </ul>
            </div>
            <a href="#" class="btn-publicar centro-flex">Escrever</a>
        </div>
    </nav>
</header>

Funcionalidades Implementadas

  • Barra de Busca Inteligente: Ao receber foco, o campo de entrada expande sua largura suavemente através de transition: width.
  • Menu Dropdown: O menu de usuário é controlado via CSS :hover, exibindo opções extras quando o mouse passa sobre a imagem de perfil.
  • Layout Flexível: O uso de flex: 1 no container central garante que a busca e os links ocupem o espaço disponível de forma dinâmica.
  • Posicionamento Fixo: A barra permanece visível no topo da página (position: fixed) durante a rolagem.

Tags: CSS3 html5 Flexbox Web Design front-end

Publicado em 7-15 07:32