【问题标题】:CSS :not(:first-of-type) isn't working on div but works on other elementsCSS :not(:first-of-type) 不适用于 div 但适用于其他元素
【发布时间】:2022-07-07 23:28:31
【问题描述】:

我正在创建一个手风琴,其中第一个元素是打开的。归功于代码here

对这段代码的主要修改是我想在主标题下放一些潜台词,所以我创建了一个 div 并将 h2 和 h3 包装在其中。你可以在下面看到我的 HTML、CSS 和 JS:

$(function() {
  $(".accordion-content:not(:first-of-type)").css("display", "none");
  $(".js-accordion-title:first-of-type").addClass("open");

  $(".js-accordion-title").click(function() {
    $(".open").not(this).removeClass("open").next().slideUp(300);
    $(this).toggleClass("open").next().slideToggle(300);
  });
});
.accordion-title {
  border-top: 1px solid #BEBEBE;
  padding: 2em 0;
  background: #F7F7F7;
}

.accordion-container .accordion-title h2  {
  position: relative;
  margin: 0;
  background-color: #F7F7F7;
  font-size: 32px;
  font-weight: 700;
  text-transform: uppercase;
  color: #DA15B6;
  text-align: center;
  cursor: pointer;
  margin-bottom: .125em;
}

.accordion-container .accordion-title h3 {
  background-color: #F7F7F7;
  font-size: 18px;
  letter-spacing: 0.9px;
  line-height: 1.5em;
  font-weight: 600;
  text-transform: uppercase;
  color: #000;
  text-align: center;
}

.price-number {
  font-size: 25px;
  letter-spacing: 0.54px;
  font-weight: 700;
}

.accordion-container .accordion-title h2::after {
  content: '3';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}
.accordion-container .accordion-title.open h2::after {
  content: '2';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}

/*CSS for CodePen*/

