【问题标题】:Override hover styles within hovered element覆盖悬停元素中的悬停样式
【发布时间】:2012-01-19 12:54:02
【问题描述】:

我有一个 CSS 类

.uppercase:hover { text-transform: uppercase; }

因此,每当我使用它时,文本都会发生变化,但在少数情况下,我希望其中的某些文本不要大写。 (取消.uppercase:hover)。例如:

Abc cake smurf cafe Zzz -> ABC CAKE smurf CAFE ZZZ

我想使用 JavaScript 而不是 CSS。

更新:

Abc cake (smurf) cafe Zzz -> ABC CAKE smurf CAFE ZZZ

【问题讨论】:

  • 您能对这些“少数情况”进行一些扩展吗?哪些情况下您不想使用大写?
  • 喜欢引号、用户名、日期和时间
  • 这应该是可能的,但是您需要一个要保留小写的元素的确切列表 - 并编写规则来查找所有这些元素 - 根据您的元素列表,这可能成为相当复杂的脚本...
  • 所以你说我需要一个应该逃避效果的元素列表。唔!如何使用一个特殊字符(或一组字符)来指示不应应用大写字母的位置,例如“~”。这可能吗?

标签: javascript css hover uppercase


【解决方案1】:

覆盖您不想在悬停时大写的项目的文本转换值。

使用 jQuery:

$(".uppercase").each(function(){
    // wrap case-insensitive occurrences of the words smurf, blue, and stuff
    // with a span that cancels the affect of the inherited text-transform property
    // from its ancestor's `uppercase` class.
    this.innerHTML = this.innerHTML.replace(/(smurf|blue|stuff)/ig, "<span style='text-transform:none;'>$1</span>");
});

【讨论】:

  • 如果我理解正确,OP 正在寻找答案以排除 .uppercase 元素中的某些单词(示例中为“smurf”)
  • 你能解释一下吗
  • 更新为取消对元素中特定单词的影响。
  • 谢谢你的代码,它回答了我原来的问题,但是:)你能更新一下吗?使用特殊字符取消效果。类似i'm big, ^i'm small^ -> I'M BIG, i'm small
  • 对不起,我不会这样做。按照这些思路做事通常是不好的做法,我不鼓励这样做。如果您已经可以编辑 HTML 本身,为什么还需要 JavaScript?只需将您不想大写的单词包裹在 span 中即可。
【解决方案2】:

回答您对问题的最后评论:是的,如果您可以使用一些保留字符,您可以轻松实现这一点:

http://jsfiddle.net/LH7sy/8

<a class="uppercase" href="#">everything uppercase, except (this) word</a>


$(document).ready(function () {
     $('.uppercase').each(function() {
        var end = false;
        var s = $(this).html();
        while(end == false) {
            var p1 = s.indexOf('(');
            var p2 = s.indexOf(')');
            if (p1 != -1) { /* if '(' is found in the string */
                var result = s.substring(0,p1);
                result += '<span style="text-transform:none">';
                result += s.substring(p1+1,p2);
                result += '</span>'                        
                result += s.substr(p2+1);
                s = result;
            } else {
                end = true;
            }
        }
        $(this).html(result);
    })
})

【讨论】:

  • @DavidMurdoch 相反,我不是 javascript 专家 - 也许会关心扩展什么让你感到奇怪 - 并且更具建设性?您之前的评论对我没有帮助,对其他任何人都没有帮助。这就是这个网站的重点,不是吗?
  • :) 只有一个问题。当页面加载时,文本将是所有大写字母,除了(这个)单词而不是所有大写字母,除了这个单词 :(悬停后特殊字符消失
  • 对不起,但整个事情只是糟糕的形式:$("a").html() 而不是 $(this).html(),选择器没有被缓存,所有变量都是扔到全局范围内,像这样被替换的“保留”字符没有任何意义,等等。我的回答是这样做的更好方法。
  • @FakeRainBrigand 你的var s 版本仍然将result 变量泄漏到全局范围内。
  • 我更新了我的答案,包括@DavidMurdoch 的评论(为此+1,很高兴学到了一些东西)。正如 David 的回答中所见,我将代码移动到 .uppercase 选择器而不是 :hover - 因为这确实没有太大意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2012-10-07
  • 2021-09-02
  • 2013-01-08
相关资源
最近更新 更多