草庐IT

javascript - 从元素中删除类而不影响正在进行的 css 转换

coder 2024-07-26 原文

好的,我有一种情况,我基本上构建了一个小的通知下拉框,当用户做某事时发生,最后它转换为 opacity: 0;状态。

但是,由于用户可能会单击其他会再次触发此通知框的内容,因此我试图想出一种方法将其重置为正常状态,而不会影响任何正在进行的转换,并尝试使动画由 CSS 而不是 JavaScript 完成.

代码笔: http://codepen.io/gutterboy/pen/WoEydg

HTML:

<a href="#">Open Notify Window</a>

<div id="top_notify" class="top-notify">
    <div class="container-fluid">
        <div class="row">
            <div class="content col-xs-12">
                <div class="alert" role="alert"></div>
            </div>
        </div>
    </div>
</div>

SCSS:
body {
    text-align: center;
    padding-top: 150px;
}

.top-notify {
    position: fixed;
    top: 0;
    width: 100%;
    z-index: 9999;

    .content {
        text-align: center;
        background-color: transparent;
        transform-style: preserve-3d;
    }

    .alert {
        display: inline-block;
        transform: translateY(-100%);
        min-width: 250px;
        max-width: 500px;
        border-top-left-radius: 0;
        border-top-right-radius: 0;

        &.visible {
            transform: translateY(0%);
            transition: 0.8s 0s, opacity 1s 3.8s;
            opacity: 0;
        }

    }

}

JS:
$('a').on('click', function(e){
    e.preventDefault();
    myFunc();
});

function myFunc() {

    // Set file to prepare our data
    var loadUrl = "https://crossorigin.me/http://codepen.io/gutterboy/pen/ObjExz.html";

    // Run request

    getAjaxData(loadUrl, null, 'POST', 'html')

            .done(function(response) {

                var alert_el = $('#top_notify').find('.alert');

                // Update msg in alert box
                alert_el.text(response);
                alert_el.addClass('alert-success');

                // Slide in alert box
                alert_el.addClass('visible');

            })

            .fail(function() {
                alert('Problem!!');
            });

    // End

}

function getAjaxData(loadUrl, dataObject, action, type) {

    return jQuery.ajax({
        type: action,
        url: loadUrl,
        data: dataObject,
        dataType: type
    });

}

我知道我可以通过在 JS 中执行此操作将其重置为正常:
$('#top_notify').find('.alert').removeClass().addClass('alert'); // The classes it ends up with vary

...然而,这样做会在过渡完成之前删除类,使不透明度逐渐消失,并且它会立即消失。

我知道我可以在 JS 中做一个延迟来抵消 CSS 延迟,但这样做似乎不是一个很好的方法,因为你在 2 个不同的地方有时间。

有什么方法可以在保持动画由 CSS 完成的同时实现这一点,或者我必须改用 jQuery 的 animate所以我可以在动画完成后运行重置程序吗?

最佳答案

好吧,我想出了一个令人费解的一哈之后,想出了一个简单的解决方案。

我应该首先想到的简单解决方案是在 ajax 之前删除任何额外添加的类。称呼;我太专注于在 ajax 内做这件事阻止,当然那没有用,但是直到我开始尝试其他解决方案之前,我从未尝试过。

无论如何,简单的解决方案就是简单地移动这段代码:

 var alert_el = $('#top_notify').find('.alert');

...高于 ajax打电话,而不是在里面。

然后直接在它下面添加:
alert_el.removeClass('visible alert-success alert-info alert-danger alert-warning');

完整的功能代码是:
function myFunc() {

    // Set file to prepare our data
    var loadUrl = "https://crossorigin.me/http://codepen.io/gutterboy/pen/ObjExz.html";

    var alert_el = $('#top_notify').find('.alert');

    alert_el.removeClass('visible alert-success alert-info alert-danger alert-warning');

    // Run request

    getAjaxData(loadUrl, null, 'POST', 'html')

            .done(function(response) {

                // Update msg in alert box
                alert_el.text(response);
                alert_el.addClass('alert-success');

                // Slide in alert box
                alert_el.addClass('visible');

            })

            .fail(function() {
                alert('Problem!!');
            });

    // End

}

代码笔: http://codepen.io/gutterboy/pen/xRXbXy

我想出的另一个解决方案,虽然现在并不真正需要,但我想无论如何我都会发布它,以防将来它对我(或其他人)有用。

它不会删除 visible动画完成后的类(因为我知道没有办法在完成时提醒 JS)但是 visible class - 如果您使用此方法,我会更改其名称 - 不会添加任何新样式,它只是运行动画。

这是我如何做到的:

JavaScript 与上面的解决方案相同,都在 CSS 中。

TLDR;

基本上使用多个 CSS 动画来控制效果运行时的不同状态;底部的 CodePen。

更改在 .visible类和添加一些 @keyframes .

.visible 类:
&.visible {
    animation: slideDown 0.8s 0s, keepThere 3s 0.8s, fadeAway 1s 3.8s;
}

