Skip to contentPular para o conteúdo
Get StartedComeçar

The scroll is the timeline.A rolagem é a timeline.

Scroll-linked motion that ships in the Velora stylesheet, driven by the browser's own scroll timeline with no script. Every demo on this page is live, so scroll and watch it move. Two native CSS techniques that sit alongside the core close the page.Movimento ligado à rolagem que já vem na folha de estilo do Velora, conduzido pela própria timeline de rolagem do navegador, sem script. Cada demo desta página é ao vivo: role e veja se mover. Duas técnicas nativas de CSS que acompanham o core fecham a página.

Watch the no-script filmAssista ao filme sem script

A vintage film projector

Scroll as the clock.Rolagem como relógio.

vl-scroll ties a primitive to the scroll position instead of a timer. The element is scrubbed forward while you scroll down and back while you scroll up. Each block below is one value. Cinema zoom, the heavier camera move, is shown on the Cinema page.vl-scroll liga uma primitiva à posição de rolagem em vez de a um timer. O elemento avança enquanto você rola para baixo e volta quando rola para cima. Cada bloco abaixo é um valor. O cinema zoom, o movimento de câmera mais pesado, aparece na página Cinema.

↓ Scroll slowly past each block↓ Role devagar por cada bloco
ExistingExistente
RevealRevelarvl-scroll="reveal"
reveal
ScaleEscalavl-scroll="media-zoom"
media-zoom
CrossfadeCrossfadevl-scroll="crossfade"
crossfade
Depth driftDeriva de profundidadevl-scroll="depth-drift"
depth-drift
RotateRotaçãovl-scroll="rotate-scroll"
rotate-scroll
ParallaxParallaxvl-scroll="parallax"
parallax
CodeCódigo
<div vl-scroll="reveal">…</div>
<div vl-scroll="media-zoom">…</div>
<div vl-scroll="parallax">…</div>

Choose where the motion lives.Escolha onde o movimento vive.

vl-range decides which part of the element's pass through the viewport drives the motion. Every block below is the same reveal. Only the range changes, from a quick entry to the middle of the screen.vl-range decide qual parte da passagem do elemento pela viewport conduz o movimento. Cada bloco abaixo é o mesmo reveal. Só o intervalo muda, de uma entrada rápida até o meio da tela.

↓ Compare when each one finishes↓ Compare quando cada um termina
ExistingExistente
entry-shortvl-range="entry-short"
entry-short
entry 15% → cover 35%
entryvl-range="entry"
entry
entry 0% → entry 100%
entry-longvl-range="entry-long"
entry-long
entry 0% → cover 70%
centervl-range="center"
center
contain 30% → contain 70%
CodeCódigo
<div vl-scroll="reveal" vl-range="entry-short">…</div>
<div vl-scroll="reveal" vl-range="entry">…</div>
<div vl-scroll="reveal" vl-range="entry-long">…</div>

Cards that pile up as you scroll.Cartões que se empilham conforme você rola.

Each card is sticky. The one behind scales down and dims while the next covers it. The index of each card comes from :nth-child, so any number of cards works with no extra markup.Cada cartão é sticky. O de trás diminui e escurece enquanto o próximo o cobre. O índice de cada cartão vem de :nth-child, então qualquer quantidade de cartões funciona sem marcação extra.

↓ Keep scrolling↓ Continue rolando
ExistingExistente
01 · Baseline01 · BaseThe first card anchors the stack.O primeiro cartão ancora a pilha.

It scales back when the second one claims the stage.Ele recua quando o segundo toma o palco.

02 · Layer02 · CamadaThe next card slides over.O próximo cartão desliza por cima.

The one behind retreats while this one settles in.O de trás recua enquanto este se acomoda.

03 · Depth03 · ProfundidadeDepth comes from two variables.A profundidade vem de duas variáveis.

Offset and spread tune how far each card sits from the one before.Deslocamento e abertura ajustam a distância de cada cartão em relação ao anterior.

04 · Rest04 · DescansoThe last card has nothing to push it.O último cartão não tem nada que o empurre.

