Почему setInterval() срабатывает только один раз в манипуляции с DOM элементами

Помогите пожалуйста, задаю через setInterval(), что бы высота бокса изменялась на 50px через одну секунду. Но происходит срабатывание только один раз, элемент растет на 50px один раз и все, остальные инкременты просто игнорируются в стилях. Почему так происходит.

let app = document.querySelector('.box')
let px = 0

setInterval(() => {
  px = px + 50
  app.style.width = app.style.width + px + 'px';
  console.log(app.style.width + px + 'px');
}, 1000)
.box {
  background-color: grey;
}
<div class="box">box</div>


Ответы (2 шт):

Автор решения: Алексей Шиманский

В данном случае строка

app.style.width = app.style.width  + px + 'px'

не особо имеет смысл. достаточно

app.style.width = px + 'px'

let app  = document.querySelector('.box')
let px = 0

setInterval (()=>{
  px = px + 50  
  app.style.width =  px + 'px'
},1000)
.box {
  border: 1px solid black;
  width: 20px;
  height: 20px;
}
<div class="box"></div>


А не происходит дальнейший рост потому, что на первой итерации в app.style.width записывается строка 50px, а на следующей итерации эта строка пытается сложиться (произвести сложение) с числом. Конечно ничего не получится. Нужно перед сложением в таком случае строку привести к числу

let app  = document.querySelector('.box');
let delta = 50;

setInterval (()=>{    
  app.style.width = (parseInt(app.style.width) || 0) + delta + 'px'
},1000)
.box {
  border: 1px solid black;
  width: 20px;
  height: 20px;
}
<div class="box"></div>

→ Ссылка
Автор решения: Михаил Ребров

let app  = document.querySelector('.box')
let px = 0

setInterval (()=>{
  px = px + 50
  app.style.width =  px + 'px'
},1000)
.box{
    background-color: red;
    border: 1px solid blue;
    width:0px;
    height:50px;
}
<div class="box"></div>

→ Ссылка