【问题标题】:jQuery adding style on element - not possible transforming it after with CSSjQuery 在元素上添加样式 - 使用 CSS 后无法对其进行转换
【发布时间】:2014-07-21 14:12:26
【问题描述】:

我最初隐藏了一个主面板,并在网络运行时滑动。它有这种风格:

.contentPanel {    
    top: calc(40% - 1px);    
    height: 50%;  
    padding:10px;
    font-size:1.2em;
    overflow-y: scroll;
    overflow-x: hidden;
    left: 20%;
   width: 75%;
}

.contentPanel{

   transition: transform 5000ms cubic-bezier(0.095, 0.725, 0.020, 1.005); 
}

网站运行时,jQuery 计算窗口的宽度并将其隐藏,将 X 平移出窗口:

  $('.contentPanel').css('left',window.innerWidth+"px");

而且,理论上,CSS 应该通过添加类 .expanded 将其带到正确的位置:

$('.contentPanel').addClass('expanded');

将它带到它的 0% 平移 X 位置:

.expanded {
    transform: translate(0%);
}

问题:CSS 什么都不做,因为 jQuery 在其 HTML 标签上设置了 .contentPanel 样式,如下所示:

<div class="contentPanel expanded" style="left: 1366px;">

即使添加了 translateX(0%),由于 HTML 的开始标记属性上给出了 X px,因此没有任何移动。

【问题讨论】:

    标签: jquery html css transform


    【解决方案1】:

    我会制作一个 100% 宽度(默认值)的包装器,您可以使用它来隐藏 .contentPanel。这样你只需要切换类而不用弄乱 $.css() 。

    http://jsfiddle.net/M8PQR/

    HTML

    <div class="wrapper">
        <div class="contentPanel"></div>
    </div>
    
    <a class="toggle">show/hide</a>
    

    JAVASCRIPT

    var $wrapper = $('.wrapper');
    
    $('a.toggle').on('click', function() {
        $wrapper.toggleClass('expanded');
    });
    

    CSS

    .contentPanel {    
        top: calc(40% - 1px);    
        height: 50%;  
        padding:10px;
        font-size:1.2em;
        overflow-y: scroll;
        overflow-x: hidden;
        margin: auto;
       width: 75%;
        background: deepSkyBlue;
    }
    
    .wrapper{
        transform: translate(100%);
        transition: transform 5000ms cubic-bezier(0.095, 0.725, 0.020, 1.005);
    }
    
    .wrapper.expanded {
        transform: none;
    }
    
    .toggle {
        cursor: pointer;
    }
    

    【讨论】:

    • 这是一个很好的答案。我在问之前就这样做了,我想以其他方式做到这一点有两个原因:
    • - 在这种情况下有 7 个元素,每个元素都有单独的动画和 div,例如,屏幕上的 7 个全屏 div 很难通过 Firebug 导航。 - 任何不是第一个屏幕上的链接和按钮都是无效的,因为它们不能被点击,因为所有全屏 div 中的最后一个是唯一可以与用户交互的。
    • 你可以只使用 7 个包装器吗?
    • 是的。但是当 7 个被加载定位时,只有放置在最后一个添加的链接和按钮是可点击的。其余的都将放在更深的壁纸上,并且无法与用户进行交互(例如单击链接)。反正我要试试你的方法,然后告诉你。
    【解决方案2】:

    内联样式具有更高的优先级。在添加“扩展”类之前尝试将左侧属性设置为空白。像这样:

    $('.contentPanel').css('left',''); 
    $('.contentPanel').addClass('expanded');
    

    【讨论】:

    • 嗨伊万。没有。由于它是由 jQuery 提供的元素样式而被隐藏的,当取出该样式时,它只会出现在屏幕上而没有滑动效果(它从 1366px 变为 0 没有过渡动画)。然后在添加.expanded时,它已经在它的位置了
    【解决方案3】:

    您不能在添加.expanded 类之前将left 设置为auto 吗?

    $('.contentPanel').css('left', 'auto').addClass('expanded');
    

    也就是说,我认为迈克尔的解决方案是最好的。

    编辑

    或者您可以将.contentPanel 设置为transform: translateX(-100vw),就像发帖人喜欢的那样。

    大众有pretty good support now。不过,我暂时会避免使用 VH,因为 VH 在移动 Safari 中存在问题。

    【讨论】:

    • 不。自动左移使其向左移动,没有任何边距且没有动画。
    • 为什么不采取不同的方法,让 .contentPanel 自动翻译到屏幕外。将其设置为足够大的值(例如 5000 像素).contentPanel { transform: translateX(-5000px); },然后将 .contentPanel.expanded 设置为 { transform: initial; }。如果您担心动画因为距离太远而变得不流畅,那么设置自定义缓动曲线应该可以缓解这个问题。
    • 这也是一个解决方案,但我认为这是获得此解决方案的最后选择。电视的像素将超过 5000 像素,如果我们有方法可以考虑所有可能的情况,那么应该首先尝试这些方法。但我非常感谢您的帮助。
    • 如果你担心的话,你也可以说transform: translateX(-100vw)
    • Ops...caniuse.com/viewport-units 许多来自移动设备的人将不需要浏览器版本.. 可能会检测它是否是移动设备并为这些设备设置 -1000px 翻译,并为 -100vw其余的将是最好的解决方案
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多