Как изменить цвет фона текстовых ссылок при наведении курсора, но не ссылок на изображения

У меня есть такое правило CSS:

a:hover { background-color: #fff; }

Но это приводит к тому, что внизу ссылок на изображения появляется некрасивый пробел, и, что еще хуже, если у меня прозрачные изображения, цвет фона ссылки можно увидеть сквозь изображение.

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

a.imagelink:hover { background-color: transparent; }

Сегодня я искал более элегантное решение этой проблемы, когда наткнулся на это.

В основном он предлагает использовать display: block, и это действительно решает проблему для непрозрачных изображений. Однако это приводит к другой проблеме: теперь ширина ссылки равна абзацу, а изображение - нет.

Есть ли хороший способ решить эту проблему, или мне придется снова использовать грязный подход?

Спасибо,

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
7
0
28 440
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Непроверенная идея:

a:hover {background-color: #fff;}
img:hover { background-color: transparent;}

Это не сработает, поскольку я меняю не цвет фона изображения, а цвет ссылки.

Can Berk Güder 08.11.2008 02:23

плюс я не думаю, что IE поддерживает псевдоклассы на чем-либо, кроме ссылок.

nickf 08.11.2008 03:06

Следующее должно работать (непроверено):

Ты первый

 a:hover { background-color: #fff; }

Затем вы

a:imagelink:hover { background-color: inherit; }

Второе правило переопределит первое для <a class="imagelink" etc.> и сохранит цвет фона родителя.

Я попытался сделать это без class = "", но не могу найти селектор CSS, противоположный foo> bar, который стилизует панель, когда она является дочерним элементом foo. Вы хотели бы стилизовать foo, когда он имеет является дочерним элементом class bar. Вы можете делать это и даже более интересные вещи с помощью jQuery, но это может быть нежелательно в качестве общей техники.

Думаю, это должно быть a.imagelink: hover {background-color: inherit; }

Salamander2007 08.11.2008 02:53

вы можете использовать display: inline-block, но это не полностью кроссбраузерный. IE6 и ниже будут иметь проблемы с этим.

Я полагаю, у вас есть пробелы между <a> и <img>? попробуйте удалить это вот так:

<a><img /></a>

Меня смущает то, что вы называете «ссылками на изображения» ... это тег img внутри привязки? Или вы устанавливаете изображение в CSS?

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

<a ...><img src = "..." /></a>

Для чего я бы посоветовал вам указать цвет фона на изображении ... Итак, предполагая, что контейнер в должен будет белым ...

a:hover { background: SomeColor }
a:hover img { background-color: #fff; }
Ответ принят как подходящий

Я попытался найти какой-то селектор, который бы получал только элементы <a>, у которых нет потомков <img>, но не нашел ... Что касается изображений с этим нижним промежутком, вы можете сделать следующее:

a img{vertical-align:text-bottom;}

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

Для прозрачных изображений вы должны использовать класс.

Я очень надеюсь, что это решено в CSS3 путем реализации родительского селектора.

Это решает проблему OP, но не является ответом на заголовок OP.

machineaddict 18.11.2013 12:56

Я обычно делаю что-то вроде этого, чтобы убрать пробел под изображениями:

img {
  display: block;
  float: left;
}

Конечно, это не всегда идеальное решение, но в большинстве ситуаций оно подходит.

У меня была эта проблема сегодня, и я использовал другое решение, чем display: block, благодаря ссылке от спрашивающего. Это означает, что я могу сохранить ссылку ТОЛЬКО на изображении и не расширять ее до контейнера.

Изображения встроены, поэтому под ними есть место для нижней части букв, таких как «y, j, g». Это позиционирует образы в baseline, но вы можете изменить его, если у вас нет <a>TEXT HERE</a>, как с логотип. Однако вам все равно нужно замаскировать пространство текстовой строки, и это легко, если вы используете простой цвет в качестве фона (например, в body или div#wrapper).

body {
  background-color: #112233; 
}
a:hover {
  background-color: red;
}
a img {
  border-style: none; /* not need for this solution, but removes borders around images which have a link */
  vertical-align: bottom; /* here */
}
a:hover img {
  background-color: #112233; /* MUST match the container background, or you arent masking the hover effect */
}

Этот способ работает лучше.

a[href$=jpg], a[href$=jpeg], a[href$=jpe], a[href$=png], a[href$=gif] {
    text-decoration: none;
    border: 0 none;
    background-color: transparent;
    }

Никаких громоздких классов, которые нужно применять к каждому изображению. Подробное описание здесь:

http://perishablepress.com/press/2008/10/14/css-remove-link-underlines-borders-linked-images/

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

background-image: url(file:"use the same background image or color");

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