.accordion-content {
  padding-left: 2.3125em;
}
.accordion-container {
  width: 100%;
  margin: 0 auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="accordion" class="accordion-container">
  <div class="accordion-title js-accordion-title">
    <h2 class="price-plan-name">Standard</h2>
    <h3 class="starting-price">Starting at
      <span class="price-number">$1,650</span></h3>
  </div>
  <div class="accordion-content">
    <p>Accordion Content1</p>
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Pro</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$2,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content2
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Elite</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$3,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content3
  </div>
</div>

我遇到的问题是尝试在页面加载时打开第一个手风琴内容。这应该可以通过 JS 的第一行来实现,"$(".accordion-content:not(:first-of-type)").css("display", "none");"但它似乎不起作用。我认为这与 div "accordion-title" 和 div "accordion-content" 之间的冲突有关。例如,如果我将“accordion-content”更改为具有 p 或 h5 标签,则代码将正常工作。关于如何解决这个问题有什么建议吗?

提前致谢。

【问题讨论】:

  • &lt;div class="accordion-content"&gt; 匹配.accordion-content,它是一个div,它是父级中的第二个div,所以它匹配:not(:first-of-type)。您是否期望 :first-of-type 表示“与其他选择器相结合的第一件事”?
  • @Quentin 我认为:not(:first-of-type) 的想法是除了第一个accordion-content 之外的所有display: none。我以与原始 codepen 相同的方式接近它。
  • 没有。 :not(:first-of-type) 表示“不是第一个元素,在父元素中,属于同一类型”,该类型为div
  • 我明白了,这打破了:not(:first-of-type) 的含义,我更容易理解。正如@Huangism 建议的那样,将伪类更改为:first 适用于这种情况。

标签: javascript html jquery css


【解决方案1】:

First of type 以父级中的第一个 div(在您的情况下)为目标,而不是基于您提供的类,因此它不会像您期望的那样工作

你可以改用这个

$( ".accordion-content:not( :first )" ).css( "display", "none" );

或者您可以将它们全部设置为在 css 中不显示,然后使用 js 或 css 中的类打开第一个,然后在 js 或标记中添加该类

$(function() {
  $(".accordion-content:not(:first)").css("display", "none");
  $(".js-accordion-title:first-of-type").addClass("open");

  $(".js-accordion-title").click(function() {
    $(".open").not(this).removeClass("open").next().slideUp(300);
    $(this).toggleClass("open").next().slideToggle(300);
  });
});
.accordion-title {
  border-top: 1px solid #BEBEBE;
  padding: 2em 0;
  background: #F7F7F7;
}

.accordion-container .accordion-title h2  {
  position: relative;
  margin: 0;
  background-color: #F7F7F7;
  font-size: 32px;
  font-weight: 700;
  text-transform: uppercase;
  color: #DA15B6;
  text-align: center;
  cursor: pointer;
  margin-bottom: .125em;
}

.accordion-container .accordion-title h3 {
  background-color: #F7F7F7;
  font-size: 18px;
  letter-spacing: 0.9px;
  line-height: 1.5em;
  font-weight: 600;
  text-transform: uppercase;
  color: #000;
  text-align: center;
}

.price-number {
  font-size: 25px;
  letter-spacing: 0.54px;
  font-weight: 700;
}

.accordion-container .accordion-title h2::after {
  content: '3';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}
.accordion-container .accordion-title.open h2::after {
  content: '2';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}

/*CSS for CodePen*/

.accordion-content {
  padding-left: 2.3125em;
}
.accordion-container {
  width: 100%;
  margin: 0 auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="accordion" class="accordion-container">
  <div class="accordion-title js-accordion-title">
    <h2 class="price-plan-name">Standard</h2>
    <h3 class="starting-price">Starting at
      <span class="price-number">$1,650</span></h3>
  </div>
  <div class="accordion-content">
    <p>Accordion Content1</p>
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Pro</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$2,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content2
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Elite</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$3,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content3
  </div>
</div>

【讨论】:

  • 这非常有效。我在想必须有一种方法来编辑那个伪类来实现我想要的。替代建议也有效。谢谢!
【解决方案2】:

.hide()全部.accordion-content,然后将.open添加到.first().js-accordion-title.show().first().accordion-content

$(function() {
  $('.accordion-content').hide();
  $(".js-accordion-title").first().addClass('open').next().show();
  $(".js-accordion-title").click(function() {
    $(this).toggleClass("open").next().slideToggle(300);
  });
});
.accordion-container div.accordion-content:first-of-type {
  background: red;
}

.accordion-title {
  border-top: 1px solid #BEBEBE;
  padding: 2em 0;
  background: #F7F7F7;
}

.accordion-container .accordion-title h2  {
  position: relative;
  margin: 0;
  background-color: #F7F7F7;
  font-size: 32px;
  font-weight: 700;
  text-transform: uppercase;
  color: #DA15B6;
  text-align: center;
  cursor: pointer;
  margin-bottom: .125em;
}

.accordion-container .accordion-title h3 {
  background-color: #F7F7F7;
  font-size: 18px;
  letter-spacing: 0.9px;
  line-height: 1.5em;
  font-weight: 600;
  text-transform: uppercase;
  color: #000;
  text-align: center;
}

.price-number {
  font-size: 25px;
  letter-spacing: 0.54px;
  font-weight: 700;
}

.accordion-container .accordion-title h2::after {
  content: '3';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}
.accordion-container .accordion-title.open h2::after {
  content: '2';
  position: absolute;
  right: 25px;
  bottom: -10px;
  font-size: 1.3em;
}

/*CSS for CodePen*/

.accordion-content {
  padding-left: 2.3125em;
}
.accordion-container {
  width: 100%;
  margin: 0 auto;
}
<div id="accordion" class="accordion-container">
  <div class="accordion-title js-accordion-title">
    <h2 class="price-plan-name">Standard</h2>
    <h3 class="starting-price">Starting at
      <span class="price-number">$1,650</span></h3>
  </div>
  <div class="accordion-content">
    <p>Accordion Content1</p>
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Pro</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$2,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content2
  </div>
  <div class="accordion-title js-accordion-title">
    <h2>Elite</h2>
    <h3 class="accordion-subtitle">Starting at
      <span class="price-number">$3,950</span></h3>
  </div>
  <div class="accordion-content">
    Accordion Content3
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2022-06-30
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多