Неправильный приоритет для встроенного класса CSS - PullRequest
2 голосов
/ 15 августа 2011

Если вы посмотрите на это CssToInlineStyles class на github. По сути, он пытается сделать CSS встроенным. Тем не менее, он имеет неправильный приоритет, когда речь идет о том, что уже встроенный CSS перезаписывается определениями в блоке стилей!

Я думаю, что строка 312 Мне нужно поставить условие, чтобы убедиться, что уже существующие встроенные стили никогда не будут перезаписаны никаким определением в свойствах CSS. Но, похоже, это не так просто!

Есть идеи? Я пытался связаться с владельцем класса, без ответа. Если я исправлю это, я сделаю запрос на github.

Обновление

Если в блоке стилей есть следующее:

p{font-family:Arial;font-size:0.9em;color:#53534a;} 
.webv {font-size: 10px; padding:5px 0 0 150px}

Тогда, если у вас есть тег p, например:

<p class="webv" >Testing</p>

Тогда класс .webv должен вступить в силу в терминах font-size.

Обновление 2

Решение Хакре работает хорошо, но есть один случай, когда оно не работает. Например, если у вас есть этот блок стилей:

  *{padding:0;margin:0;}
  h1{padding-bottom:10px;}

Заполнение для h1 по-прежнему равно 0, второй h1 не берет на себя то, что должен! Так это выглядит так:

<h1 style="padding:0; margin:0;">Test</h1>

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

Если вы не хотите, чтобы они были перезаписаны, вам сначала нужно получить существующие свойства из источника HTML.

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

Поскольку существующие свойства уже извлечены ранее, они могут работать как:

foreach($rule['properties'] as $key => $value)
    if(!isset($properties[$key])) $properties[$key] = $value;

(это перезапишет NULL свойства, в случае проблем используйте array_key_exists вместо isset).

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

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

$originalProperties = $properties;
foreach($rule['properties'] as $key => $value) $properties[$key] = $value;
$properties = $originalProperties + $properties;

Редактировать 2: Второе предложение также не будет работать. По сути, необходимо получить очень оригинальные значения, потому что эта функция изменяет атрибут стиля, в то время как она перебирает правила и элементы. Один и тот же элемент может быть изменен дважды, поэтому $originalProperties на самом деле не являются исходными свойствами, но могут быть изменены.

Возможно это работает с spl_object_hash для создания согласованного идентификатора / ключа для каждого элемента, но я не уверен. Может быть, DomElement предлагает что-то сопоставимое внутри, но я не нашел такого (который должен подходить лучше). С определенным ключом / id для каждого конкретного элемента, только при первом появлении, могут быть сохранены очень оригинальные свойства:

$elementId = spl_object_hash($element);
if(!isset($originalProperties[$elementId]))
{
    $originalProperties[$elementId] = $properties;
    $originalElements[$elementId] = $element; // Needed to make spl_object_hash work
}
foreach($rule['properties'] as $key => $value) $properties[$key] = $value;
$properties = $originalProperties[$elementId] + $properties;
0 голосов
/ 16 августа 2011

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

0 голосов
/ 15 августа 2011

Вы можете использовать !important после определения CSS, чтобы убедиться, что оно имеет приоритет.

Е.Г.

.yourstyle
{
    color: #000 !important;
}
...