Estou tentando desativar a barra de rolagem html / body do pai enquanto estou usando uma mesa de luz. A palavra principal aqui é desativar . Eu não quero esconder isso overflow: hidden;
.
A razão para isso é que overflow: hidden
faz o site pular e ocupar a área onde estava o pergaminho.
Quero saber se é possível desativar uma barra de rolagem enquanto a mostra.
javascript
jquery
html
css
Dejan.S
fonte
fonte
Respostas:
Se a página sob a camada superior puder ser "fixa" na parte superior, quando você abrir a sobreposição, poderá definir
você ainda deverá ver a barra de rolagem correta, mas o conteúdo não pode ser rolado. Ao fechar a sobreposição, basta reverter essas propriedades com
Apenas propus essa maneira apenas porque você não precisaria alterar nenhum evento de rolagem
Atualizar
Você também pode fazer uma pequena melhoria: se você obtiver a
document.documentElement.scrollTop
propriedade via javascript imediatamente antes da abertura da camada, poderá atribuir dinamicamente esse valor comotop
propriedade do elemento body: com essa abordagem, a página permanecerá em seu lugar, independentemente de você ' re no topo ou se você já rolou.Css
JS
fonte
$('body').css('top', -($('body').scrollTop()) + 'px').addClass('noscroll');
Quatro pequenas adições à solução selecionada:
Solução completa que parece funcionar para a maioria dos navegadores:
CSS
Desativar rolagem
Ativar rolagem
Agradeço a Fabrizio e Dejan por me colocarem no caminho certo e a Brodingo pela solução para a barra de rolagem dupla
fonte
afterLoad()
eafterClose
retornos de chamada. Pode ser útil para outras pessoas que pesquisam esta pergunta.scrollTop
modo que a linha 2 do código 'Desativar rolagem' possa ser expressa como$( window ).scrollTop()
.if (scrollTop < 0) { scrollTop = 0; }
. Aqui está o código completo para desativar gist.github.com/jayd3e/2eefbbc571cd1668544b .Com o jQuery incluído:
desabilitar
habilitar
uso
fonte
Eu sou o OP
Com a ajuda da resposta do fcalderan, consegui formar uma solução. Deixo minha solução aqui, pois traz clareza sobre como usá-la e adiciona detalhes muito cruciais,
width: 100%;
Eu adiciono esta classe
isso funcionou para mim e eu estava usando o Fancyapp.
fonte
Isso funcionou muito bem para mim ....
basta agrupar essas duas linhas de código com o que decidir quando você vai bloquear a rolagem.
por exemplo
fonte
Você não pode desativar o evento de rolagem, mas pode desativar as ações relacionadas que levam a uma rolagem, como a roda do mouse e o touchmove:
fonte
Você pode ocultar a barra de rolagem do corpo
overflow: hidden
e definir uma margem ao mesmo tempo para que o conteúdo não salte:E você pode adicionar uma barra de rolagem desativada à página para preencher a lacuna:
Fiz exatamente isso para minha própria implementação de lightbox. Parece estar funcionando bem até agora.
fonte
Esta é a solução que escolhemos. Simplesmente salve a posição de rolagem quando a sobreposição for aberta, volte para a posição salva sempre que o usuário tentar rolar a página e desligue o ouvinte quando a sobreposição for fechada.
É um pouco nervoso no IE, mas funciona como um encanto no Firefox / Chrome.
fonte
z-index
de.overlay-shown
ser maior do que o cabeçalho fixo. (Eu tenho esse código em execução na produção em um site com um cabeçalho fixo e ele funciona muito bem.)body
tag. Eu experimentei seu código ontem e tenho um cabeçalho fixo na parte superior da minha página. Se eu manusear a rolagem pelabody
tag, a barra de rolagem estará sob o cabeçalho fixo.$("body")
, estamos usando$(window)
. E em vez dez-index: -1
sobrepor para ocultá-lo, você pode usarvisibility: hidden
ou similar. Veja jsfiddle.net/8p2gfeha para um teste rápido para ver se funciona. O cabeçalho fixo não aparece mais na parte superior da barra de rolagem. Eventualmente, tentarei incorporar essas mudanças na resposta.Eu tive um problema semelhante: um menu à esquerda que, quando aparece, impede a rolagem. Assim que a altura foi ajustada para 100vh, a barra de rolagem desapareceu e o conteúdo saltou para a direita.
Portanto, se você não se importa em manter a barra de rolagem ativada (mas definir a janela para a altura máxima para que ela não role de verdade em qualquer lugar), outra possibilidade é definir uma pequena margem inferior, que manterá as barras de rolagem exibidas:
fonte
overflow:hidden
impede que a margem tenha algum efeito?você pode manter o estouro: oculto, mas gerenciar a posição da rolagem manualmente:
antes de mostrar, mantenha o rastro da posição real de rolagem:
deveria funcionar
fonte
A maneira bruta, mas funcional, será forçar a rolagem de volta ao topo, desativando efetivamente a rolagem:
Quando você abre a mesa de luz, eleve a bandeira e, ao fechá-la, abaixe a bandeira.
Caso de teste ao vivo .
fonte
Eu gosto de me ater ao método "overflow: hidden" e apenas adicionar padding-right que é igual à largura da barra de rolagem.
Obter a função de largura da barra de rolagem, por lostsource .
Ao mostrar a sobreposição, adicione a classe "noscroll" ao html e adicione padding-right ao corpo:
Ao se esconder, remova a classe e o preenchimento:
O estilo noscroll é exatamente isso:
Observe que se você tiver algum elemento com position: fixed, também precisará adicionar o preenchimento a esses elementos.
fonte
<div id="lightbox">
está dentro do<body>
elemento, assim, quando você rola a caixa de luz, também rola o corpo. A solução é não estender o<body>
elemento acima de 100%, colocar o conteúdo longo dentro de outrodiv
elemento e adicionar uma barra de rolagem, se necessário, a essediv
elementooverflow: auto
.Agora, rolar a caixa de luz (e
body
também) não tem efeito, porque o corpo não ultrapassa 100% da altura da tela.fonte
Todos os sistemas baseados em javascript modal / lightbox usam um estouro ao exibir o modal / lightbox, na tag html ou na tag body.
Quando o lightbox é exibido, os js pressionam um estouro oculto no html ou na tag body. Quando o lightbox está oculto, alguns removem o outro oculto, pressionando um transbordamento automático em html ou tag corporal.
Os desenvolvedores que trabalham no Mac não vêem o problema da barra de rolagem.
Apenas substitua o oculto por um unset para não ver o conteúdo deslizando sob o modal de remoção da barra de rolagem.
Caixa de luz aberta / exibida:
Fechar / ocultar a caixa de luz:
fonte
Se a página sob a camada superior puder ser "fixa" na parte superior, quando você abrir a sobreposição, poderá definir
fornecer essa classe ao corpo rolável, você ainda deverá ver a barra de rolagem correta, mas o conteúdo não pode ser rolado.
Para manter a posição da página, faça isso no jquery
Ao fechar a sobreposição, basta reverter essas propriedades com
Apenas propus essa maneira apenas porque você não precisaria alterar nenhum evento de rolagem
fonte
CSS
JS
Agora tudo que você precisa fazer é chamar as funções
fonte
Você pode fazer isso com Javascript:
E desative-o quando sua mesa de luz estiver fechada.
Mas se sua mesa de luz contiver uma barra de rolagem, você não poderá rolar enquanto estiver aberta. Isso ocorre porque
window
contém ambosbody
e#lightbox
. Então você tem que usar uma arquitetura como a seguinte:E, em seguida, aplique o
onscroll
evento apenas em#global
.fonte