Vì flexbox chỉ dùng để sắp xếp các elements thành 1 hàng ngang hay 1 hàng dọc thôi. Chiều dọc hàng ngang (hàng dọc) bằng height lớn nhất (width) trong các element trong cùng 1 hàng ngang (hàng dọc).
Ví dụ, Box 1 có height là 80px, Box 2 có 100px, Box 3 có 90px. Nếu wrapper không sử dụng padding, hay các box1, box2 và box3 không có margin. wrapper chỉ có 1 hàng ngang, height của wrapper sẽ là 100px.
Cách bạn làm là cho box1 có display là absolute, tách vị trí box1 khỏi sắp xếp của flexbox. Vì vậy box2, box3, box4 đều có 1 row riêng cho nó. Nếu bạn dùng inspector thì box2 bắt đầu từ left của wrapper đến right của wrapper, nhưng do box 1 che mất nên chỉ thấy phần bên phải của nó thôi. Vị trí của box2 không tự nhiên.
Nếu dùng flexbox cho case 2, mình dùng tới 3 flex. 1 flexbox cho 2, 3 theo column direction. Flex thứ 2 cho 1 và (2,3) theo row direction. Flex cuối cùng cho (1,2,3) và 4 theo column direction.
Tóm lại, flexbox chỉ phù hợp cho dàn trải element 1 hàng ngang hay 1 hàng dọc, còn phân phối theo không gian 2 chiều không phải là mục đích thiết kế ban đầu của flexbox. Nên flexbox chỉ phù hợp với case 1 và case 3, còn case 2 không xử lý được.
P/s: mình không phải fan dùng CSS framework hay atomic design.