You need to establish a flex formatting context.
This is the same as establishing a block formatting context, except
  that flex layout is used instead of block layout.
For properties like flex-basis, flex-grow, flex-shrink to work, an element must participate in the flex formatting context.
A flex item establishes a new formatting context for its contents. The
  type of this formatting context is determined by its display value, as
  usual. However, flex items themselves are flex-level boxes, not
  block-level boxes: they participate in their container’s flex
  formatting context, not in a block formatting context.
var el = document.querySelector("input");
console.log("input width: " + el.offsetWidth + "px");
.flex-container {  /* Flex formatting context, this makes the element a flex container */
  display: flex;
}
input {  /* Direct children of flex containers are now flex items */
  background-color: black;
  flex: 0 1 450px;
  box-sizing: border-box;
}
<section class="flex-container">
  <input type="text" />
</section>
 
 
Revised jsFiddle
Source: W3C CSS Flexible Box Layout Module Level 1