【问题标题】:External + Inline Styles vs. External Only外部 + 内联样式与仅外部样式
【发布时间】:2018-12-06 16:46:06
【问题描述】:

问题+概述

下面是两个包含div 的sn-ps,最初隐藏,然后单击button 和jQuery 的.show() 显示。两个divs 都有样式display: grid; 被外部样式表应用。区别如下:

在示例 1 中,内联特异性优先于外部样式表。显示 div 时保留网格布局。

在示例 2 中,display: grid; 被级联覆盖。显示 div 时保留网格布局。

在我看来,以下两个 sn-ps 应该具有相同的结果,因为两种 display: grid; 样式都被覆盖了 - 尽管似乎方式略有不同。

这里发生了什么导致第一个示例正常工作,而第二个示例破坏了网格布局?

如果可能的话,我更喜欢技术性的、低层次的解释。

我包含了 jQuery 标记,因为它是 jQuery 做一些我不知道的魔法。

示例 1:内联 + 外部样式

在下面的sn-p中,我在外部样式表中设置了一个div的显示为display: grid;

我还将同一个div的显示设置为display: none; inline。

然后我使用 jQuery 的 .hide() 函数显示 div,并且 div 保留其网格布局。

$(document).ready(function() {
  $('#show-div').click(function() {
    $('#inline-style-div').show();
  });
});
#inline-style-div {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 50px 50px;
}

.grid-number {
  margin: 0;
  padding: 10px 25px 10px 25px;
  background-color: #333;
  color: white;
}

.grid-number:nth-child(even) {
  padding: 10px 25px 10px 25px;
  background-color: #ccc;
  color: #333;
}

#show-div {
  margin-top: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="inline-style-div" style="display: none;">
  <h5 class="grid-number">1</h5>
  <h5 class="grid-number">2</h5>
  <h5 class="grid-number">3</h5>
  <h5 class="grid-number">4</h5>
  <h5 class="grid-number">5</h5>
  <h5 class="grid-number">6</h5>
</div>

<button type="button" id="show-div">Show the div</button>

示例 2:仅外部样式

在这个 sn-p 中 - 在所有其他条件相同的情况下 - 我已在外部样式表中将上述 div 的显示顺序设置为 display: grid;display: none;

当我在这个例子中显示 div 时,div 不会保留它的网格布局。

$(document).ready(function() {
  $('#show-div').click(function() {
    $('#external-style-div').show();
  });
});
#external-style-div {
  display: grid;
  display: none;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 50px 50px;
}

.grid-number {
  margin: 0;
  padding: 10px 25px 10px 25px;
  background-color: #333;
  color: white;
}

.grid-number:nth-child(even) {
  padding: 10px 25px 10px 25px;
  background-color: #ccc;
  color: #333;
}

#show-div {
  margin-top: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="external-style-div">
  <h5 class="grid-number">1</h5>
  <h5 class="grid-number">2</h5>
  <h5 class="grid-number">3</h5>
  <h5 class="grid-number">4</h5>
  <h5 class="grid-number">5</h5>
  <h5 class="grid-number">6</h5>
</div>

<button type="button" id="show-div">Show the div</button>

【问题讨论】:

    标签: jquery html css


    【解决方案1】:

    使用 jQuery 的.show() 大致相当于调用.css( "display", "block" ),除了显示属性恢复到最初的样子。如果一个元素的显示值为inline,然后被隐藏并显示,它将再次显示inline

    在您的第一个示例中,jQuery 注意到内联显示值设置为 none,因此将其删除并让级联生效(感谢 @Alohci)。

    在您的第二个示例中,jQuery 注意到初始显示值设置为 none(忽略它之前的第一个分配,因为它不知道这一点),因此假设您希望将其设置为 @987654329 @当你使用show()时。

    Reference

    进一步阅读:How does jquery's show/hide function work?(类似问题)

    【讨论】:

    • 这是有道理的,但是,在我看来,在这两个示例中,jQuery 都应该缓存display: none;,因为这是应用于每个div 的最后一个样式。也许 jQuery 正在查看缓存的样式表而不是 DOM 元素,从而有效地导致它忽略了内联样式,这就是为什么它在第一个示例中只看到 display: grid
    • 刚刚进行了编辑以包含一些关于它的内容:) 这样它就不会混淆自己,因为它会将内联样式设置为 display:none;当你使用hide()
    • @CoryNorell 您是否尝试过仅将内联样式设置为“网格”而没有外部样式?我很想知道结果!
    • " jQuery 注意到初始显示值设置为 grid" 不,它没有。在这种情况下,它只是从样式属性中删除display:none 并让级联生效。除非调用 hide(),否则它不会记住显示是网格。
    • 我有。我坚持我的意见。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多