Вариант
<style>
.podbor {
position: relative;
}
.podbor>input {
padding: 2px 2px 1px 4px;
font-size: 30px;
width: 70px;
height: 40px;
float: left;
border: 1px solid #666;
border-radius: 4px 0 0 4px;
}
.podbor>span {
display: block;
font-size: 18px;
position: absolute;
left: 58px;
margin: 0;
padding: 2px;
line-height: 14px;
width: 14px;
border: 1px solid #666;
background-color: #E4E4E4;
text-align: center;
cursor: pointer;
}
.podbor>.plus {
border-bottom: none;
height: 16px;
}
.podbor>.minus {
top: 20px;
height: 14px;
}
.podbor>span:hover {
background-color: #999;
}
.clear {
clear: both;
}
</style>
<div class="clear"></div>
<div class="podbor" data-min="0" data-max="5">
<input type="text" value="1"/>
<span class="plus">+</span>
<span class="minus">-</span>
</div>
<div class="clear"></div>
<hr>
<div class="clear"></div>
<div class="podbor" data-min="3" data-max="8">
<input type="text" value="3" />
<span class="plus">+</span>
<span class="minus">-</span>
</div>
<script>
(_ => {
[...document.querySelectorAll('.podbor')].forEach(el => el.onclick = ({target, currentTarget}) => {
if (target.tagName !== "SPAN") return;
let inp = currentTarget.childNodes[1], val = +inp.value || +currentTarget.dataset.min || 0;
inp.value = val + {minus: val > +currentTarget.dataset.min ? -1 : 0, plus: val < +currentTarget.dataset.max ? 1: 0}[target.className];
});
})();
</script>