Перебор divs для определения родительских высот

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Существует несколько разделов. В каждом разделе есть несколько вкладок. Я хочу получить высоту первой вкладки (.tab-content) и применить ее высоту к разделу, в котором она находится (.tab). Это должно происходить с каждым разделом по отдельности — отсюда и цикл. Цикл, похоже, в настоящее время не задействован, и самая первая высота в .tab-content применяется ко всем разделам. Почему мой цикл не работает?

Живой пример: https://staging.123innovation.co.uk/careers/faq

JS

     function tabParentHeight() {

$(".tabs").each(function() {

  var ph = $(this).outerHeight();
  $(this).find('.tab-content:first').css('min-height', 0);
  var ch = $(this).find('.tab-content:first').outerHeight();

  if (ch > ph) {
    $(this).css({
      'height': ch   'px'
    });
  }
});

}


$(document).ready(function () {


// TABS

// Run Tab Height
tabParentHeight();

$('section a').click(function(event) {
  event.preventDefault();
  $(this).addClass('active');
  $(this).siblings().removeClass('active');

  var ph = $(this).parent().height();
  var ch = $(this).next().height();

  if (ch > ph) {
    $(this).parent().css({
      'height': ch   'px'
    });
  } else {
    $(this).parent().css({
      'height': 'auto'
    });
  }
});

});


$(window).resize(function() {
  // Run Tab Height
  tabParentHeight();
});

$(document).resize(function() {
  // Run Tab Height
  tabParentHeight();
});
 

HTML

 <section class="tab">

              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative active" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content One</h3>
                  <p>Content goes here</p>
              </div>



              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content Two</h3>
                  <p>Content goes here</p>
              </div>



              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content Three</h3>
                  <p>Content goes here</p>
              </div>


</section>



<section class="tab list ml2 pl0 tf w-100 h-auto db relative">


              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative active" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content One</h3>
                  <p>Content goes here</p>
              </div>



              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content Two</h3>
                  <p>Content goes here</p>
              </div>



              <a class="tab-link link pointer blue hover-teal no-underline d tab-link w-33-ns pb3 ba bl-0 bt-0 br-0 b--dotted b--black-30 db relative" target="_blank">
              <span class="fa-li"><i class="fas fa-caret-down blue teal rm-90"></i></span>
              Title One
              </a>

              <div id="tab-21" class="tab-content w-two-thirds-ns h-auto pt3 pb2 pl3 pl5-ns">
                  <h3 class="dn db-ns">Content Three</h3>
                  <p>Content goes here</p>
              </div>


</section>
 

Комментарии:

1. Можете ли вы поделиться HTML-кодом? Это помогло бы увидеть структуру и выяснить, какие элементы связаны с классами .tab и .tab-content .

2. Привет, я добавил полный JS и HTML

3. Похоже, у вас опечатка в вашем идентификаторе. Разве это не должно быть $(«.tabs») вместо $(«.tab») ?

4. исправлен класс tab — все еще не выполняется цикл

5. зачем вам нужно изменять высоту? разве это не автоматически?

Ответ №1:

Не уверен, как именно генерируются эти элементы, но по какой-то причине это вызывает проблему. все содержимое вкладки имеет min-height: 100% атрибут, и с тех пор, как вы добавили свой скрипт, все они имеют ту же высоту, что и первый.

В любом случае, чтобы устранить проблему, вы можете удалить min-height: 100% tab-content класс in в своем css или сделать что-то подобное в своем скрипте:

 $('.tabs').each(function() {
    $(this).find('.tab-content').css('min-height', 0);
    $(this).outerHeight($(this).find('.tab-content').outerHeight());
});
 

Редактировать: можете ли вы заменить свою функцию tabParentHeight() на:

 $(".tabs").each(function() {

  var ph = $(this).outerHeight();
  $(this).find('.tab-content:first').css('min-height', 0);
  var ch = $(this).find('.tab-content:first').outerHeight();

  if (ch > ph) {
    $(this).css({
      'height': ch   'px'
    });
  }
}); 

Комментарии:

1. Удаление min-height 100% на самом деле ничего не делает.

2. Реальная проблема заключается в цикле — первая высота все еще применяется ко всем разделам. Цикл не применяет уникальную первую высоту к своему собственному разделу.

3. Таким образом, каждый .tab выводит: height: 1116px; когда .tab one будет height: 1116px; а вкладка two будет height: 530px; например

4. пожалуйста, смотрите Редактирование. вы можете перенастроить свою кодовую базу на основе этого. цель состоит в том, чтобы удалить min-height: 100% содержимого вкладки, потому что по какой-то причине оно наследует высоту первого. Я подозреваю, что все они генерируются в одном и том же div перед распределением по соответствующим разделам.

5. Я полностью удалил минимальную высоту из css. Это не требовалось. Я вставил ваш обновленный JS, и снова я все еще получаю одинаковую высоту во ВСЕХ разделах.