CSS内联类的优先级不正确

时间:2011-08-15 10:24:33

标签: php css inline

如果你在github上查看this CssToInlineStyles class。它本质上是试图使CSS全部内联。但是,当样式块中的定义覆盖已经内联的CSS时,它的优先级都是错误的!

我认为line 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

Hakre的解决方案运作良好,但有一种情况不起作用。例如,如果您有此样式块:

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

h1的填充仍为0,第二个h1不会接管它应该!所以它看起来像这样:

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

3 个答案:

答案 0 :(得分:3)

如果您不想覆盖它们,首先需要从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:第二个建议也不会有效。基本上需要获取非常原始的值,因为该函数在迭代规则和元素时更改了style属性。相同的元素可以被修改两次,因此$originalProperties实际上不是原始属性,但可以是修改后的属性。

也许这适用于spl_object_hash为每个元素创建一致的id / key,但我不确定。也许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;

答案 1 :(得分:0)

您可以在CSS定义后使用!important以确保它具有优先权。

E.g。

.yourstyle
{
    color: #000 !important;
}

答案 2 :(得分:0)

幸运的是,这个班级的老板已经解决了这个问题!可以找到更新的课程here