better percentage based snapping