SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
08.03.2025

Desabilitando a Rolagem Sem Ocultar: Uma Solução CSS

Resposta Rápida

Para desabilitar a rolagem da página sem esconder a barra de rolagem, aplique as seguintes propriedades CSS. Defina overflow-y para um valor que mantenha a barra de rolagem visível e defina position para fixar a posição da página. Ajuste o deslocamento do conteúdo utilizando padding-right e use top para manter a posição de rolagem atual do usuário:

body.no-scroll {
  overflow-y: scroll; /* Permite que a barra de rolagem fique visível */
  position: fixed; /* Impede a rolagem da página */
  width: 100%; /* Fixa a largura da página */
  top: calc(-1 * var(--scroll-position)); /* Lembra a posição da rolagem */
}

Para bloquear a rolagem, adicione a classe .no-scroll à tag <body>.

Antes de adicionar a classe "no-scroll", lembre-se da posição de rolagem atual:

const scrollY = window.scrollY || document.documentElement.scrollTop;
document.documentElement.style.setProperty('--scroll-position', `${scrollY}px`);
document.body.classList.add('no-scroll'); /* Pausa a rolagem */

Para retomar a rolagem, remova a classe e restaure a posição de rolagem:

const scrollY = document.documentElement.style.getPropertyValue('--scroll-position');
document.documentElement.style.removeProperty('--scroll-position');
window.scrollTo(0, parseInt(scrollY || '0'));
document.body.classList.remove('no-scroll'); /* Retoma a rolagem */

Como resultado dessas ações, deslocamentos visuais e a perda da posição de rolagem atual são evitados, garantindo uma experiência de usuário confortável.

Prevenindo Deslocamentos de Layout

Para eliminar deslocamentos de conteúdo ao bloquear a rolagem, siga estas etapas:

1. Defina a largura do `<body>` como `width: 100%` ao usar `position: fixed` para manter o layout estável.
2. Use a propriedade `inline-size` para garantir largura consistente em diferentes navegadores.
3. Utilize variáveis CSS para ajustes dinâmicos de largura.
4. Aborde a questão das **duplas barras de rolagem** e implemente media queries e outras sugestões da comunidade.

Verifique a presença de uma barra de rolagem vertical:

const hasVerticalScrollbar = document.body.scrollHeight > window.innerHeight;
if (hasVerticalScrollbar) {
  // Aplica o método "no-scroll"
}

Melhorando a Usabilidade

  • Lembre-se da posição de rolagem antes de bloquear e restaure-a depois para uma navegação sem interrupções.
  • Ajuste a suavidade da rolagem usando a propriedade CSS scroll-behavior: smooth; ou utilize métodos JavaScript descritos na SitePoint.

Dicas jQuery

É jQuery sua opção preferida? Aqui está o código para gerenciar a rolagem:

$.fn.disableScroll = function() {
  this.each(function() {
    const scrollTop = $(window).scrollTop();
    $(this).css({
      overflow: 'scroll',
      position: 'fixed',
      width: '100%',
      top: `-${scrollTop}px` /* Lembra a posição de rolagem */
    });
  });
};

$.fn.enableScroll = function() {
  const scrollY = this.css('top');
  this.css({
    overflow: '',
    position: '',
    top: '',
    width: ''
  });
  $('html, body').scrollTop(-parseInt(scrollY || '0')); /* Retoma a rolagem */
};

$('body').disableScroll(); /* Pausa a rolagem */
$('body').enableScroll(); /* Retoma a rolagem */

Não esqueça de tratar eventos e a capacidade de desativá-los usando o método .off() no jQuery.

Visualização

Imagine que seu site é uma galeria 🖼️, e o vidro é o elemento sendo rolado pelo usuário.

  • Os visitantes podem VER as obras (🖼️1️⃣ 🖼️2️⃣ 🖼️3️⃣), mas devido ao vidro, eles não conseguem movê-las.
  • A barra de rolagem, por sua vez, é o pegador que pode mover a visualização para cima e para baixo.
Quando você desabilita a rolagem enquanto a mantém visível:
- Mantenha o vidro **INTEIRO** e **TRANSPARENTE**, mas faça-o **IMÓVEL** (🔒🖼️).
- Assim, os visitantes podem **VER** o pegador (barra de rolagem), mas não podem usá-lo.

Essa metáfora ajuda a entender como desabilitar a rolagem funciona sem remover a barra de rolagem.

| Ação                        | Galeria Virtual 🖼️ |
| --------------------------- | ------------------- |
| Visibilidade da barra       | Vidro transparente ✅ |
| Capacidade de rolar        | Vidro bloqueado 🔒   |

Fique atento a exemplos bem-sucedidos, como sobreposições na biblioteca Fancyapp. Aproveite a experiência da comunidade e adapte-a às especificidades de vários navegadores.

Recursos Úteis

  1. css - Como desabilitar programaticamente a rolagem da página com jQuery - Stack Overflow — Discussão no Stack Overflow sobre como parar a rolagem.
  2. overflow - CSS: Folhas de Estilo em Cascata | MDN — Guia da MDN sobre a propriedade CSS overflow.
  3. pointer-events | CSS-Tricks — Artigo sobre como controlar interações com elementos através de pointer-events.
  4. CSS Layout - A Propriedade position — Uma explicação útil da propriedade position: fixed e seu uso para bloquear a rolagem no W3Schools.
  5. Estilizando Barras de Rolagem | WebKit — Personalizando o design da barra de rolagem em navegadores que usam o motor WebKit.
  6. Prevenir a Rolagem da Página Quando um Modal Está Aberto | CSS-Tricks — Método da CSS-Tricks para parar a rolagem enquanto se trabalha com modais.
  7. Como Implementar Rolagem Suave em Vanilla JavaScript — SitePoint — Dicas e técnicas do SitePoint para conseguir uma rolagem suave da página em JavaScript.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!