Используйте свойство transform, для того, чтобы текст кнопки всегда оставался на месте.
Например, если padding у кнопки слева и справа по 25px, а при ховере вы хотите получить padding 30px, то добавляете transform: translateX(-5px). То есть, мы компенсируем разницу в отступе 30-25=5px. Тоже самое, если вы хотите при active получить сужение на 5px – transform: translateX(5px) здесь уже без отрицательного значения.
Пример:
https://jsfiddle.net/sopjb7rn/