Определите делают переменную во время выполнения правила

+ для следующего брата. Есть ли эквивалент для предыдущего брата?

Вы можете использовать два селектора ax : ! и ?

Там 2 следующие селекторные функции для сиблинга в обычном CSS:

  • + является непосредственным последующим селектором сиблинга
  • ~ является любым последующим селектором сиблинга

. В обычном CSS нет предыдущего селектора sibling.

Однако в ax CSS послепроцессорной библиотеки есть 2 предыдущие селекторные функции:

  • ? - это предыдущий селектор немедленного (напротив +)
  • ! является любым предыдущим селектором (см. ~)

Рабочий пример:

В следующем примере:

  • .any-subsequent:hover ~ div выбирает любой последующий div
  • .immediate-subsequent:hover + div выбирает немедленный последующий div
  • .any-previous:hover ! div выбирает любой предыдущий div
  • .immediate-previous:hover ? div выбирает непосредственный предыдущий div

div {
  display: inline-block;
  width: 60px;
  height: 100px;
  color: rgb(255, 255, 255);
  background-color: rgb(255, 0, 0);
  text-align: center;
  vertical-align: top;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.6s ease-out;
}

code {
  display: block;
  margin: 4px;
  font-size: 24px;
  line-height: 24px;
  background-color: rgba(0, 0, 0, 0.5);
}

div:nth-of-type(-n+4) {
  background-color: rgb(0, 0, 255);
}

div:nth-of-type(n+3):nth-of-type(-n+6) {
  opacity: 1;
}

.any-subsequent:hover ~ div,
.immediate-subsequent:hover + div,
.any-previous:hover ! div,
.immediate-previous:hover ? div {
  opacity: 1;
}
<h2>Hover over any of the blocks below</h2>

<div></div>
<div></div>

<div class="immediate-previous">Hover for <code>?</code> selector</div>
<div class="any-previous">Hover for <code>!</code> selector</div>
<div class="any-subsequent">Hover for <code>~</code> selector</div>
<div class="immediate-subsequent">Hover for <code>+</code> selector</div>

<div></div>
<div></div>

<script src="https://rouninmedia.github.io/axe/axe.js"></script>

186
задан Emil Sit 15 December 2009 в 07:52
поделиться

2 ответа

В вашем примере установлена ​​переменная TMP (и временный каталог создан) всякий раз, когда оцениваются правила для out.tar . Чтобы создать каталог только тогда, когда out.tar действительно запущен, вам нужно переместить создание каталога вниз на следующие шаги:

out.tar : 
    $(eval TMP := $(shell mktemp -d))
    @echo hi $(TMP)/hi.txt
    tar -C $(TMP) cf $@ .
    rm -rf $(TMP)

Функция eval оценивает строку, как если бы он был введен в make-файл вручную. В этом случае, он устанавливает переменную TMP в результат вызова функции оболочки .

редактировать (в ответ на комментарии):

Чтобы создать уникальную переменную, вы мог бы сделать следующее:

out.tar : 
    $(eval $@_TMP := $(shell mktemp -d))
    @echo hi $($@_TMP)/hi.txt
    tar -C $($@_TMP) cf $@ .
    rm -rf $($@_TMP)

Это добавило бы к переменной имя цели (в данном случае out.tar), создав переменную с именем out.tar_TMP . Надеюсь, этого достаточно для предотвращения конфликтов.

291
ответ дан 23 November 2019 в 05:49
поделиться

Мне не нравится, "не Делают" ответов, но... не делают.

make переменные глобальны и, как предполагается, оценены во время этапа "парсинга" make-файла, не во время этапа выполнения.

В этом случае, пока переменная, локальная для единой цели, следуют ответ @nobar и делают это переменной оболочки.

Целевые переменные также считает вредными другой делающему реализации: kati, Mozilla pymake. Из-за них цель может быть создана по-другому в зависимости от того, если она создала автономный, или как зависимость родительской цели с целевой переменной. И Вы не будете знать, каким путем это было , потому что Вы не знаете то, что уже создается.

0
ответ дан 23 November 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: