Условный css — наведение — переполнение

Я хочу скрыть текст, когда он слишком длинный, и показывать его при наведении на него курсора.

Проблема в том, что он также срабатывает, когда текст не переполняется. Как я могу добавить в качестве условия "Если текст выходит за пределы, выполните перевод, если текст не выходит за пределы, не выполняйте перевод"?

Я бы предпочел решение css, а не решение JavaScript, если это возможно, чтобы избежать ненужной сложности (Мне нужно использовать его каждый раз, когда у меня есть текст).

PS: решением может быть разметка scss.

.case {
  cursor: pointer;
  display: flex;
  width: 10em;
  height: 3em;
  overflow: hidden;
  background-color: #444444;
  color: white;
  margin-top: 2em;
  margin-bottom: 2em;
  flex-direction: row;
  align-items: center;
}

.sp {
  width: 100%;
  height: auto;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  display: block;
}

.case:hover .sp {
  transition: 1.3s;
  overflow: inherit;
  margin-left: -100%;
  width: auto;
  text-overflow: inherit;
  transition-timing-function: linear;
}
<div class = "case">
  <span class = "sp">Short text</span>
</div>

<div class = "case">
  <span class = "sp">Overflowing long text, so long that you can't read it at once!</span>
</div>

Я не думаю, что вы можете сделать это только с помощью CSS. Вам понадобится JavaScript.

arieljuod 15.05.2019 18:42

У вас не может быть условного правила :hover. Возможно, вы могли бы использовать use :hover, чтобы установить скрытое переполнение в auto. Если слишком много текста, переполнение покажет этот текст при наведении. Если текста недостаточно для переполнения, он ничего не должен делать.

GifCo 15.05.2019 18:44

Как бы то ни было, одна из причин, по которой вы не можете сделать это в CSS, заключается в том, что обычно считается плохим дизайном заставлять пользователя наводить курсор, чтобы прочитать текст, а затем ждать, пока он прокрутится, в надежде, что он сможет вспомнить все, что он хочет. читать. Он также пропускает несколько требований доступности. Я не говорю, что это плохой вопрос, и мы все были вынуждены реализовывать плохие проекты. Но, просто рекомендация, посмотрите, сможете ли вы найти другой дизайн, который лучше для ваших пользователей (и вам будет проще его реализовать).

Jon Adams 15.05.2019 18:56
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
5
3
2 299
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вам понадобится javascript. Если вы хотите, чтобы это было просто, вы можете сделать что-то вроде этого (когда DOM готов):

document.querySelectorAll('.sp').forEach( el => {
  if (el.scrollWidth > el.clientWidth ) el.classList.add('overflows');
})

И измените селектор анимации следующим образом:

.case:hover .sp.overflows {

JS проверит все элементы .sp и при необходимости добавит класс overflows, чтобы он соответствовал селектору.

https://codepen.io/anon/pen/OYpPez

Ответ принят как подходящий

Вы можете добиться того, чего хотите, только с помощью css, но решение не очень чистое, требует дополнительной html-разметки (вложенных div) и, вероятно, может сломаться в будущем, но если вы настаиваете на том, чтобы делать это без js, вы можете увидеть решение ниже :

.case {
  cursor: pointer;
  display: flex;
  width: 10em;
  height: 3em;
  overflow: hidden;
  background-color: #444444;
  color: white;
  margin-top: 2em;
  margin-bottom: 2em;
  flex-direction: row;
  align-items: center;
}

.sp {
  flex: 1 0 100%;
  height: auto;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
  display: block;
}

.case:hover .sp {
  transition: 1.3s;
  overflow: inherit;
  margin-left: -100%;
  text-overflow: inherit;
  transition-timing-function: linear;
}

.case:hover .case-wrapper {
  overflow: visible;
  margin-left: 100%;
  transition: 1.3s;
  transition-timing-function: linear;
}
.case-wrapper {
  text-overflow: inherit;
  overflow: hidden;
  flex: 1 0 100%;
  display: flex;
}
<div class = "case">
  <div class = "case-wrapper">
  <span class = "sp">Short text</span>
  </div>
</div>

<div class = "case">
  <div class = "case-wrapper">
  <span class = "sp">Overflowing long text, so long that you can't read it at once!</span>
</div>
  </div>

<div class = "case">
  <div class = "case-wrapper">
  <span class = "sp">It will always scroll all the way to the end and will stop there.</span>
</div>
  </div>

Имейте в виду, что решение js будет намного чище, удобнее в сопровождении, будет иметь лучшую поддержку в разных браузерах, если вы будете использовать этот подход только css, то делайте это на свой страх и риск.

Piotr Wicijowski 16.05.2019 12:00

Это хороший вклад. В любом случае, я собираюсь следовать комментарию @Jon adams и использовать другой способ показать текст пользователю. Этот ответ действительно отлично отвечает на вопрос. Что касается совместимости с несколькими браузерами, я думаю, есть тесты, чтобы убедиться, что он работает на chrome/firefox/edge.

Orelsanpls 16.05.2019 15:42

Вот идея, которая опирается на трюк с flexbox, но у вас не будет многоточия. Единственным недостатком является то, что вам нужно определить большую ширину, и у вас может быть небольшая задержка при запуске:

.case {
  cursor: pointer;
  width: 10em;
  height: 3em;
  background-color: #444444;
  color: white;
  margin-bottom: 2em;
  position:relative;
  overflow:hidden;
}

.sp {
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  left:0;
  width: 250%; /* big enough */
  display:flex;
  justify-content:flex-end; /* Center to the end to have a left overflow */
  white-space: nowrap;
}
.sp:after {
  content:"";
  margin-left:auto; /* empty element to push content to the left */
}

.case:hover .sp {
  width: 100%; /* decrease the width to 100%*/
  transition:3s linear;
  transition-timing-function: linear;
}
<div class = "case">
  <span class = "sp">Short text</span>
</div>

<div class = "case">
  <span class = "sp">Overflowing long text, so long that you can't read it at once!</span>
</div>

Чтобы понять, что происходит, добавьте границу и окраску:

.case {
  cursor: pointer;
  width: 10em;
  height: 3em;
  background-color: #444444;
  color: green;
  margin-bottom: 2em;
  position:relative;
}

.sp {
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  left:0;
  width: 250%; /* big enough */
  display:flex;
  justify-content:flex-end; /* Center to the end to have a left overflow */
  white-space: nowrap;
  border:2px solid red;
}
.sp:after {
  content:"";
  width:2px;
  background:blue;
  margin-left:auto; /* empty element to push content to the left */
}

.case:hover .sp {
  width: 100%; /* decrease the width to 100%*/
  transition:3s linear;
  transition-timing-function: linear;
}
<div class = "case">
  <span class = "sp">Short text</span>
</div>

<div class = "case">
  <span class = "sp">Overflowing long text, so long that you can't read it at once!</span>
</div>

Работает. К сожалению, многоточие исчезло. Я думаю, что @Jon Adams прав, я должен использовать другую стратегию, чтобы показать информацию пользователю. Спасибо

Orelsanpls 16.05.2019 11:50

Другие вопросы по теме