Использование HTML и CSS для сокращения заголовка при изменении размера контейнера

#html #css

#HTML #css

Вопрос:

Я создаю календарь событий для веб-сайта, и я хотел бы представить его таким образом, что если размер окна просмотра будет уменьшен, названия дней станут стандартными сокращениями. То есть ‘Sunday’ стало бы ‘Sun’, а затем просто ‘S’, если бы окно просмотра было уменьшено еще больше.

Один из способов, которым я думал подойти к этому, — определить имена и сокращения как классы следующим образом.

 <div class="day">
    <div class="full">Sunday</div>
    <div class="abbr">Sun</div>
    <div class="init">S</div>
</div>
  

Тогда эти элементы могли бы иметь фиксированную ширину, например, так.

 .day .full
{
    width: 100px;
}

.day .abbr
{
    width: 50px;
}
  

Однако я не знаю, может ли этот подход работать, поскольку я не могу представить, как элементы могут быть скрыты из поля зрения в контейнере или как они могут оставаться в центре контейнера.

Кто-нибудь работал с подобным эффектом без использования Javascript? Мне кажется, что механика CSS, вероятно, должна быть способна это сделать, но я не вижу, как.

Заранее благодарю вас.

Ответ №1:

Для достижения этой цели вы можете использовать правила CSS @media . В приведенном ниже случае, если ширина видового экрана составляет 600 пикселей, будут применены стили внутри правила. В вашем случае он скроет полное слово и отобразит аббревиатуру.

Вот ссылка на документацию по нему: CSS @media

 .abbr {
  display: none;
}
.init {
  display: none;
}
@media only screen and (max-width: 600px) { 
  .full {
    display: none;
  }
  .abbr {
    display: block;
  }
}  
 <div class="day">
    <div class="full">Sunday</div>
    <div class="abbr">Sun</div>
    <div class="init">S</div>
</div>  

Ответ №2:

Просто чтобы добавить еще одну возможность, смотрите ниже. Однако предложенный cela вариант более удобен для чтения с экрана (если вы включаете <abbr> элемент в сокращенные версии). Или более популярный (и, как правило, лучший вариант) — просто использовать text-overflow: ellipsis свойство и позволить ему быть гибким. Или другой популярный вариант ux вместо этого.

 @media only screen and (max-width: 767px) {
  div:before {
    content: "S"
  }
}

@media only screen and (min-width: 768px) {
  div:before {
    content: "Sun"
  }
}

@media only screen and (min-width: 992px) {
  div:before {
    content: "Sunday"
  }
}

div { font-size: 5rem }  
 <div>
</div>  

Ответ №3:

Вы не можете редактировать HTML с помощью CSS (к сожалению), но вы можете добавлять содержимое с помощью pseudo-elements , а затем редактировать их с помощью CSS @media query .

Я добавил 7, spans каждый из которых представляет один день недели, и передал им класс .day , чтобы идентифицировать их в моем CSS. Затем я использовал nth-type-of() селектор и добавил правильные заголовки с помощью content:''; свойства в ::after псевдоэлементе, используя a @media query теперь вы можете редактировать эти заголовки так часто, как захотите.

 span.day:nth-of-type(1)::after {
  content: "Monday";
}

span.day:nth-of-type(2)::after {
  content: "Tuesday";
}

span.day:nth-of-type(3)::after {
  content: "Wednesday";
}

span.day:nth-of-type(4)::after {
  content: "Thirstday";
}

span.day:nth-of-type(5)::after {
  content: "Friday";
}

span.day:nth-of-type(6)::after {
  content: "Satturday";
}

span.day:nth-of-type(7)::after {
  content: "Sunday";
}


@media (max-width: 740px) {
  span.day:nth-of-type(1)::after {
    content: "Mo";
  }

  span.day:nth-of-type(2)::after {
    content: "Tu";
  }

  span.day:nth-of-type(3)::after {
    content: "We";
  }

  span.day:nth-of-type(4)::after {
    content: "Th";
  }

  span.day:nth-of-type(5)::after {
    content: "Fr";
  }

  span.day:nth-of-type(6)::after {
    content: "Sa";
  }

  span.day:nth-of-type(7)::after {
    content: "Su";
  }
}  
 <!-- each representing one day of the week -->

<span class="day"></span>
<span class="day"></span>
<span class="day"></span>
<span class="day"></span>
<span class="day"></span>
<span class="day"></span>
<span class="day"></span>  

Ответ №4:

Один из способов, которым эту проблему можно решить без @media правил, — разделить названия дней на их компоненты, затем создать контейнер display: flex и применить flex-wrap: wrap с overflow: hidden помощью.

(В следующем примере кернинг шрифта между прописной и остальной частью слова неестественен, потому что они разделены на разделы, но это можно легко обойти с помощью дополнительного стиля.)

 .day {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  padding: 0 200px;
  height: 60px;
  overflow: hidden;
  background-color: #999f;
}

.day>div {
  text-align: center;
  line-height: 1em;
  font-size: 60px;
  background-color: #dddf;
}  
 <div class="day">
  <div>W</div>
  <div>ed</div>
  <div>nesday</div>
</div>