Добавьте текст поверх изображения, если условие выполнено с помощью CSS - PullRequest
0 голосов
/ 23 января 2020

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

Я успешно создал условие, в котором изображение фильтруется с оттенком сепии, чтобы подчеркнуть, что в нем отсутствует альт-текст. Но я также хотел бы разместить текст рядом с изображением, или, желательно, поверх изображения с надписью - «Отсутствует альтернативный текст»

Это то, что у меня есть:

/* Locates images missing an Alt-Text */

img[alt=""] {filter: sepia(100%);}

img[alt=""]:after{
  content: "Image is missing an Alt text. ";
    color: black;
} 

Цвет работает, но добавление текста после изображения - нет. Любые идеи? Спасибо!

Ответы [ 4 ]

2 голосов
/ 23 января 2020

Псевдоэлементы ::before и ::after применяются только к элементам, которые могут содержать контент ( элементы потока и фразы с конечным тегом (например, <b></b>)) <img> является void element (ie no end tag), поэтому невозможно использовать указанные псевдоэлементы для тега <img>. Как прокомментировал @ Kaiido наличие конечного тега, замененные элементы также не могут иметь псевдоэлементы (например, <video></video>, <textarea></textarea>, <iframe></iframe>, et c.).

Есть три вещи, которые вы должны сделать для достижения своей цели через CSS:

  1. Немедленно добавить соответствующий элемент после каждого изображения. Подойдет любой элемент с конечным тегом.

  2. Добавьте alt="" к каждому <img>, если вы этого еще не сделали.

  3. Добавить следующий набор правил для вашего CSS:

    img[alt=""]+b::after { content: "Image is missing an Alt text.";...
    

    Это интерпретируется как:

    "Все <b> теги, которые сразу после <img alt=""> будут иметь текст 'Изображение не содержит альтернативного текста.' после любого содержания. "

Демо

img {
  display: inline-block;
  width: 20vw
}

img[alt=""] {
  filter: sepia(100%);
}

img[alt=""]+b::after {
  content: "Image is missing an Alt text.";
  display: inline-block;
  position: relative;
  z-index: 1;
  right: 20vw;
  width: 20vw;
  font-size: 0.75rem;
  color: #930;
}
<img src='https://i.ibb.co/hZj77BZ/lena01.jpg' alt=""><b></b>
<img src='https://i.ibb.co/7XxsBr5/lena02.png' alt=""><b></b>
<img src='https://i.ibb.co/X7SCb3w/lena03.png' alt=""><b></b>
1 голос
/ 24 января 2020

РЕДАКТИРОВАТЬ - это решение работает только в браузерах chrome / webkit, поскольку комментарий указывает на то, что это взлом. См. Мой другой ответ для кросс-браузерного решения.

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

Это даст визуальную подсказку, что изображение не имеет атрибута alt.

Соедините это с рамкой, и вы получите победитель.

В приведенном ниже примере я настроил его так, чтобы изображение, не содержащее атрибута alt, было заменено и имело 5-ти пиксельный «бордюр» (я использую offset, чтобы он не испортил документооборот).

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

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

Создайте изображение с надписью 'отсутствует Alt text ', и вы настроены.

очевидно, используйте это CSS только в своем бэк-энде

img{
  width:200px;
  height: 200px;
}

img:not([alt]) {
  outline: solid 5px red;
  outline-offset: -5px;
  content:url("https://www.publicdomainpictures.net/pictures/250000/nahled/erorr.jpg"); 
}
img[alt=""] {
  outline: dashed 5px red;
  outline-offset: -5px;
  content:url("https://freesvg.org/img/molumen_red_square_error_warning_icon.png"); 
}
<img src="https://via.placeholder.com/150" alt="">

<img src="https://via.placeholder.com/150">

<img src="https://via.placeholder.com/150" alt="Great alternative text">
0 голосов
/ 24 января 2020

Думал, что было бы лучше добавить это как второй ответ после комментария, указывающего, что мое оригинальное решение не совместимо с IE и FireFox.

Если вы знаете ширину и высоту рассматриваемое изображение является кросс-браузерным и допустимым CSS.

По сути, мы скрываем исходное изображение, устанавливая его на 0 высоту, а затем добавляем отступ к нижнему эквиваленту высоты, чтобы позволить background-image показать .

Недостатком этого метода является то, что использование опции 'cover' для размера фона означает, что другой аспект rat ios вызывает обрезание изображения, поэтому вам нужно будет создать изображение, которое будет работать для ваши изображения «alt tag отсутствует» и «alt tag empty» как в книжной, так и в альбомной ориентации (или используйте tile и уменьшите изображение).

img{
  width:200px;
  height: 200px;
}


img:not([alt]) {
  width: 200px;
  height: 0;
  padding: 0 0 200px 0;
  outline: solid 5px red;
  outline-offset: -5px;
  background-image: url(https://freesvg.org/img/molumen_red_square_error_warning_icon.png);
  background-size: cover;
}


img[alt=""]{
  width: 200px;
  height: 0;
  padding: 0 0 200px 0;
  outline: dashed 5px red;
  outline-offset: -5px;
  background-image: url(https://www.publicdomainpictures.net/pictures/250000/nahled/erorr.jpg);
  background-size: cover;
}
<img src="https://via.placeholder.com/150" alt="">

<img src="https://via.placeholder.com/150">

<img src="https://via.placeholder.com/150" alt="Great alternative text">

Лучшим решением было бы просто запретить людям добавлять изображение с пустым атрибутом alt в первую очередь как часть ваш редактор (и поставьте им галочку, чтобы сказать, что изображение является декоративным, чтобы разрешить пустой атрибут alt, если вам нужно предоставить опцию декоративных изображений).

0 голосов
/ 23 января 2020
img[alt=""] {
  filter: sepia(100%);
  position: relative;
  z-index: 1
}

img[alt=""]:after{
  content: "Image is missing an Alt text. ";
  color: black;
  position: absolute; 
  top: 0px;
  left: 0px;
  z-index: 10
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...