正如你所看到的,我们在这里去掉了任何额外的样式——这意味着当动画完成时,它基本上会重置回正常,这就是我们想要的。

现在,让我们分解这段代码:

我们在这里运行了 3 个不同的动画,重要的是要注意它们不会一个接一个地运行——这意味着它们不会等到一个完成后才开始下一个,因此我们需要包含 delay设置。

所以首先我们从 slideDown 开始动画片:
slideDown 0.8s 0s
如果您不熟悉 CSS 中的动画,那么基本上它所做的就是设置延迟 0s在它开始运行并且动画运行之前 0.8s ,这是动画:
@keyframes slideDown {
    0% {
        transform: translateY(-100%);
    }
    100% {
        transform: translateY(0%);
    }
}

所以,非常简单,只需用 transform 向下滑动即可来自 -100%0%而这个动画需要 0.8s正如我们在调用此动画时设置的那样。

现在,我希望对 保持可见3 秒 在它开始消失之前,但我们有一个问题;一旦动画结束,它就会返回到它的标准样式,在我们的例子中,这意味着它在返回到 transform: translateY(-100%) 时消失了。因为我们在 .visible 中没有额外的样式类,我们不能在那里放置任何额外的样式,因为我们将无法将它重置回它的原始状态(样式明智)。

但是我们该怎么办? fadeAway动画不会再开始 3 秒,目前它没有任何东西可以消失(确实如此,但您看不到它,因为它是隐藏的)。

解决方案是添加另一个动画 - 从技术上讲,它并没有真正为任何东西设置动画,它只是保持可见,直到 fadeAway动画开始。

这就是我们到达的地方:
keepThere 3s 0.8s
现在,记住我们 fadeAway 的设置动画是:fadeAway 1s 3.8s这意味着我们有 3 秒 在这个动画开始之前,因此在我们可以用它控制任何样式之前。

所以这就是这些参数值的用武之地 - 我们将延迟设置为 0.8s所以keepThere动画直到 slideDown 才开始一个已经完成;然后我们设置 3s 的持续时间计算等待时间,直到 fadeAway动画开始,这是keepThere动画片:
@keyframes keepThere {
    0%, 100% {
        transform: translateY(0%);
    }
}

由于它具有相同的开始和结束样式,我们将其合并为 0%, 100% 的一个选择器。正如你所看到的,这正如它所说的那样,在 3s 的设置持续时间内保持元素可见。直到我们可以使用 fadeAway 控制样式动画片。

我想从技术上讲,您可以将此功能合并到 fadeAway 中。动画,如果你想以 % 等于 来计算3 秒 因此知道什么时候开始淡出元素。

最后我们有 fadeAway动画片:
fadeAway 1s 3.8s
现在正如我们上面讨论的,我们已经知道为什么要设置 delay3.8s , 0.8s偏移量以允许 slideDown要运行的动画和额外的 3s延迟,因为这是我们希望元素可见的时间,直到它开始消失,然后当然消失需要 1s去完成。

这个动画是:
@keyframes fadeAway {
    0%, 100% {
        transform: translateY(0%);
    }
    0% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}

现在,由于keepThere动画已经完成,我们必须确保元素可见,这样淡入淡出有一些可见的东西实际上淡出,这就是为什么我们确保包含样式 transform: translateY(0%);作为从开始到结束的值(value);在那之后,我认为它在做什么就很明显了。

把它们放在一起,你会得到:
.top-notify {
    position: fixed;
    top: 0;
    width: 100%;
    z-index: 9999;

    .content {
        text-align: center;
        background-color: transparent;
        transform-style: preserve-3d;
    }

    .alert {
        display: inline-block;
        transform: translateY(-100%);
        min-width: 250px;
        max-width: 500px;
        border-top-left-radius: 0;
        border-top-right-radius: 0;

        &.visible {
            animation: slideDown 0.8s 0s, keepThere 3s 0.8s, fadeAway 1s 3.8s;
        }

    }

}

@keyframes slideDown {
    0% {
        transform: translateY(-100%);
    }
    100% {
        transform: translateY(0%);
    }
}

@keyframes keepThere {
    0%, 100% {
        transform: translateY(0%);
    }
}

@keyframes fadeAway {
    0%, 100% {
        transform: translateY(0%);
    }
    0% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}

代码笔: http://codepen.io/gutterboy/pen/QGqwBg

当然,为了能够再次运行它,必须重新添加该类,因此这就是删除 .visible 的目的。类在每次运行开始时(在 ajax 调用之前),然后当它在 ajax 调用期间被重新添加时,它会再次运行。

感谢@Nathaniel Flick 分享了让我走上这条道路的链接:)

好吧,希望这对看到我不再使用该选项的人有用哈!

关于javascript - 从元素中删除类而不影响正在进行的 css 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831805/

有关javascript - 从元素中删除类而不影响正在进行的 css 转换的更多相关文章

  1. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  8. css - 用 watir 检查标签类? - 2

    我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

  9. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  10. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

随机推荐