It stays at full size and the stack clears the viewport.Ele fica em tamanho total e a pilha libera a viewport.

CodeCódigo
<div class="vl-stack-cards">
  <article class="vl-stack-card">
    Card 1
  </article>
  <article class="vl-stack-card">
    Card 2
  </article>
</div>

/* Tune with variables
   --vl-stack-offset
     distance from the top
   --vl-stack-spread
     step between cards
   --vl-stack-scale-to
   --vl-stack-dim-to
     how far the card behind
     retreats */

A shadow that says there is more.Uma sombra que diz que há mais.

The top shadow appears only after you scroll down, and the bottom one disappears at the end. It is four background layers, two of them attached to the content, so no event or observer is needed.A sombra de cima só aparece depois que você rola para baixo, e a de baixo some no fim. São quatro camadas de background, duas delas presas ao conteúdo, então não é preciso evento nem observer.

↓ Scroll inside the box↓ Role dentro da caixa
ExistingExistente

Scroll shadows are a purely visual hint. They add no markup and nothing for a screen reader to announce, so the box stays a plain scrollable region.Sombras de rolagem são só uma dica visual. Não adicionam marcação nem nada para um leitor de tela anunciar, então a caixa continua sendo uma região rolável simples.

The shadow layers are fixed to the box. Two cover layers scroll with the content and hide each shadow exactly when you reach that edge.As camadas de sombra ficam fixas na caixa. Duas camadas de cobertura rolam com o conteúdo e escondem cada sombra exatamente quando você chega àquela borda.

Because the effect lives in the background, it works on any container with overflow, and the size is a single variable: --vl-scroll-shadow-size.Como o efeito vive no background, funciona em qualquer container com overflow, e o tamanho é uma única variável: --vl-scroll-shadow-size.

Keep the region focusable with tabindex="0" and give it a label, so keyboard users can scroll it too.Mantenha a região focável com tabindex="0" e dê a ela um rótulo, para que usuários de teclado também possam rolá-la.

That is the whole technique: gradients, background-attachment and a surface colour to match.Essa é a técnica inteira: gradientes, background-attachment e uma cor de superfície combinando.

Two ways to uncover an image.Duas formas de descobrir uma imagem.

img-reveal opens from the centre with a small scale. wipe-reveal sweeps from the left edge. Both run while the element enters the viewport.img-reveal abre a partir do centro com uma pequena escala. wipe-reveal varre a partir da borda esquerda. Ambos rodam enquanto o elemento entra na viewport.

↓ Scroll through↓ Role por eles
ExistingExistente
An empty cinema auditorium
From the centreA partir do centrovl-effect="img-reveal"
Film lights on a set
From the left edgeA partir da borda esquerdavl-effect="wipe-reveal"

Scroll down, move sideways.Role para baixo, mova para o lado.

The page scrolls vertically and the track slides horizontally. Readers never touch a horizontal scrollbar, and the section pins while it plays. Each panel also turns toward the centre: it lies flat when it is centred and tilts more the farther it is from it.A página rola na vertical e a trilha desliza na horizontal. Ninguém precisa tocar numa barra de rolagem horizontal, e a seção fica fixa enquanto toca. Cada painel também se vira para o centro: fica plano quando está centralizado e inclina mais quanto mais longe dele.

↓ Scroll the page↓ Role a página
ExistingExistentePanel tilt · ProposedInclinação do painel · Proposto
Film lights
01 · Rig01 · Rig
Auditorium
02 · Seats02 · Assentos
Projector
03 · Lens03 · Lente
Detail of a light
04 · Detail04 · Detalhe
CodeCódigo
<section class="vl-horizontal-section" style="--vl-h-travel-end:-60rem">
  <div class="vl-horizontal-section__pin">
    <div class="vl-horizontal-section__track">…panels…</div>
  </div>
</section>
/* --vl-h-travel-end  how far the track slides left
   --vl-h-section-height  scroll distance, 300vh by default */

Two strips, opposite directions.Duas faixas, direções opostas.

Both strips are tied to the page scroll. The top one drifts right while the bottom one drifts left.As duas faixas estão ligadas à rolagem da página. A de cima desliza para a direita enquanto a de baixo desliza para a esquerda.

