Result


選択したグループに該当するアイテムだけが上位にソートされる、という簡易的なもの
Flexboxで並べて、radioボタンで作られたボタンにチェックが入るとorder:-1;が有効化され、上位に表示されます

css

.products__sort {
  display: flex;
  flex-flow: wrap;
}

.products__wrap {
  display: flex;
  flex-flow: wrap;
  margin: 25px 0 0;
}

.products .sort-radio {
  display: none;
}
.products .sort-radio[id="app"]:checked ~ .products__wrap .product[data-product-type="app"] {
  order: -1;
  background-color: #007888;
  color: #fff;
}
.products .sort-radio[id="app"]:checked ~ .products__sort .button[for="app"] {
  background-color: #007888;
}
.products .sort-radio[id="game"]:checked ~ .products__wrap .product[data-product-type="game"] {
  order: -1;
  background-color: #007888;
  color: #fff;
}
.products .sort-radio[id="game"]:checked ~ .products__sort .button[for="game"] {
  background-color: #007888;
}
.products .sort-radio[id="service"]:checked ~ .products__wrap .product[data-product-type="service"] {
  order: -1;
  background-color: #007888;
  color: #fff;
}
.products .sort-radio[id="service"]:checked ~ .products__sort .button[for="service"] {
  background-color: #007888;
}

各ボタンが:checkedの時、.products__wrap以下でdata-product-typeの値が同じアイテムがorder: -1;となる事で上位にソートされます。

html

<div class="products">
  <input class="sort-radio" type="radio" name="sort-radio" id="app"/>
  <input class="sort-radio" type="radio" name="sort-radio" id="game"/>
  <input class="sort-radio" type="radio" name="sort-radio" id="service"/>
  <div class="products__sort">
    <label class="button" for="app">app</label>
    <label class="button" for="game">game</label>
    <label class="button" for="service">service</label>
  </div>
  <div class="products__wrap">
    <div class="product" data-product-type="app">app</div>
    <div class="product" data-product-type="app">app</div>
    <div class="product" data-product-type="game">game</div>
    <div class="product" data-product-type="service">service</div>
    <div class="product" data-product-type="game">game</div>
  ・
  ・
  ・
  ・
</div>

via

Sort Elements with Flexbox (Pure CSS)