より堅牢にするために、新しい高さを設定するのではなく、設定した高さを削除するだけです。これにより、コンテナはその内容がいくら大きくても成長できます。
.collapsed
また、 CSSの高さの値をある値との間で前後に設定するのではなく、のような別のクラスを使用し、そのクラスを切り替えることをお勧めしますauto
。
編集したフィドルは次のとおりです:http://jsfiddle.net/DgBR2/9/
新しいJS:
$(".enlarge").click(function(){
$(this).siblings('.text').toggleClass('collapsed');
});
新しいCSS:
.container{
width:200px;
border:1px solid #cacaca;
font-size:12px;
position:relative;
margin:auto;
padding: 10px 10px 26px;
}
.text.collapsed {
height: 100px;
overflow: hidden;
}
.enlarge{
position:absolute;
height: 21px;
bottom: 0;
left: 0; right: 0; text-align: center;
color:blue;
}
OK、アニメーションを保存するために回答を編集しています。このソリューションは少しトリッキーで、3つの重要なことが含まれます。
要素が折りたたまれていないときにクラス分けされた要素のheight
値を取得します。これにより、マジックナンバーを使用せずに要素を目的の高さまで折りたたむことができます。.collapsed
これを行うには、新しい要素を作成して.collapsed
クラスを指定し、その新しい(レンダリングされていない)要素の高さを確認します。
展開された要素が折りたたまれたときに完全な高さを取得して、新しい高さにアニメートできるようにします-値.animate()
では機能しないためauto
です。
アニメーションの完了後に設定height
値を削除すると、テキスト要素の高さが固定されず、後でコンテンツを変更した場合に自動的に拡大/縮小されます。
これが新しいアニメーション対応のフィドルです:http://jsfiddle.net/DgBR2/13/
そして、JSは次のようになります。
$(".enlarge").click(function(){
var btn = $(this),
text = btn.siblings('.text'),
collapsed = text.hasClass('collapsed'),
// predict the height that the element SHOULD be: its full (scroll) height if it is currently collapsed, or the value of the 'height' CSS property that it will have when collapsed if it is not currently collapsed
height = collapsed ? text[0].scrollHeight : $('<div>', {'class': 'text collapsed'}).css('height');
text.animate({'height': height}, 400, function() {
// do all further changes after the animation completes
text.toggleClass('collapsed'); // we use this class for our animation logic, so we need to toggle it correctly
text.css('height', ''); // we don't want the text element to have a fixed height, so remove whatever height we set earlier
btn.text(collapsed ? 'Show Less' : '...(Show More)');
});
});
さらにモジュール化するための最後の編集:マークアップからエキスパンダーdivを削除し(セマンティックではないため)、JSに追加します。このアプローチにより、1)コンテンツがオーバーフローしないテキストコンテナにエキスパンダーボタンがないこと、2)新しいテキストdivを追加したり、既存のテキストdivのコンテンツを変更したりするときにエキスパンダーボタンを正しく表示/非表示にできることも保証されます。
JSをスケッチして、前の反復からどのように変更されたかを示します。
// PSEUDOCODE
$(document).ready(function() {
var addExpander = function() {
if (this.scrollHeight <= collapsedHeight) {
// remove expander button if it exists
} else if (this /* contains no expander button */) {
// add the expander with its click function
}
};
// call it on all collapsed text divs currently in the document
$('.text.collapsed').each(addExpander);
// how to call it again after changing a text div's content:
addExpander.call(/* your changed div */);
});
作業デモ: http: //jsfiddle.net/DgBR2/18/