Extra requirement: the list must be no more than a certain fixed height, and scroll vertically to fit within it.
Set display: flex and flex-flow: column on the <ul>, and set the list items which need to appear at the top to order: 1 and the others to order: 2.
Note that the fixed-height-list requirement screws up flexbox, which does its best to fit all the flexed items into the fixed height rather than overflowing and scrolling. To avoid this, we need to set flex-shrink to 0 on the list items.
Set display: table on the <ul> and then display: table-header-group on the list-items to appear at the top, and display: table-row-group on the others. Note: this doesn't work; it seems that you can't intermingle "top" rows and "body" rows in a "table" this way. The first "header row" goes to the top of the list; others do not, presumably because a table's header rows are considered one header if they are adjacent in the code.