2015-06-09 3 views
1

Каким образом следует управлять многострочной анимацией контейнера (например, блоком контента или предупреждением) анимации?Многострочная анимация разворачивания контейнера

http://plnkr.co/edit/Qq5fzeb3GBengviVNimC?p=preview

.alert { 
    background: turquoise; 
    color: white; 
    padding: 10px; 
    overflow: hidden; 

    opacity: 0; 
    max-height: 0; 
} 

body:hover .alert { 
    display: block !important; 
    opacity: 1; 
    -webkit-transition: 2s; 
    -moz-transition: 2s; 
    -ms-transition: 2s; 
    transition: 2s; 
    max-height: 100px; 
} 

Проблема здесь «многострочный», как вы можете видеть, высота блока не является фиксированной величиной.

<div class="alert">Alert!<br>Alert!<br>Alert!</div> 

Хотя max-height: 100px близко реальной высоты блока, он отлично работает. Если max-height меньше, анимация в конце концов будет неровной, а max-height: 9999px сделает переход слишком быстрым.

Можно ли это сделать без расчета точной высоты в JS?

+0

Насколько я знаю, высота CSS не может быть плавно перешедших без фиксированные размеры. См. Http://stackoverflow.com/questions/6089548/css3-height-transition-not-working для обсуждения. Вам не нужно указывать высоту заблаговременно в CSS, если вы используете JS, как показывает эта ссылка, или как TijnvW продемонстрировал в своем ответе. – Palpatim

ответ

-1

Расчет высоты можно сделать JQuery на самом деле, я сделал следующее, чтобы решить вашу проблему:

$("#out").html("Block height: " + $("#alert").height()); 
 
//solely for demonstration, you can delete this line 
 

 
$("#alert").css('height','0px'); 
 

 
$('#alert').mouseover(function(){ 
 
    $("#alert").css('height', '58px'); 
 
}); 
 
$('#alert').mouseout(function(){ 
 
    $("#alert").css('height', '0px'); 
 
});
#alert { 
 
    background: turquoise; 
 
    color: white; 
 
    padding: 10px; 
 
    overflow: hidden; 
 
    opacity: 0; 
 
    //max-height: 0; this causes .height() to always display '0' so delete this here, and set this via jQuery 
 

 
} 
 

 
body:hover #alert { 
 
\t display: block !important; 
 
\t opacity: 1; 
 
    -webkit-transition: 2s; 
 
    -moz-transition: 2s; 
 
    -ms-transition: 2s; 
 
    transition: 2s; 
 
// max-height: 100px !important; set this via jQuery 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p>Hello!</p> 
 
<div id="alert">Alert!<br>Alert!<br>Alert!</div> 
 
<p>Hello again!</p> 
 

 
<span id="out"></span>

+0

ОП, заданный в их вопросе: «Можно ли это сделать без вычисления точной высоты в JS?» – Palpatim

+0

@Palpatim Да, это был второй вопрос. Я буду принимать ответ JS, если это невозможно сделать только с CSS. Но такое решение страдает от жестко заданной высоты, высота также может быть изменена при масштабировании, изменении размера или изменении содержимого блока. – estus

+0

Ooops, полностью упустил слово «без», извините! Не знаю, можно ли это сделать в чистом CSS, так что мне любопытно, есть ли у кого-то другое решение. – SJDS

Смежные вопросы