То, что я изменил в Вашем коде, я выделил комментариями. (в JS и в CSS) (ещё изменил ошибочное употребление transform3d
на transform
)
Осталось Вам только прописать else в случаях упирания в края, чтобы не было таких залипаний как сейчас. Если не понятно, я покажу как сделать.