【问题标题】:how to use attributes to show-hide elements with CSS3 transitions?如何使用属性通过 CSS3 过渡显示隐藏元素?
【发布时间】:2025-12-31 11:25:16
【问题描述】:

我正在使用这样的 CSS3 过渡:

if( pop.attr('status') == 'visible' ) {
    pop.attr('status', 'hidden')            
        // pop transition - class of "pop" was added when showing the element
       .addClass('reverse out')
       .hide('fast')                    
   }

// clean up pop() transition 
window.setTimeout( function() {
   pop.removeClass('reverse out pop');
   }, 350); 

问题:
有没有办法通过状态属性处理可见性并且仍然有 CSS3 转换?我宁愿像这样使用一些 CSS 规则:

pop[status="hidden"]   { display: none; }
pop[status="visible"]  { display: block; }

而不是使用 hide() 和 show(),因为我有时最终会看到状态设置为 hidden 的可见元素,这使我的脚本失败

因此,仅使用状态来确定可见性对我来说更有意义(并且更少混淆)。

感谢您的意见!

编辑
我正在展示这样的元素:

    pop.attr('status','visible')         
        // pop() transition
        .addClass('ui-panel-active pop in')
        .show('fast')

    // clean up pop transition
    window.setTimeout( function() { 
       $popPanel.removeClass('in');
       }, 350);                                        

Status 是我分配给元素以监视它是否可见的属性。我正在使用来自 Jquery Mobile 的 CSS3 过渡。让我知道是否也应该发布这些。

感谢您的帮助。

编辑 2: 这是一个 jsfiddle - http://jsfiddle.net/hDGVZ/9/

【问题讨论】:

  • 在这个例子中我没有看到任何 CSS 过渡。你能发布相关的 CSS/设置一个演示吗?
  • 您确定status 是真实属性吗?我从来没有听说过它,也找不到任何参考。此外,应该如何在两个二进制(开/关)状态之间发生转换(插值)?通常你会使用opacity CSS 属性或类似属性。
  • 你能发布 reverse out pop css 类吗?你确定你使用的是 css3 吗?
  • @RobW:这里的小提琴:jsfiddle.net/hDGVZ/6

标签: javascript jquery css visibility css-transitions


【解决方案1】:

您不必通过 status 属性来跟踪状态,因为这已经在 jQuery 的 :visible 伪选择器中可用。

我已经清理了你的代码,演示:http://jsfiddle.net/hDGVZ/11/

$(document).on('click', '.trigger', function (event) {
    $('.popMe').each(function() { // For every .popUp element...
        var $this = $(this);
        // Clean-up, called upon finish of hide / show
        function onFinish() {
            $this.removeClass('reverse out pop in');
        }
        if ($this.is(':visible')) { // Visible?
            $this.addClass('reverse out').hide('fast', onFinish);
        } else {
            $this.addClass('ui-panel-active pop in').show('fast', onFinish);
        }
    });
});

如果你不想为每个元素都实现这个,你可以创建一个插件:

演示:http://jsfiddle.net/hDGVZ/12/

(function($) {
    $.fn.toggleVisible = function() {
        return this.each(function() {
            var $this = $(this);
            // Clean-up, called upon finish of hide / show
            function onFinish() {
                $this.removeClass('reverse out pop in');
            }
            if ($this.is(':visible')) { // Visible?
                $this.addClass('reverse out').hide('fast', onFinish);
            } else {
                $this.addClass('ui-panel-active pop in').show('fast', onFinish);
            }
        });
    };
})(jQuery);

$(document).on('click', '.trigger', function (event) {
    // Usage:
    $('.popMe').toggleVisible();
});

【讨论】:

  • 啊。 :visible 听起来不错。感谢您清理。让我们看看如何将它与我的脚本的其余部分结合起来。再次感谢!
  • @frequent 我在答案末尾添加了一个简单的插件。新的解决方案就像调用$('.popMe').toggleVisible(); 一样简单。
  • 酷。尝试将其插入我的插件 (github.com/frequent/multiview/blob/master/…)
  • @frequent 您的代码格式看起来不舒服。考虑使用jsbeautifier.com 来正确设置缩进。 *此外,如果您使用 Stack Overflow 上发布的任何材料,您必须提及原始来源/作者(请参阅本页底部的许可说明)。