【问题标题】:Is there a difference between .ui-widget :active and .ui-widget:active?.ui-widget :active 和 .ui-widget:active 之间有区别吗?
【发布时间】:2012-03-15 01:30:54
【问题描述】:

我在 Chrome 17.0.963.56 中遇到了一个非常奇怪的错误。以下是截图:

当页面首次呈现时,Salutation 组合框看起来不错。但是,一旦您选中上面的复选框,就会出现奇怪的图像。单击页面上的任意位置会使其消失。取消选中该框会使其再次出现。我试图在 jsfiddle 中重现,但不能。

我找到了 2 种不同的方法来消除此错误。第一个与组合框的 HTML 和 CSS 结构有关:

<div class="field ui-helper-clearfix @Html.IdFor(m => m.Salutation)-field">
    <span class="label">
        @Html.LabelFor(m => m.Salutation)
    </span>
    <div class="input">
        <div class="combobox">
            <div class="text-box input">
                @Html.EditorFor(m => m.Salutation)
            </div>
            <a class="text-box down-arrow">
                <img class="text-box down-arrow" alt="" 
                    src="/content/icons/transparent.png">
            </a>
            <div class="autocomplete-menu">
            </div>
        </div>
        <div class="messages">
            <div class="top callout border">
                <div class="top callout bg">
                </div>
            </div>
            <span class="validation">
                @Html.ValidationMessageFor(m => m.Salutation)
            </span>
        </div>
    </div>
</div>

.combobox .text-box.input {
    position: absolute;
    left: 0;
    right: 20px;
    border-right-color: transparent; /* was border-right-width: 0; */
    border-right-width: 0;
    border-radius: 5px 0 0 5px;
    -moz-border-radius: 5px 0 0 5px;
}

基本上,边框来自输入元素周围的 div 包装器。输入本身没有边框。对于普通文本框包装器,边框半径为 5px。但是对于组合框,我覆盖了该 CSS 值以使右上角和右下角的半径为零。这是为了让它融入组合框的下拉箭头元素中。

当我完全删除文本框包装器上的右边框时(使用border-right-width: 0;),出现异常。当我改为保留右边框并给它一个透明的背景颜色时,异常就消失了。

但我也发现删除 /content/themes/base/jquery.ui.all.css 后问题就消失了。 反复试验导致我在 jquery.ui 中找到以下行。主题.css:

.ui-widget :active { outline: none; }

当我删除此行或将其更改为 .ui-widget:active { outline: none; }(请注意小部件和 :active 之间没有空格)时,问题也消失了——即使文本框包装器的右边框宽度为零。

在 Firefox、IE 或 Safari 5.1.1 (7534.51.22) 中不会出现此问题,仅在上述 Chrome 版本中出现。所以它似乎可能是一个 Chrome 错误。

我以前从未见过与这样的空格一起使用的状态选择器。大多数时候,像 :hover、:link、:active 之类的东西都紧跟在选择器之后。上面的 jQuery UI 选择器是否意味着“将大纲:无;应用于嵌套在 .ui-widget 元素下的所有 :active 元素”?或者它是否意味着“将大纲:无;应用于所有 :active .ui-widget 元素”?如果通过删除 .ui-widget 和 :active 之间的空格没有区别,我更喜欢该解决方案而不是使文本框包装器右边框透明而不是使其宽度为零。

另一个奇怪的事情是后缀组合框不受影响——但它使用与称呼组合框相同的 CSS 和 HTML 结构。奇怪...

【问题讨论】:

    标签: asp.net-mvc jquery-ui google-chrome css


    【解决方案1】:

    .ui-widget :active 和 .ui-widget:active 有区别吗?

    有。 .ui-widget :active 表示“具有“ui-widget”类的元素的活动继任者。.ui-widget:active 表示“具有“ui-widget”类的活动元素。

    如果其他浏览器正确呈现这个案例,我建议针对 Chrome 报告一个错误(最好给出一个简化的测试案例):http://new.crbug.com

    【讨论】:

    • 谢谢亚历山大,很高兴知道这一点。尽管如此,Chrome 还是有一种非常奇怪的行为。我刚刚意识到背景图像中的颜色对应于文本框包装器的边框颜色——顶部和左侧为深灰色,底部和右侧为浅灰色。
    • 嗯,您有一个不可见的边框半径,这可能是个问题 - 您是否尝试将您的边框右设置为可见的东西?
    • 是的,我发现的解决方案之一是保持正确的边框宽度并为其赋予透明的背景色。鉴于您的回答,这可能是我现在要采用的解决方案。然而,无法在其他浏览器中重现让我认为这是一个 Chrome 错误,而不是对 CSS3 的不当使用。
    • 在这种情况下,最好的选择是针对 Chrome 报告一个错误(最好提供简化的测试用例):new.crbug.com
    • 谢谢,我一定会这样做的。请将最后一条评论复制到您的答案中,我会标记。
    猜你喜欢
    • 2023-03-02
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2012-02-16
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多