↓ Scroll the page↓ Role a página
ExistingExistente
CodeCódigo
<div vl-effect="counter-scroll"
     style="--vl-counter-from:-20%; --vl-counter-to:20%">…</div>

Each item arrives on its own.Cada item chega por conta própria.

Every direct child has its own view timeline, so items animate in as each one enters the viewport. There is no shared stagger to maintain.Todo filho direto tem sua própria view timeline, então os itens animam conforme cada um entra na viewport. Não há stagger compartilhado para manter.

↓ Scroll slowly↓ Role devagar
ExistingExistente
  • 01Declare the intentDeclare a intenção
  • 02Name the channelNomeie o canal
  • 03Set the parameterDefina o parâmetro
  • 04Compose the sceneComponha a cena
  • 05Let the browser run itDeixe o navegador executar
CodeCódigo
<ul vl-children="list-enter">
  <li>Item 1</li>
  <li>Item 2</li>
</ul>

One attribute, three moods.Um atributo, três climas.

vl-motion rescales the shared timing, travel and easing tokens for a whole subtree. The markup inside is identical in all three.vl-motion reescala os tokens compartilhados de tempo, deslocamento e easing de toda uma subárvore. A marcação dentro é idêntica nos três.

↓ Scroll through↓ Role por eles
ExistingExistente
Grand and deepGrandioso e profundocinematic
Slower, longer travel.Mais lento, deslocamento maior.

For hero moments.Para momentos de herói.

Quiet and quickCalmo e rápidosubtle
Faster, short travel.Mais rápido, deslocamento curto.

For dense interfaces.Para interfaces densas.

Calm and staticCalmo e estáticostill
Rests in place.Descansa no lugar.

Reduced motion by author choice.Movimento reduzido por escolha do autor.

The engine also honors prefers-reduced-motion for every mode.O motor também respeita prefers-reduced-motion em todos os modos.

CodeCódigo
<section vl-motion="cinematic">…</section>
<section vl-motion="subtle">…</section>
<section vl-motion="still">…</section>

Two browser features worth knowing.Dois recursos do navegador que vale conhecer.

These are plain CSS and HTML, not Velora attributes. They need a recent Chromium and fall back to an instant open and close elsewhere. Shown here as techniques Velora pages can use alongside the core.São CSS e HTML puros, não atributos do Velora. Precisam de um Chromium recente e, nos demais, abrem e fecham instantaneamente. Mostrados aqui como técnicas que páginas Velora podem usar junto com o core.

ExperimentalExperimentalNot Velora coreNão é core do Velora
Popover with enter and exitPopover com entrada e saídapopover + @starting-style
A native panel.Um painel nativo.

Opens with no script. Escape and a click outside close it. This is a popover, not a modal dialog: the page behind stays interactive.Abre sem script. Escape e um clique fora fecham. É um popover, não um diálogo modal: a página de trás continua interativa.

Accordion that animates heightAcordeão que anima a alturadetails + interpolate-size
ArchitectureArquitetura

Only one item opens at a time because the details share a name.Só um item abre por vez porque os details compartilham um nome.

MotionMovimento

The height animates from zero to its content with no measured values.A altura anima de zero até o conteúdo, sem valores medidos.

FallbackFallback

Where unsupported, the panel opens and closes instantly and stays fully usable.Onde não há suporte, o painel abre e fecha instantaneamente e continua totalmente utilizável.

CodeCódigo
:root { interpolate-size: allow-keywords; }
details::details-content { block-size: 0; overflow: clip;
  transition: block-size .4s, content-visibility .4s allow-discrete; }
details[open]::details-content { block-size: auto; }

.panel[popover] { transition: opacity .3s, transform .3s, overlay .3s allow-discrete, display .3s allow-discrete; }
.panel:popover-open { opacity: 1; }
@starting-style { .panel:popover-open { opacity: 0; } }

Both techniques are Chromium-first (Chrome 131 and later for the accordion). Check support before relying on them.As duas técnicas são Chromium primeiro (Chrome 131 ou superior para o acordeão). Verifique o suporte antes de depender delas.

