Определение стилей для комбинаций классов

Есть ли способ определить стили для комбинации классов? Например, я бы хотел, чтобы мой HTML выглядел так, но вывод отображался в соответствующем цвете:

<span class = "red">Red Text</span><br/>
<span class = "green">Green Text</span><br/>
<span class = "red green">Yellow Text</span><br/>

Редактировать: Вышеупомянутое, кажется, сбивает людей с толку, когда это был просто пример; так вот еще один пример:

<style>
    .style1 { background-color: #fff; }
    .style2 { background-color: #eee; }
    .style1.highlight { color: red; }
    .style2.highlight { color: blue; }
</style>

<ul>
    <li class = "action style1">Do Action 1</li>
    <li class = "action style2">Do Action 2</li>
    <li class = "action style1 highlight">Do Action 1</li>
    <li class = "action style2 highlight">Do Action 2</li>
</ul>

<script language = "javascript" type = "text/javascript">
$("li.action").bind("click", function(e) {
    e.preventDefault();

    // Do some stuff 

    $(this).addClass("highlight");
    $(this).unbind("click");
});
</script>

Опять же, это просто пример, так что не зацикливайтесь на чередующихся элементах или на чем-то подобном. Чего я пытаюсь избежать, так это необходимости дублировать функцию привязки для каждого другого styleN или писать структуру elseif, которая проверяет каждый класс styleN. К сожалению, этот код не работает в IE 6 или 7 - выделенный текст для элементов .style1 и .style2 оказывается синим.

Приемы 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 сценарий полностью изменился.
2
0
2 491
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Вы можете выбрать несколько классов:

span.red.green { color: yellow; }

Это применимо к любому элементу span с красным и зеленым классами. Возможно, это не то, что вам нужно, поскольку это также применимо, например, к:

<span class = "red green blue">white</span>

Обратите внимание, что в IE 6 это не работает.

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

Soldarnal 11.12.2008 22:05

IE решает это как ИЛИ, а не И - то есть он будет соответствовать любому элементу с «зеленым» классом. Вы можете обойти это с помощью правильного дизайна, но не всегда. Если бы вы могли поставить нам конкретную цель, мы могли бы ее решить.

annakata 11.12.2008 23:53

может что-то вроде этого

.red
{
color: red;
}

.red_green
{
color: #AS8324;
}

и вы можете использовать свой html-код

<span class = "red">Red Text</span><br/>
<span class = "green">Green Text</span><br/>
<span class = "red_green">Yellow Text</span><br/>

Я не знаю, что именно вы хотите, но это мой подход. Я надеюсь, что это помогает.

Конечно.

.red { color: red; }
.green { color: green; }
.red.green { color: yellow; }

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

РЕДАКТИРОВАТЬ | Еще больше редактирования (добавлено регулярное выражение для текущих цветов)
Хорошо, вам это не интересно, но я все равно напишу это, потому что это кажется забавным:

var re = /([0-9]?)/g;
$("span").each( function(){
 $this = $(this);
 results = re.exec( $this.css('background-color')); // background is something like: 'rgb( 0, 132, 12)'
 var sRed = results[1];
 var sGreen = results[2];
 var sBlue = results[3];
 /* OLD!
 var sRed = '0';
 var sGreen = '0';
 var sBlue = '0';*/
 if ($this.hasClass('red')) { sRed = '255'; }
 if ($this.hasClass('green')) { sGreen = '255'; }
 if ($this.hasClass('blue')) { sBlue = '255'; }
 $this.css('background-color', 'rgb(' + sRed + ',' + sGreen + ',' + sBlue ')';
});

Для этого вам понадобится jQuery, хотя вы, вероятно, могли бы сделать это без jQuery.

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

Soldarnal 11.12.2008 22:29

Ах, ладно, неважно, писать об этом было весело, когда-нибудь это может пригодиться.

Pim Jager 11.12.2008 22:42

почему ты хочешь сделать это? это возможно, но я не вижу пользы. Вы бы также определили class = "short fat" и class = "high thin" или как насчет class = "light dark"? Классы должны быть простыми и конкретными для ясности и повторного использования. Следует избегать множественного наследования (фальшивого или иного), когда оно не нужно и может сбивать с толку.

class = "red green"

сбивает с толку

class = "yellow"

кратко и ясно

Обновлено: я видел второй пример, мой совет остается неизменным. Один класс краткий и ясный, два потенциально сбивают с толку. Предполагая, что это должно работать (а я думаю, что это так), прилагать большие усилия для борьбы с ошибками в самом популярном браузере (IE), вероятно, не стоит.

Извините, мне не следовало использовать два противоречащих друг другу класса, как в моем первом примере. Пожалуйста, посмотрите мой второй пример.

Soldarnal 12.12.2008 01:05

@Soldarnal: если комбинации не работают в IE, сколько усилий вы готовы потратить на борьбу с ошибками в самом популярном браузере? Особенно, когда альтернатива - сделать другой класс - настолько проста ...?

Steven A. Lowe 12.12.2008 01:30

Вот мой обходной путь:

<style>
    .style1 { background-color: #fff; }
    .style2 { background-color: #eee; }
    .style1 .highlight { color: red; }
    .style2 .highlight { color: blue; }
</style>

<ul>
    <li class = "action style1"><span>Do Action 1</span></li>
    <li class = "action style2"><span>Do Action 2</span></li>
    <li class = "action style1"><span class = "highlight">Do Action 1</span></li>
    <li class = "action style2"><span class = "highlight">Do Action 2</span></li>
</ul>

<script language = "javascript" type = "text/javascript">
$("li.action").bind("click", function(e) {
    e.preventDefault();

    // Do some stuff 

    $(this).children("span").addClass("highlight");
    $(this).unbind("click");
});
</script>

Это не так элегантно, как я надеялся. Он использует дополнительный элемент для каждого элемента; но, по крайней мере, он все еще довольно чистый.

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