jQuery: установите верхнюю позицию на 1/2 разницы между содержащимся дочерним элементом и родительским

#javascript #jquery #debugging #syntax

#javascript #jquery #отладка #синтаксис

Вопрос:

Хорошо, итак, у меня есть некоторые всплывающие эффекты пузырьков с абсолютно расположенными и скрытыми дочерними элементами div.caption . div.caption имеет родительский элемент с именем a.logo .

Я хочу вычесть высоту div.caption из a.logo и установить .css("top",..) равную ПОЛОВИНЕ этого числа.

Например:

a.логотип = 200 пикселей (высота) div.заголовок — 250 пикселей (высота)

-( (250 — 200)/2 ) = -25

Результатом должно быть вертикальное центрирование дочернего элемента по отношению к родительскому (несмотря на то, что он переполняет родительский.

У меня есть следующий HTML

 <a class="logo" href="#">
  <div class="caption">Caption Text</div>
</a>

<a class="logo" href="#">
  <div class="caption">Caption Text</div>
</a>

<a class="logo" href="#">
  <div class="caption">Caption Text</div>
</a>
 

и jQuery

 $("div.caption").each(function() {
    var theHeight = $(this).height();
    var container = $('this').closest('a.logo').height();
    if( theHeight > container ) {
        $(this).css("top",-( (theHeight-container)/2 )   "px");
    }   
});
 

Что действительно сбивает меня с толку, так это то, что $(this).closest('a.logo') возвращает height(); 40 пикселей, но DOM сообщает 200 пикселей для высоты элементов.

Каким-то образом мой таргетинг для переменных отключен, но мне нужно использовать .this() , поскольку существует несколько экземпляров всех этих целей, и мне нужно установить свойство top индивидуально.

Ответ №1:

Удалите кавычки вокруг this . В данный момент ваш код ищет элемент <this> и находит ближайший a.logo , которого не существует. height устанавливается null равным нулю в числовом контексте.

 var container = $(this).closest('a.logo').height();
 

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

1. Я подумал: «ВАУ, такая глупая ошибка!» но, к сожалению, это не исправляет ситуацию, по-прежнему возвращая то же значение 40 пикселей, которое кажется неправильным и вызывает сбой эффекта центрирования.

2. На самом деле, вот лучшая иллюстрация проблемы: jsfiddle.net/hvJ8M/3 … Абсурдно, я могу скопировать это непосредственно в свой рабочий код, и это не работает, хотя это работает в демонстрации JSFiddle…

3. Вы уверены, что выбираете правильные элементы в своем реальном коде? Добавьте background:red (или какой-то идентификатор) в свой реальный код, чтобы увидеть, какие элементы затронуты. Кроме того, какой браузер?

4. Да, я знаю, что кажется, что это так, но я не могу найти ничего другого или неправильно ориентированного в моем реальном коде … хм

5. Вот полный HTML-код, скопированный с сайта: <a class=»logo» target=»_blank» href=»


wordpress.org «><div class=»всплывающее окно заголовка» style=»top: -129px; «><p>Мы ЛЮБИМ WordPress и рекомендуем его в качестве нашей CMSдля проектов любого размера. </p></div><img src=»assets/wordpress_logo.jpg » alt=»Мы ЛЮБИМ WordPress и рекомендуем его в качестве нашей CMS для проектов любого размера» title=»WordPress как CMS» class=»выровнять один размер-полный wp-image-155″></a>