gpt4 book ai didi

JQuery 3.1.1 和 CSS flexbox

转载 作者:行者123 更新时间:2023-11-28 16:02:25 25 4
gpt4 key购买 nike

当使用 JQuery 的淡入淡出功能时,如果一个元素以 'display: none' 开头然后淡出,JQuery 将在元素淡入时注入(inject) 'display: block'。

在 flexbox 布局中,这会导致元素换行到下一行。

当我在父级上禁用 display:flex 时,它的行为符合预期。

有没有办法在最初需要隐藏的特定元素上禁用 display:flex

我可以通过使用来克服这个问题:

$('el').fadeIn().css('display','inline-block');

但这种方法在这种情况下并不可取。有什么建议吗?

这是一个演示

$('#clickme').click(function() {
$('#test').fadeToggle();
return false;
});
#flex {
display: flex; /* BREAKS JQUERY FADE, JQUERY INJECTS DISPLAY:BLOCK; */
flex-direction: column;
}
#main {
flex: 1;
}
.hidden {
display: none;
}
<script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<body id="flex">
<div id="main">
<span class="tools">
<a class="a" href="" id="clickme">Click Me</a>
<span id="test" class="hidden">I should be inline!</span>
</span>
</div>
</body>

如果您在 #flex 上禁用 display:flex,它会按预期/期望的方式工作。

最佳答案

那是因为,当您显示一个元素时,jQuery 必须猜测它的显示。那是因为 CSS 设计得很糟糕。 dislay: none 不应该存在。

jQuery 在其 getDefaultDisplay 函数中执行此操作:

function getDefaultDisplay( elem ) {
var temp,
doc = elem.ownerDocument,
nodeName = elem.nodeName,
display = defaultDisplayMap[ nodeName ];

if ( display ) {
return display;
}

temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = jQuery.css( temp, "display" );

temp.parentNode.removeChild( temp );

if ( display === "none" ) {
display = "block";
}
defaultDisplayMap[ nodeName ] = display;

return display;
}

基本上,它会创建一个相同类型的新元素并将其插入到正文中。它的计算 display 被认为是正在显示的元素的默认显示。这种方法太容易受骗了,老版本的 jQuery 在我看来更好。

无论如何,他的问题是您将 body 样式设置为 flex 容器。 flex 容器的子容器被阻塞。因此,该虚拟元素的计算 display 将是 "block",这就是您的元素将收到的内容,即使您的元素不参与 flex 布局也是如此。

所以最好避免 display: flex 在 body 上。您可以添加一个包装器。

$('#clickme').click(function() {
$('#test').fadeToggle();
return false;
});
#flex {
display: flex;
flex-direction: column;
}
#main {
flex: 1;
}
.hidden {
display: none;
}
<script type="text/javascript" src="//code.jquery.com/jquery-3.1.1.min.js"></script>
<div id="flex">
<div id="main">
<span class="tools">
<a class="a" href="" id="clickme">Click Me</a>
<span id="test" class="hidden">I should be inline!</span>
</span>
</div>
</div>

关于JQuery 3.1.1 和 CSS flexbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39855799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com