É possível desativar a roda de rolagem alterando o número em um campo de entrada de número? Eu mexi com CSS específico do webkit para remover o botão giratório, mas gostaria de me livrar totalmente desse comportamento. Eu gosto de usar type=number
porque traz um bom teclado no iOS.
javascript
css
html
forms
kjs3
fonte
fonte
onscroll
manipulador apenasevent.preventDefault()
com ele?Respostas:
Impedir o comportamento padrão do evento mousewheel em elementos de número de entrada como sugerido por outros (chamar "blur ()" normalmente não seria a maneira preferida de fazer isso, porque não seria o que o usuário deseja).
MAS. Eu evitaria ouvir o evento mousewheel em todos os elementos de número de entrada o tempo todo e só faria isso quando o elemento estiver em foco (é quando o problema existe). Caso contrário, o usuário não pode rolar a página quando o ponteiro do mouse estiver em qualquer lugar sobre um elemento de número de entrada.
Solução para jQuery:
(Delegue eventos de foco para o elemento de formulário circundante - para evitar muitos ouvintes de eventos, que são ruins para o desempenho).
fonte
fonte
Um ouvinte de evento para governar todos eles
Isto é semelhante ao @Simon Perepelitsa 's resposta em js puro, mas um pouco mais simples, já que coloca um ouvinte de evento no elemento documento e verifica se o elemento focalizado é uma entrada de número:
Se você deseja desativar o comportamento de rolagem de valor em alguns campos, mas não em outros, basta fazer isso:
com isso:
Se uma entrada tiver a classe noscroll, ela não mudará na rolagem, caso contrário, tudo permanecerá igual.
Teste aqui com JSFiddle
fonte
wheel
vez demousewheel
. Referência: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event PS. Não sou eu que votei contra.http://jsfiddle.net/bQbDm/2/
Para obter um exemplo de jQuery e uma solução para vários navegadores, consulte a pergunta relacionada:
Listener de evento HTML5 para rolagem de entrada de número - apenas Chrome
fonte
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
usei desfoque em vez de prevenir padrão para não bloquear a página de rolar!live()
está obsoleto. Agora, você deve usaron()
:$(':input[type=number]').on('mousewheel',function(e){ $(this).blur(); });
wheel
vez demousewheel
. Referência: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventVocê pode simplesmente usar o atributo HTML onwheel .
Essa opção não tem efeito na rolagem de outros elementos da página.
E adicionar um ouvinte para todas as entradas não funciona em entradas criadas dinamicamente posteriormente.
Além disso, você pode remover as setas de entrada com CSS.
fonte
onBlur()
não foi o esperado. Eu configurei um simples emreturn false
vez de realmente "não fazer nada na roda".<input type="number" onwheel="return false;">
@Semyon Perepelitsa
Existe uma solução melhor para isso. Desfocar remove o foco da entrada e isso é um efeito colateral que você não deseja. Você deve usar evt.preventDefault em vez disso. Isso evita o comportamento padrão da entrada quando o usuário faz a rolagem. Aqui está o código:
fonte
wheel
vez demousewheel
. Referência: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventPrimeiro, você deve interromper o evento da roda do mouse:
mousewheel.disableScroll
e.preventDefault();
el.blur();
As duas primeiras abordagens param a janela de rolar e a última remove o foco do elemento; ambos são resultados indesejáveis.
Uma solução alternativa é usar
el.blur()
e refocar o elemento após um atraso:fonte
var hadFocus = el.is(':focus');
antes do desfoque e, em seguida, um guarda para definir o tempo limite apenas se hadFocs fosse verdadeiro.As respostas fornecidas não funcionam no Firefox (Quantum). O ouvinte de evento precisa ser alterado da roda do mouse para a roda:
Este código funciona no Firefox Quantum e Chrome.
fonte
Para quem trabalha com React e procura uma solução. Descobri que a maneira mais fácil é usar o prop onWheelCapture no componente de entrada como este:
onWheelCapture={e => { e.target.blur() }}
fonte
Variação datilografada
O typescript precisa saber que você está trabalhando com um HTMLElement para segurança de tipos, caso contrário, você verá muitos
Property 'type' does not exist on type 'Element'
tipos de erros.fonte
Ao tentar resolver isso por mim mesmo, percebi que é realmente possível manter a rolagem da página e o foco da entrada enquanto desativa as alterações de número tentando disparar novamente o evento capturado no elemento pai do
<input type="number"/>
no qual foi capturado , simplesmente assim:No entanto, isso causa um erro no console do navegador e provavelmente não é garantido que funcione em todos os lugares (eu só testei no Firefox), pois é um código intencionalmente inválido.
Outra solução que funciona bem pelo menos no Firefox e no Chromium é fazer temporariamente o
<input>
elementoreadOnly
, assim:Um efeito colateral que observei é que pode fazer com que o campo pisque por uma fração de segundo se você tiver estilos diferentes para os
readOnly
campos, mas, pelo menos no meu caso, isso não parece ser um problema.Da mesma forma, (conforme explicado na resposta de James), em vez de modificar a
readOnly
propriedade, você podeblur()
inserir o campo e depoisfocus()
voltar, mas, novamente, dependendo dos estilos em uso, pode ocorrer alguma oscilação.Como alternativa, conforme mencionado em outros comentários aqui, você pode simplesmente ligar
preventDefault()
para o evento. Supondo que você apenas manipulewheel
eventos em entradas de número que estão em foco e sob o cursor do mouse (é isso que as três condições acima significam), o impacto negativo na experiência do usuário seria quase nulo.fonte
Se você deseja uma solução que não precisa de JavaScript, combinar algumas funcionalidades HTML com um pseudoelemento CSS resolverá o problema:
Isso funciona porque clicar no conteúdo de um
<label>
que está associado a um campo de formulário focalizará o campo. No entanto, a “vidraça” do pseudoelemento sobre o campo impedirá que os eventos da roda do mouse o alcancem.A desvantagem é que os botões giratórios para cima / para baixo não funcionam mais, mas você disse que os removeu mesmo assim.
Em teoria, pode-se restaurar o menu de contexto sem exigir que a entrada seja focada primeiro: os
:hover
estilos não devem ser disparados quando o usuário rola, uma vez que os navegadores evitam recalculá-los durante a rolagem por motivos de desempenho, mas não cruzei totalmente o navegador / dispositivo testei.fonte
fonte
A solução mais fácil é adicionar
onWheel={ event => event.currentTarget.blur() }}
a própria entrada.fonte