javascript - Div 转换 - IE 与其他

标签 javascript jquery html css

我有一个 JSFiddle,它显示一系列框。如果单击其中一个框,它会展开以覆盖其他框,然后显示文本。单击现在展开的框时,它会缩回到原来的宽度和高度。该 JavaScript 在 Firefox、Chrome 和 Safari 中完美运行。但是,在 Internet Explorer (v10) 中,该框会展开但无法缩回。关于为什么会这样的任何见解吗?

JSFiddle:http://jsfiddle.net/QBdDE/

Javascript:

$('div').on('click', function (e) { 
    if ($(this).hasClass('clicked')) {
        setTimeout(function (div) {
            return function () { div.css('z-index', '') ; } ;            
        } ($(this)), 1000) ;
       $('.overlay-text').hide();
    }
    else {
        $(this).css('z-index', 400) ;
        setTimeout(function(){$('.overlay-text').show();},1000);
    }
    $(this).toggleClass('clicked') ;

});

最佳答案

发生了什么

问题:

IE11 中添加了

pointer-events 支持。 IE10 忽略了这一点,因为您的覆盖层位于顶部,所以鼠标正在与其交互。不过我们可以解决这个问题!

解决方案:

我们需要删除对该 CSS 规则的依赖。为此,我们需要做两件事:

1.) 即使 :hover 效果没有发生,我们也需要保持悬停颜色。我们可以向 CSS 添加另一个选择器,以便 .clicked 类将导致颜色。

2.) 我们需要解决点击 .overlay_text 时发生的情况,并使用它来触发收缩动画。


代码

1.) 悬停效果

我们需要在每个使用 :hover 的地方添加另一个选择:

旧 CSS:

.first_box:hover {

   ...background color rule ...

}

新 CSS:

.first_box:hover, .first_box.clicked {

   ...background color rule ...

}

为所有 4 个框规则重复上述内容。

2.) .overlay-text 触发器

我们需要点击 .overlay-text 来触发缩小。

旧JS:

$('div').on('click', function (e) { 
    if ($(this).hasClass('clicked')) {
        setTimeout(function (div) {
            return function () { div.css('z-index', '') ; } ;            
        } ($(this)), 1000) ;
       $('.overlay-text').hide();
    }
    else {
        $(this).css('z-index', 400) ;
        setTimeout(function(){$('.overlay-text').show();},1000);
    }
    $(this).toggleClass('clicked') ;

});

新的JS:

我们必须向 .on() 代码添加一个新的选择器,然后我们必须向两个选定的方 block 添加 .clicked,添加覆盖部分。最后我们必须从两者中删除 .clicked 。我们不能使用 .toggleClass(),因为我们要添加到 $(this) 并从所有 div 中删除。

$('div, .overlay-text').on('click', function (e) { 
    if ($(this).hasClass('clicked')) {
        setTimeout(function (div) {
            return function () { div.css('z-index', '') ; } ;            
        } ($(this)), 1000) ;
       $('.overlay-text').hide();
       $('div').removeClass('clicked');
       $('.overlay-text').removeClass('clicked');
    }
    else {
        $(this).css('z-index', 400) ;
        setTimeout(function(){$('.overlay-text').show();},1000);
        $(this).addClass('clicked');
        $('.overlay-text').addClass('clicked');
    }
});

摘要

我已经在 IE10 中进行了测试,它可以工作。

工作示例: jsFiddle


额外

如果我可以说,您正在使用的 CSS 结构可以改进,您的动画看起来会更好。 Chrome 和 IE 在左侧两个 block 的动画期间都会闪烁。

这是因为它们的宽度和位置正在动画化。如果您将它们放置在 right:0 处,则只有它们的宽度会产生动画,并且看起来会平滑很多。

我为您创建了一个 Fiddle 来解决上述问题。我用的是绝对定位。 CSS 最终变得更短,但主要是动画不会闪烁。看看:

工作示例: jsFiddle

额外 2

根据 OP 的评论,我们将阻止用户双击。由于所有动画都需要 1 秒,因此我们将在每次点击后 1 秒内禁止点击触发任何内容。

其实做起来很简单。上面的Extra 1中,我们清理了JS,就变成了这样:

$('div, .overlay-text').on('click', function (e) { 
    if ($(this).hasClass('clicked')) {
       $('.overlay-text').hide();
       $('div').removeClass('clicked');
       $('.overlay-text').removeClass('clicked');
    }
    else {
        setTimeout(function(){$('.overlay-text').show();},1000);
        $(this).addClass('clicked');
        $('.overlay-text').addClass('clicked');
    }
});

我们只需要添加一个以 true 开头的全局变量。一旦发生点击,立即设置为 false,1 秒后设置为 true。然后我们只检查它是否为真,如果为假则不执行任何操作:

var notdouble = 1;
$('div, .overlay-text').on('click', function (e) {
    if (notdouble) {
        if ($(this).hasClass('clicked')) {
           $('.overlay-text').hide();
           $('div').removeClass('clicked');
           $('.overlay-text').removeClass('clicked');
        }
        else {
            setTimeout(function(){$('.overlay-text').show();},1000);
            $(this).addClass('clicked');
            $('.overlay-text').addClass('clicked');
        }
        notdouble=0;
        setTimeout(function(){notdouble=1;},1000);
    }
});

工作示例: jsFiddle

请注意,这是根据 Fiddle 版本 13 中的新结构构建的,因此它不能与原始结构的固定版本完全兼容。不过这个概念可以进行调整。

关于javascript - Div 转换 - IE 与其他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23763679/

相关文章:

javascript - 如何将生成的元素插入数组并在 React 中渲染它们

javascript - 如何获得 SVG 文本的实际高度(不是边界框高度)

jquery - 如何让鼠标滚轮滚动到 mediafire.com 中的部分

javascript - jQuery 第 n 个子项中的每个 div

javascript - 无法点击使用 "Show a popup when hovering over a link or button"后出现的框中的任何内容

javascript - Google MAPS 不尊重 DIV CSS 样式

javascript - Javascript 插件可将数字转换为特定于文化的货币格式,并将特定货币格式的数字取消格式化为普通数字

javascript - 在 IE9 中使用 history.pushstate

javascript - 自动完成中的变音符号

javascript - 如何在 for 循环中复制 JavaScript