【问题标题】:Priority incorrect on CSS inline classCSS内联类的优先级不正确
【发布时间】:2011-10-27 04:37:17
【问题描述】:

如果您查看 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>

【问题讨论】:

  • 请为更新 2 的 h1 元素添加样式属性输出。
  • 我添加了之后的样子。它只是完全忽略了 h1 定义中的padding-bottom!顺便说一句,由于修复了其他问题,我在第 312 行之后使用了$properties = array_reverse($properties, true);

标签: php css inline


【解决方案1】:

幸运的是这个类的所有者已经解决了这个问题!更新后的类可以在here找到。

【讨论】:

    【解决方案2】:

    如果您不想让它们被覆盖,您首先需要从 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 一起为每个元素创建一致的 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;
    

    【讨论】:

    • @harke - 我可以发誓我做出了改变。我不知道我为什么解雇它!它现在可以工作了,只是要再测试几次。
    • 不知原作者为何不这样做,因为根据定义,内联样式的优先级高于链接/样式元素样式。你的用例对我来说很有意义。也许您需要给原作者更多的时间来回复?可能在节假日。
    • @harke - 请参阅问题中的示例。我已经更新了它。这是我遇到问题的情况!他实际上可能是我在度假,我想我会尝试自己解决它,然后给他解决方案,但我发现很难!
    • 哪种问题,请详述。
    • 如果条件是新添加的第二个font-size 将被忽略,即使它具有更高的优先级,现在会发生什么。
    【解决方案3】:

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

    例如

    .yourstyle
    {
        color: #000 !important;
    }
    

    【讨论】:

    • 该类将在 HTML 和 CSS 中传递。然后它将所有样式块转换为内联 CSS。这不是 CSS 属性没有任何效果的问题,而是在转换过程中被覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多