2013-07-31 3 views
1

В принципе, я не могу получить ссылку More ..., чтобы оживить высоту следующего диапазона, когда нажата ссылка, которая имеет класс "dropdown". Он просто не оживляет вообще. Он анимируется только тогда, когда он изменен на ссылку Less..., и ссылка на ссылку Less... нажимается, чтобы свернуть дополнительный контент в абзаце. Как я могу получить ссылку More... для анимации при показе содержимого? Я сейчас переделываю высоту, должен ли я делать что-то другое вместо этого?Как получить остальную часть абзаца для анимации на More ... link?

Используя следующий JQuery код в $(document).ready(function() { });

$(".listitem").on("click", ".dropdown", function(event) { 
    event.preventDefault(); 
    var $this = $(this); 
    var type = $this.next("span").length > 0 && !$this.next("span").is(":visible") ? 'expand' : 'collapse'; 
    var theSpan = type == 'expand' ? $this.next("span") : $this.prev("span"); 
    if (type == 'expand') { 
     $this.insertAfter(theSpan); 
    } 
    else 
     $this.insertBefore(theSpan); 

    theSpan.animate({height: 'toggle'}, 250, function(){ 
     $this.text(type == 'expand' ? ' [ Less... ]' : '[ More... ]'); 
    }); 
}); 

У меня есть следующий структурированный HTML внутри ul тега (Все li теги одни и те же структуры):

<li> 
    <div class="listitem"> 
     <span style="font-weight: bold;">Headline</span> Here is some body copy for the headline that should expand with an animation when clicking on the More... link right here. <a href="#" class="dropdown red">[ More... ]</a><span class="hidden">Here is more text to be shown and it should animate when the More... link is clicked, but it currently does not!</span> 
    </div> 
</li> 

CSS:

ul 
{ 
    list-style: none outside none; 
    list-style-type: none; 
} 
ul li 
{ 
    padding: .4em; 
    margin-left: -20px; 
} 
.listitem 
{ 
    display: table; 
} 
.hidden 
{ 
    display: none; 
} 

EDIT

Вы можете увидеть проблему здесь: http://opportunityfinance.net/Test/conference-2013/highlights.html

мне нужен текст, чтобы остаться на той же линии, когда она расширяется, она не должна быть прижаты к следующей строке вниз. Есть ли способ сделать это с помощью white-space? или, возможно, display: inline ??

+0

http://jsfiddle.net/jDeuH/1/ Это то, что я получил от вашего публикуемую кода. При нажатии кнопки More ... отображается содержимое. Что вы пытаетесь достичь? – Gloria

+0

Я пытаюсь заставить его анимировать так, как он делает, когда нажата кнопка «Меньше ...». Мне нужно, чтобы он оживлял (скользить вниз), как он соскальзывает, когда нажимается «Меньше ...». Но при нажатии на кнопку «Больше ...» вы должны сдвигаться вниз. –

+0

На самом деле, я использую класс, называемый: .hidden {display: none; } 'на пробеле, а не с помощью' style = "display: none;" '... Обновлен мой вопрос. –

ответ

2

Это единственное, что я могу думать потом. Просто показывает/скрывает каждую букву по одному.

Он станет только html после того, как текст будет полностью загружен.

$(".expander").each(function(e) { 
    var expanded = false, 
     isExpanding = false, 
     $this = $(this).text("[More...]"); 
    $this.click(function() { 
     if(!isExpanding) {    
      isExpanding = true; 
      if(!expanded) { 
       var i = 0, 
        interval = setInterval(function() { 
        if(i < $this.prev().text().length) { 
         $this.prev().prev().text($this.prev().text().substring(0, i)); 
         i++; 
        } else { 
         $this.prev().prev().html($this.prev().html()); 
         clearInterval(interval); 
         isExpanding = false; 
        } 
       }, 1000/60);     
      } else { 
       var i = $this.prev().text().length - 1, 
        interval = setInterval(function() { 
        if(i >= 0) { 
         $this.prev().prev().text($this.prev().text().substring(0, i)); 
         i--; 
        } else { 
         clearInterval(interval); 
         isExpanding = false; 
        } 
       }, 1000/60); 

      } 
      expanded = !expanded; 
     } 
    }); 
}).prev().before("<span></span>").hide(); 

Demo

http://jsfiddle.net/CxX8n/9/

+0

Итак, вы используете теги «div», и это приводит к тому, что текст нажимается на следующую строку при его расширении (нажав ссылку «Больше ...»), поэтому это не хорошо. Мне нужно расширить его в пределах 'span' или внутри какого-то элемента, который собирается ОСТОРОЖНО, где он находится в абзаце. Он не может перейти к следующей строке при расширении. Он должен заменить «Больше ...», который должен быть «inline» с абзацем, а остальная часть копии. –

+0

Добавлена ​​ссылка, где вы можете увидеть эту проблему. –

+0

Теперь это очень интересно .... Спасибо, собираюсь попробовать и реализовать его сейчас ... Если работает, чем вы, мужчина !!! –

1

<span> является встроенным элементом, поэтому свойство height не применяется. Но вы пытаетесь переключить высоту, поэтому animate() продолжает форсировать display: inline-block, и почему он не работает в первый раз. Вместо этого попробуйте переключиться на opacity.

$(".listitem").on("click", ".dropdown", function(event) { 
    event.preventDefault(); 
    var $this = $(this); 
    var type = $this.next("span").length > 0 && !$this.next("span").is(":visible") ? 'expand' : 'collapse'; 
    var theSpan = type == 'expand' ? $this.next("span") : $this.prev("span"); 
    if (type == 'expand') { 
     $this.insertAfter(theSpan); 
    } 
    else 
     $this.insertBefore(theSpan); 

    theSpan.animate({opacity: 'toggle'}, 250, function(){ 
     $this.text(type == 'expand' ? ' [ Less... ]' : '[ More... ]'); 
    }); 
}); 

Вот JSFiddle

+0

Это нехорошо, потому что добавляет 'display: inline-block' к диапазону. Не спрашивайте меня, как это происходит, но это то, что происходит в Chrome, и заставляет span перейти к новой строке, вместо того, чтобы оставаться там, где находится в абзаце. –

+0

Это код: http://opportunityfinance.net/Test/conference-2013/highlights.html –

+0

@SolomonClosson Обновлен мой ответ для вас. – user1234