Charles-Edouard Costeの回答を繰り返すことで、解決策を見つけました。私はSassを使用していますが、最初にそのCSS出力を表示します。
nav .nav-bar .icon {
font-size: 24px;
padding-right: 4px;
}
@media only screen and (max-width: 700px) {
nav .nav-bar li:nth-child(1) .icon-label {
display: none;
}
}
@media only screen and (max-width: 800px) {
nav .nav-bar li:nth-child(2) .icon-label {
display: none;
}
}
@media only screen and (max-width: 900px) {
nav .nav-bar li:nth-child(3) .icon-label {
display: none;
}
}
@media only screen and (max-width: 1000px) {
nav .nav-bar li:nth-child(4) .icon-label {
display: none;
}
}
@media only screen and (max-width: 1100px) {
nav .nav-bar li:nth-child(5) .icon-label {
display: none;
}
}
このソリューションは、100ピクセルのデクリメントごとに1つのラベルを非表示にして機能します。残念ながら、リスト内の要素ごとに新しいルールが必要であるため、スタイルシートのいずれかが必要です。
- リストの長さを正確に知っている、または
- 妥当な最大長まで、潜在的に未使用のディレクティブを含めます。
再利用のためにSassミックスインを作成し、ソースの冗長性を減らすことを選択しました。
@mixin iconlist( $min-width, $label-selector, $step: 100px, $count: 5 )
//
The iconlist() mixin will responsively hide labels,
starting from the last, as the viewport width is decreased.
This can be included in a horizontal list to show only icons
on small screens, while still displaying as many labels as
possible, assuming items are prioritized from most important
to least.
@for $i from 1 through $count
$max-width: $min-width + ( $step * $i )
@media only screen and (max-width: #{$max-width})
li:nth-child(#{$i})
#{$label-selector}
display: none
使用法
.nav-bar
// Responsively hide 0-3 labels from the end of the list.
@include iconlist(600px, '.icon-label', 100px, 3)
誰かがCSSを小さくしたり、より適切に分離したりするリファクタリングを提案したいのであれば、それは素晴らしいことです!しかし、それがどのように行われるのかはわかりません。