如果你在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
生效。
Hakre的解决方案运作良好,但有一种情况不起作用。例如,如果您有此样式块:
*{padding:0;margin:0;}
h1{padding-bottom:10px;}
h1的填充仍为0,第二个h1不会接管它应该!所以它看起来像这样:
<h1 style="padding:0; margin:0;">Test</h1>
答案 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。