Подтвердить что ты не робот

Существует ли текущий или предлагаемый способ установки отдельных слоев для нескольких фонов?

Кто-нибудь знает способ изменить один слой многослойного фона с помощью CSS?

Я искал вокруг, но не могу найти упоминаний о текущей или даже предлагаемой будущей спецификации. Мое мышление говорит, что, вероятно, не будет, но сеть теперь настолько обширна, что я уверен, что кто-то где-то имеет информацию или ссылки на дискуссии по этим направлениям.

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

.building-texture {
  background: transparent, url(image/building-side.png);
}

.shade-dark {
  background: url(image/shade-dark.png), unchanged;
}

.shade-mid {
  background: url(image/shade-mid.png), unchanged;
}

.shade-light {
  background: url(image/shade-light.png), unchanged;
}
<div class="building-texture shade-dark"></div>

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

Начальные решения

комбинированные занятия

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

.building-texture-shade-dark {
  background: url(image/shade-dark.png), url(image/building-side.png);
}

.building-texture-shade-mid {
  background: url(image/shade-mid.png), url(image/building-side.png);
}

.building-texture-shade-light {
  background: url(image/shade-light.png), url(image/building-side.png);
}

отдельные элементы

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

<div class="building-texture">
  <div class="shade-dark"></div>
</div>

Генерация JavaScript

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

Стиль собственности через JavaScript

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

Почему...

Я играю с CSS-преобразованиями 3D (с включенной перспективой) и с тем, как лучше и проще и быстрее текстурировать/осветить такие структуры (пример кода):

http://pebbl.co.uk/wote/

example image
(источник: pebbl.co.uk)

После неудачного создания CSS-решения, которым я был доволен, я в настоящее время направляюсь к решению на основе Canvas, которое предварительно построило бы все текстуры, которые мне могут понадобиться - вместе с их различными затененными состояниями - и затем сгенерировало бы URI кэшированных данных. быть прикрепленным как однослойный фон. Мои тесты показали, что это оптимально. Тем не менее, мне бы очень хотелось использовать как можно больше нативных браузерных решений, потому что в canvas задействовано гораздо больше кода, и, поскольку современные браузеры улучшаются так быстро, кажется глупым изобретать любые колеса, движки, или дорожные сети.

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

Я был бы заинтересован в любых ответах со ссылками на обсуждения по этим направлениям.

4b9b3361

Ответ 1

Аннотация его с псевдоэлементами

Я еще не знаю, как "обменивать" один фон. Один метод обхода основан на методе "отдельных элементов", но вместо этого внутренний элемент является псевдоэлементом. Я понятия не имею о скорости рендеринга. У этого также есть недостаток, что он не будет работать для IE8, поскольку вы не можете применить filter к псевдоэлементам. Однако, поскольку вы используете эту идею в сочетании с перспективой CSS3 и т.д., Предостережение IE8 не является проблемой для вас.

Это обеспечивает абстракцию текстуры от затенения. Он мог бы даже добавить еще один слой с помощью псевдоэлемента :after, и он по-прежнему может использовать несколько фонов в каждом из трех, если это необходимо/желательно.

Вот скрипка.

Пример кода:

HTML

<div class="texture"></div>
<div class="texture light"></div>
<div class="texture medium"></div>
<div class="texture dark"></div>

CSS (ядро)

.texture {
    position: relative;
    background: url(http://www.dummyimage.com/12x16/ff0000/ffffff.png&text=X++) top left repeat;
}

.light:before,
.medium:before,
.dark:before {
    content: '';
    position: absolute;
    top:0;
    right: 0;
    bottom:0;
    left: 0;
}
.light:before {
    background: -moz-linear-gradient(left,  rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.1) 100%);
    background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(0,0,0,0.3)), color-stop(100%,rgba(0,0,0,0.1)));
    background: -webkit-linear-gradient(left,  rgba(0,0,0,0.3) 0%,rgba(0,0,0,0.1) 100%);
    background: -o-linear-gradient(left,  rgba(0,0,0,0.3) 0%,rgba(0,0,0,0.1) 100%);
    background: -ms-linear-gradient(left,  rgba(0,0,0,0.3) 0%,rgba(0,0,0,0.1) 100%);
    background: linear-gradient(to right,  rgba(0,0,0,0.3) 0%,rgba(0,0,0,0.1) 100%);
}
.medium:before {
    background: -moz-linear-gradient(left,  rgba(0,0,0,0.6) 0%, rgba(0,0,0,0.2) 100%);
    background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(0,0,0,0.6)), color-stop(100%,rgba(0,0,0,0.2)));
    background: -webkit-linear-gradient(left,  rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.2) 100%);
    background: -o-linear-gradient(left,  rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.2) 100%);
    background: -ms-linear-gradient(left,  rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.2) 100%);
    background: linear-gradient(to right,  rgba(0,0,0,0.6) 0%,rgba(0,0,0,0.2) 100%);
}
.dark:before {
    background: -moz-linear-gradient(left,  rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.3) 100%);
    background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(0,0,0,0.8)), color-stop(100%,rgba(0,0,0,0.3)));
    background: -webkit-linear-gradient(left,  rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.3) 100%);
    background: -o-linear-gradient(left,  rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.3) 100%);
    background: -ms-linear-gradient(left,  rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.3) 100%);
    background: linear-gradient(to right,  rgba(0,0,0,0.8) 0%,rgba(0,0,0,0.3) 100%);
}

Ответ 2

К сожалению, в обычном CSS нет способа сделать это. Вы можете изменить только целое свойство, а не его часть. Вот почему у нас есть отдельные свойства, такие как background-image, background-color для начала. Но ничего более тонкого, чем это.

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

Если ваша главная цель - не вводить код снова и снова, хорошим решением будет использование препроцессора CSS, например SASS. Тогда ваш SCSS будет примерно таким:

$img-side:  url("image/building-side.png");
$img-dark:  url("image/shade-dark.png");
$img-mid:   url("image/shade-mid.png");
$img-light: url("image/shade-light.png");

.building-texture {
  background: transparent, $img-side;
}    
.shade-dark {
  background: $img-dark, $img-side;
}    
.shade-mid {
  background: $img-mid, $img-side;
}    
.shade-light {
  background: $img-light, $img-side;
}

Он будет скомпилирован с более громоздким CSS (с полным определением URL-адресов), но вы, безусловно, сэкономите много времени на разработку. SASS также может помочь вам сгенерировать префиксы поставщиков с помощью mixins (есть также Compass, который добавляет это к SASS).

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