Pages that change like scenes.Páginas que mudam como cenas.

Navigating between pages uses the browser's View Transitions. One attribute on <html> picks the preset, and this site uses velora, diagonal blinds on the Cut angle. No script runs to animate it.A navegação entre páginas usa as View Transitions do navegador. Um atributo em <html> escolhe o preset, e este site usa velora, persianas diagonais no ângulo do Cut. Nenhum script roda para animar.

ExistingExistenteMulti-page onlySó multipágina
Pick one, then use the menu. It applies to this browser session.Escolha uma e depois use o menu. Vale para esta sessão do navegador.
PresetPresetSignatureAssinaturaDuration (old / new)Duração (saída / entrada)StatusStatus
veloraDiagonal blinds open on the Cut angle (--vl-cut-angle, --vl-vt-slice)Persianas diagonais se abrem no ângulo do Cut (--vl-cut-angle, --vl-vt-slice)0.7sDefault · ExperimentalPadrão · Experimental
wipeVertical clip-path curtainCortina vertical com clip-path0.5 / 0.55sIn the distributionNa distribuição
glideHorizontal slide, 8%Slide horizontal, 8%0.48 / 0.52sIn the distributionNa distribuição
irisCircular reveal from the centreRevelação circular a partir do centro0.55 / 0.6sIn the distributionNa distribuição
cinemaBlur, inset frame and brightness liftBlur, moldura interna e brilho0.85 / 0.9sIn the distributionNa distribuição
snapShort move with spring easingMovimento curto com easing de mola0.35 / 0.4sIn the distributionNa distribuição
CodeCódigo
<html vl-page-transition="velora">
<!-- omit the attribute for the Velora default preset -->
<!-- shared elements keep one name across pages -->
<a class="vl-vt-shared-brand">…</a>
<nav class="vl-vt-shared-nav">…</nav>
  • Shared classesClasses compartilhadas vl-vt-shared-hero -media -nav -brand -card
  • Needs a browser with cross-document View Transitions. Elsewhere navigation is instant.Requer um navegador com View Transitions entre documentos. Nos demais, a navegação é instantânea.
  • Reduced motion shortens every transition to 0.12s, linear.Movimento reduzido encurta toda transição para 0,12 s, linear.
  • Not in scope single-page transitions need JavaScript, so they are not zero-runtime and stay outside the core contract.Fora do escopo transições em página única precisam de JavaScript, então não são zero-runtime e ficam fora do contrato do core.

Some things never leave.Algumas coisas nunca saem.

Header, side navigation, a player or a dock should not fade out and back in on every page. Give them a persistence class: the browser captures them as their own layer, so only the page content runs the transition while they stay put.Cabeçalho, navegação lateral, um player ou um dock não devem sumir e voltar a cada página. Dê a eles uma classe de persistência: o navegador os captura como camada própria, então só o conteúdo da página roda a transição enquanto eles ficam no lugar.

ClassClasseRegionRegião
vl-vt-persist-headerSite headerCabeçalho do site
vl-vt-persist-sidebarSide navigationNavegação lateral
vl-vt-persist-dockBottom dock or toolbarDock ou barra de ferramentas inferior
vl-vt-persist-playerMedia playerPlayer de mídia
vl-vt-persist-footerFooter that must not moveRodapé que não deve se mover
  • Rule use one class per region, once per page, and keep the same position and size on every page.Regra use uma classe por região, uma vez por página, e mantenha a mesma posição e tamanho em todas as páginas.
  • What it is a visual guarantee: the region is not cross-faded. It is not the same DOM node, so open menus and focus reset on navigation.O que é uma garantia visual: a região não faz crossfade. Não é o mesmo nó do DOM, então menus abertos e foco são reiniciados na navegação.
  • True no-reload needs single-page routing with JavaScript, which stays outside the zero-runtime core.Sem recarregar de verdade exige roteamento de página única com JavaScript, que fica fora do core zero-runtime.
  • Fallback browsers without cross-document view transitions navigate normally.Fallback navegadores sem view transitions entre documentos navegam normalmente.