用JQuery切换div后重新加载CSS

时间:2017-03-23 16:40:31

标签: javascript jquery css css3 css-selectors

我已经找到了一种非常简洁的方法,可以通过Codepen的Tim Robert-Fitzgerald在过滤器中查看div的可见性,并且它在我的网站上工作得很好但是我需要根据我的需要稍微扩展它。 / p>

默认情况下,我有一个nth-child设置,删除第二个div的边框,但是当切换div时,这不会重新应用到第二个div。实际上它仍然被应用但是这是不可见的,因为div被设置为display:none;

一旦div被切换,我怎样才能让nth-child重新计算?

var $btns = $('.btn').click(function() {
  if (this.id == 'all') {
    $('#parent > div').fadeIn(450);
  } else {
    var $el = $('.' + this.id).fadeIn(450);
    $('#parent > div').not($el).hide();
  }
  $btns.removeClass('active');
  $(this).addClass('active');
})
* {
  box-sizing: border-box;
}
body {
  padding: 10px;
  background: #ecf0f1;
  font-family: helvetica, sans-serif;
  font-weight: 200;
}
.btn {
  border: none;
  background: linear-gradient(to bottom, #3498db, #2980b9);
  border-radius: 3px;
  font-family: Arial;
  color: #ffffff;
  padding: 5px 10px 5px 10px;
  text-decoration: none;
  margin: 5px;
}

.active {
  background: linear-gradient(to bottom, #3cb0fd, #3498db);
  text-decoration: none;
}
.box {
  background:#2980b9;
  padding: 10px;
  height: 100px;
  width: calc(33% - 10px);
  float: left;
  margin: 5px;
  text-align: center;
  border-radius: 3px;
  color: #fff;
  border:4px solid #000;
}

.box:nth-child(2) {
border:none;
}

.spacer {
  clear: both;
  height: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="active btn" id="all">Show All</button>
<button class="btn" id="a">Show A</button>
<button class="btn" id="b">Show B</button>
<button class="btn" id="c">Show C</button>
<button class="btn" id="d">Show D</button>

<div class="spacer"></div>

<div id="parent">
  <div class="box a b">A &amp; B</div>
  <div class="box a">A</div>
  <div class="box b">B</div>
  <div class="box c">C</div>
  <div class="box d">D</div>
</div>

2 个答案:

答案 0 :(得分:0)

这不起作用,因为元素仍在那里,只是隐藏。您可能需要考虑使用其他类来控制边框(或者您想要的任何其他样式),并使用与添加和删除活动类相同的方式交换jQuery。

答案 1 :(得分:0)

您使用的CSS选择器(:nth-child(2))不是您所需要的,因为它基于HTML DOM元素。第二个元素永远不会改变DOM中的位置,它只是被隐藏。

我不相信这是一个CSS解决方案,但有一个jQuery解决方案。

我带了你的Codepen并修改了很少的东西

CSS(而不是.box:nth-child(2)

.box.no-border {
    border:none;
}

JS

var $btns = $('.btn').click(function() {
  if (this.id == 'all') {
    $('#parent > div').fadeIn(450);
  } else {
    var $el = $('.' + this.id).fadeIn(450);
    $('#parent > div').not($el).hide();
  }
  $btns.removeClass('active');
  $(this).addClass('active');

  $('.box').removeClass('no-border'); // reinitialize
  $('.box:visible').eq(1).addClass('no-border'); // apply the class
})

请注意,eq()方法是基于0的索引,因此.eq(1)将为您提供第二个元素。添加:可见只会获得屏幕上可见的内容。