Depende se você deseja um campo int ou float. Aqui está a aparência dos dois:
<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">
O campo int possui a validação correta anexada, pois seu mínimo é 1. O campo flutuante aceita 0, no entanto; Para lidar com isso, você pode adicionar mais um validador de restrição :
function checkIsPositive(e) {
const value = parseFloat(e.target.value);
if (e.target.value === "" || value > 0) {
e.target.setCustomValidity("");
} else {
e.target.setCustomValidity("Please select a value that is greater than 0.");
}
}
document.getElementById("float-field").addEventListener("input", checkIsPositive, false);
JSFiddle aqui.
Observe que nenhuma dessas soluções impede completamente o usuário de digitar uma entrada inválida, mas você pode ligar checkValidityoureportValidity descobrir se o usuário digitou uma entrada válida.
Obviamente, você ainda deve ter a validação do lado do servidor porque o usuário sempre pode ignorar a validação do lado do cliente.