Saya mencoba membuat <ul>
slide menggunakan transisi CSS.
The <ul>
dimulai di height: 0;
. Saat mengarahkan, ketinggian diatur ke height:auto;
. Namun, ini menyebabkannya hanya muncul, bukan transisi,
Jika saya melakukannya dari height: 40px;
ke height: auto;
, maka akan meluncur ke atas height: 0;
, dan kemudian tiba-tiba melompat ke ketinggian yang benar.
Bagaimana lagi saya bisa melakukan ini tanpa menggunakan JavaScript?
#child0 {
height: 0;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent0:hover #child0 {
height: auto;
}
#child40 {
height: 40px;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent40:hover #child40 {
height: auto;
}
h1 {
font-weight: bold;
}
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
<h1>Hover me (height: 0)</h1>
<div id="child0">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
<hr>
<div id="parent40">
<h1>Hover me (height: 40)</h1>
<div id="child40">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
css
css-transitions
Hailwood
sumber
sumber
height:auto/max-height
solusinya hanya akan berfungsi jika Anda memperluas area yang lebih besar daripada yangheight
ingin Anda batasi. Jika Anda memilikimax-height
dari300px
, tapi combo box dropdown, yang dapat kembali50px
, makamax-height
tidak akan membantu Anda,50px
adalah variabel tergantung pada jumlah elemen, Anda dapat tiba ke situasi sulit di mana aku tidak bisa memperbaikinya karenaheight
tidak diperbaiki,height:auto
adalah solusinya, tetapi saya tidak dapat menggunakan transisi dengan ini.Jawaban:
Gunakan
max-height
dalam transisi dan tidakheight
. Dan tetapkan nilai padamax-height
sesuatu yang lebih besar dari yang pernah didapat kotak Anda.Lihat demo JSFiddle yang disediakan oleh Chris Jordan dalam jawaban lain di sini.
sumber
Anda harus menggunakan scaleY sebagai gantinya.
Saya telah membuat versi awalan vendor kode di atas pada jsfiddle , dan mengubah jsfiddle Anda untuk menggunakan scaleY alih-alih tinggi.
sumber
Saat ini Anda tidak dapat menghidupkan ketinggian ketika salah satu ketinggian yang terlibat adalah
auto
, Anda harus menetapkan dua ketinggian eksplisit.sumber
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...Solusi yang selalu saya gunakan adalah memudar, lalu mengecilkan
font-size
,padding
danmargin
nilai - nilai. Itu tidak terlihat sama dengan penghapusan, tetapi bekerja tanpa statisheight
ataumax-height
.Contoh kerja:
sumber
*
dan menerapkan perubahan lainnya. Namun, tombol seharusnya terpengaruh oleh kode saya di atas, jika ditata dengan benarem
.line-height: 0;
danborder-width: 0;
line-height
jika Anda benar menghindari nilai pada unit: developer.mozilla.org/en-US/docs/Web/CSS/…Saya tahu ini adalah jawaban ketiga puluh untuk pertanyaan ini, tetapi saya pikir itu sepadan, jadi begini. Ini adalah solusi khusus CSS dengan properti berikut:
transform: scaleY(0)
), jadi itu melakukan hal yang benar jika ada konten setelah elemen dilipat.height: auto
), seluruh konten selalu memiliki ketinggian yang benar (tidak seperti misalnya jika Anda memilihmax-height
yang ternyata menjadi terlalu rendah). Dan dalam keadaan runtuh, ketinggiannya nol seperti seharusnya.Demo
Berikut ini demo dengan tiga elemen yang dapat dilipat, semua ketinggian berbeda, yang semuanya menggunakan CSS yang sama. Anda mungkin ingin mengklik "halaman penuh" setelah mengklik "jalankan snippet". Perhatikan bahwa JavaScript hanya mengaktifkan
collapsed
kelas CSS, tidak ada pengukuran yang terlibat. (Anda dapat melakukan demo ini tanpa JavaScript sama sekali dengan menggunakan kotak centang atau:target
). Perhatikan juga bahwa bagian dari CSS yang bertanggung jawab untuk transisi cukup singkat, dan HTML hanya membutuhkan satu elemen pembungkus tambahan.Bagaimana cara kerjanya?
Sebenarnya ada dua transisi yang terlibat dalam mewujudkan hal ini. Salah satunya transisi
margin-bottom
dari 0px (dalam status diperluas) ke-2000px
dalam kondisi diciutkan (mirip dengan jawaban ini ). 2000 di sini adalah angka ajaib pertama, didasarkan pada asumsi bahwa kotak Anda tidak akan lebih tinggi dari ini (2000 piksel sepertinya pilihan yang masuk akal).Menggunakan
margin-bottom
transisi sendiri dengan sendirinya memiliki dua masalah:margin-bottom: -2000px
tidak akan menyembunyikan semuanya - akan ada barang yang terlihat bahkan dalam kasing yang runtuh. Ini adalah perbaikan kecil yang akan kami lakukan nanti.Memperbaiki masalah kedua ini adalah tempat transisi kedua masuk, dan transisi ini secara konseptual menargetkan tinggi minimum pembungkus ("secara konseptual" karena kita tidak benar-benar menggunakan
min-height
properti untuk ini; lebih lanjut tentang itu nanti).Berikut ini animasi yang menunjukkan bagaimana menggabungkan transisi margin bawah dengan transisi ketinggian minimum, keduanya memiliki durasi yang sama, memberi kita transisi gabungan dari tinggi penuh ke tinggi nol yang memiliki durasi yang sama.
Bilah kiri menunjukkan bagaimana margin bawah negatif mendorong bagian bawah ke atas, mengurangi ketinggian yang terlihat. Bilah tengah menunjukkan bagaimana ketinggian minimum memastikan bahwa dalam kasus runtuh, transisi tidak berakhir lebih awal, dan dalam kasus ekspansi, transisi tidak dimulai terlambat. Bilah kanan menunjukkan bagaimana kombinasi keduanya menyebabkan kotak untuk transisi dari ketinggian penuh ke ketinggian nol dalam jumlah waktu yang benar.
Untuk demo saya, saya telah menetapkan 50px sebagai nilai tinggi minimum atas. Ini adalah angka ajaib kedua, dan itu harus lebih rendah dari ketinggian kotak yang pernah ada. 50px tampaknya masuk akal juga; tampaknya tidak mungkin Anda sering ingin membuat elemen yang dapat dilipat yang bahkan tidak setinggi 50 piksel.
Seperti yang Anda lihat dalam animasi, transisi yang dihasilkan adalah kontinu, tetapi tidak dapat dibedakan - pada saat tinggi minimum sama dengan tinggi penuh yang disesuaikan dengan margin bawah, ada perubahan kecepatan yang tiba-tiba. Ini sangat nyata dalam animasi karena menggunakan fungsi pewaktuan linear untuk kedua transisi, dan karena keseluruhan transisi sangat lambat. Dalam kasus aktual (demo saya di atas), transisi hanya membutuhkan 300 ms, dan transisi margin bawah tidak linier. Saya telah bermain-main dengan banyak fungsi pengaturan waktu yang berbeda untuk kedua transisi, dan yang akhirnya saya rasakan sepertinya mereka bekerja paling baik untuk berbagai kasus terluas.
Masih ada dua masalah yang harus diperbaiki:
Kami memecahkan masalah pertama dengan memberikan elemen wadah a
max-height: 0
dalam kasus runtuh, dengan0s 0.3s
transisi. Ini berarti bahwa itu bukan transisi, tetapimax-height
diterapkan dengan penundaan; itu hanya berlaku setelah transisi selesai. Agar ini berfungsi dengan benar, kita juga perlu memilih numerikmax-height
untuk keadaan sebaliknya, yang tidak diciutkan. Tetapi tidak seperti dalam kasus 2000px, di mana memilih nomor yang terlalu besar mempengaruhi kualitas transisi, dalam kasus ini, itu benar-benar tidak masalah. Jadi kita bisa memilih angka yang begitu tinggi sehingga kita tahu bahwa tidak ada ketinggian yang akan mendekati ini. Saya memilih satu juta piksel. Jika Anda merasa Anda perlu mendukung konten dengan ketinggian lebih dari satu juta piksel, maka 1) Saya minta maaf, dan 2) tambahkan saja beberapa nol.Masalah kedua adalah alasan mengapa kita tidak benar-benar menggunakan
min-height
untuk transisi ketinggian minimum. Sebaliknya, ada::after
pseudo-elemen dalam wadah denganheight
transisi dari 50px ke nol. Ini memiliki efek yang sama denganmin-height
: Ini tidak akan membiarkan wadah menyusut di bawah tinggi apa pun yang dimiliki elemen pseudo saat ini. Tetapi karena kita menggunakanheight
, bukanmin-height
, kita sekarang dapat menggunakanmax-height
(sekali lagi diterapkan dengan penundaan) untuk mengatur tinggi aktual pseudo-elemen menjadi nol setelah transisi selesai, memastikan bahwa setidaknya di luar transisi, bahkan elemen kecil memiliki ketinggian yang benar. Karenamin-height
ini lebih kuat daripadamax-height
, ini tidak akan bekerja jika kita menggunakan wadah inimin-height
bukan pseudo-elemenheight
. Sama sepertimax-height
pada paragraf sebelumnya, inimax-height
juga membutuhkan nilai untuk kebalikan dari transisi. Tetapi dalam hal ini kita bisa memilih 50px.Diuji di Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (kecuali untuk masalah tata letak flexbox dengan demo saya bahwa saya tidak mengganggu debugging), dan Safari (Mac, iOS ). Berbicara tentang flexbox, seharusnya dimungkinkan untuk membuatnya bekerja tanpa menggunakan flexbox apa pun; sebenarnya saya pikir Anda bisa membuat hampir semuanya berfungsi di IE7 - kecuali kenyataan bahwa Anda tidak akan memiliki transisi CSS, menjadikannya latihan yang agak tidak berguna.
sumber
collapsible-wrapper
memiliki posisi absolut. Padaoverflow: hidden
induk diperlukan untuk transisi tetapi mengganggu elemen-elemen yang benar-benar diposisikan.clip-path: polygon(...)
bukanoverflow: hidden
, karena tidak seperti yang terakhir, Anda dapat mentransisikan yang pertama. Sebagai fallback untuk browser lama saya menggunakan transformasi penskalaan tambahan. Lihat komentar di bagian atas github.com/StackExchange/Stacks/blob/develop/lib/css/components/…Anda bisa, dengan sedikit jiggery-pokery non-semantik. Pendekatan saya yang biasa adalah untuk menghidupkan tinggi DIV luar yang memiliki anak tunggal yang merupakan DIV tanpa gaya yang hanya digunakan untuk mengukur tinggi konten.
Orang ingin hanya dapat membuang
.measuringWrapper
dan hanya mengatur tinggi DIV ke otomatis dan menghidupkannya, tetapi itu sepertinya tidak berhasil (ketinggiannya diatur, tetapi tidak ada animasi terjadi).Interpretasi saya adalah bahwa ketinggian eksplisit diperlukan untuk menjalankan animasi. Anda tidak bisa mendapatkan animasi tentang ketinggian ketika salah satu ketinggian (awal atau akhir tinggi)
auto
.sumber
max-height
, tidak perluauto
, dan terutama tidak perlu Javascript !! Hanya dua deklarasi sederhanamargin-top
(danmargin-bottom
) relatif terhadap lebar ketika didefinisikan dalam persentase, ya itu bodoh, tetapi itu juga menjelaskan mengapa timing animasi buka dan tutup benar-benar berbeda - itu adalah hal yang sama seperti yang Anda lihat dalam jawaban berperingkat teratas, menentukan hard -tinggi max yang dikodekan. Mengapa ini begitu sulit dilakukan dengan benar?Solusi visual untuk menjiwai ketinggian menggunakan transisi CSS3 adalah dengan menghidupkan padding.
Anda tidak cukup mendapatkan efek penghapusan penuh, tetapi bermain-main dengan durasi transisi dan nilai padding akan membuat Anda cukup dekat. Jika Anda tidak ingin mengatur ketinggian / maks-tinggi secara eksplisit, ini yang Anda cari.
http://jsfiddle.net/catharsis/n5XfG/17/ (riffed off stephband di atas jsFiddle)
sumber
Solusi saya adalah dengan mentransisikan max-height ke ketinggian konten yang tepat untuk animasi yang bagus dan halus, kemudian gunakan transisi. Kembali ke panggilan untuk mengatur max-height ke 9999px sehingga konten dapat mengubah ukuran secara bebas.
sumber
.stop
melakukan trik untuk masalah loop animasi yang agak rumit. Sekarang ketika Anda menghidupkan tinggi dan warna tetapi ingin mengganggu animasi ketinggian saja, segalanya menjadi sedikit lebih rumit ... Saya mengerti maksud Anda.Jawaban yang diterima berfungsi untuk sebagian besar kasus, tetapi tidak berfungsi dengan baik ketika Anda
div
dapat sangat bervariasi dalam ketinggian - kecepatan animasi tidak tergantung pada ketinggian konten yang sebenarnya, dan itu bisa terlihat berombak.Anda masih dapat melakukan animasi sebenarnya dengan CSS, tetapi Anda harus menggunakan JavaScript untuk menghitung ketinggian item, alih-alih mencoba menggunakannya
auto
. Tidak diperlukan jQuery, meskipun Anda mungkin harus sedikit memodifikasi ini jika Anda ingin kompatibilitas (berfungsi di Chrome versi terbaru :)).sumber
document.getElementById('mydiv')
atau$('#mydiv').get()
), dan fungsinya beralih antara menyembunyikan / menampilkannya. Jika Anda mengatur transisi CSS, elemen tersebut akan hidup secara otomatis.min-height
seperti pada jawaban yang diharapkan menyebabkan masalah dengan kecepatan animasi ketika ukuran daftar dapat sangat bervariasi).Ada sedikit penyebutan
Element.scrollHeight
properti yang dapat berguna di sini dan masih dapat digunakan dengan transisi CSS murni. Properti selalu mengandung ketinggian "penuh" dari suatu elemen, terlepas dari apakah dan bagaimana kontennya meluap sebagai hasil dari ketinggian yang diciutkan (misalnyaheight: 0
).Dengan demikian, untuk
height: 0
elemen (secara efektif runtuh), tingginya "normal" atau "penuh" masih tersedia melaluiscrollHeight
nilainya (selalu panjang pixel ).Untuk elemen seperti itu, anggap sudah memiliki transisi yang diatur seperti misalnya (menggunakan
ul
sesuai pertanyaan awal):Kami dapat memicu "perluasan" animasi yang diinginkan, hanya menggunakan CSS, dengan sesuatu seperti berikut (di sini asumsi
ul
variabel merujuk ke daftar):Itu dia. Jika Anda perlu menciutkan daftar, salah satu dari dua pernyataan berikut akan dilakukan:
Kasus penggunaan khusus saya berkisar seputar daftar panjang yang tidak diketahui dan seringkali cukup panjang, jadi saya merasa tidak nyaman memilih "cukup besar"
height
ataumax-height
spesifikasi dan mempertaruhkan konten terputus atau konten yang tiba-tiba perlu Anda gulir (jikaoverflow: auto
, misalnya) . Selain itu, pelonggaran dan waktu rusak denganmax-height
solusi berbasis, karena ketinggian yang digunakan dapat mencapai nilai maksimum jauh lebih cepat daripada yang dibutuhkan untukmax-height
mencapai9999px
. Dan saat resolusi layar bertambah, panjang piksel seperti9999px
meninggalkan rasa tidak enak di mulut saya. Solusi khusus ini menyelesaikan masalah dengan cara yang elegan, menurut saya.Akhirnya, di sini berharap bahwa revisi di masa depan dari kebutuhan penulis alamat CSS untuk melakukan hal-hal semacam ini bahkan lebih elegan - kembalilah pada gagasan nilai "dikomputasi" vs "terpakai" dan "diselesaikan", dan pertimbangkan apakah transisi harus berlaku untuk dikomputasi. nilai, termasuk transisi dengan
width
danheight
(yang saat ini mendapatkan sedikit perlakuan khusus).sumber
Element.scrollHeight
properti memerlukan JavaScript dan, seperti yang dinyatakan dalam pertanyaan, mereka ingin melakukan ini tanpa JavaScript.Gunakan
max-height
dengan pelonggaran dan penundaan transisi yang berbeda untuk setiap negara.HTML:
CSS:
Lihat contoh: http://jsfiddle.net/0hnjehjc/1/
sumber
999999px
. Ini, di sisi lain, akan menggeser animasi Anda, karena bingkai dihitung dari nilai ini. Jadi, Anda mungkin berakhir dengan animasi "delay" di satu arah dan akhir yang sangat cepat di arah lain (corr: timing-functions)Tidak ada nilai kode keras.
Tanpa JavaScript.
Tidak ada perkiraan.
Caranya adalah dengan menggunakan yang disembunyikan & diduplikasi
div
untuk membuat browser memahami apa arti 100%.Metode ini cocok setiap kali Anda dapat menduplikasi DOM elemen yang ingin Anda menghidupkan.
sumber
transform: scaleY(1)
, karena transisi ini tidak menghilangkan ruang.Saat saya memposting ini sudah ada lebih dari 30 jawaban, tetapi saya merasa jawaban saya meningkat pada jawaban yang sudah diterima oleh jake.
Saya tidak puas dengan masalah yang timbul dari hanya menggunakan
max-height
dan transisi CSS3, karena seperti banyak komentator mencatat, Anda harus mengaturmax-height
nilai Anda sangat dekat dengan ketinggian sebenarnya atau Anda akan mendapatkan penundaan. Lihat JSFiddle ini untuk contoh masalah itu.Untuk menyiasatinya (walaupun masih belum menggunakan JavaScript), saya menambahkan elemen HTML lain yang mentransisi nilai
transform: translateY
CSS.Ini berarti keduanya
max-height
dantranslateY
digunakan:max-height
memungkinkan elemen untuk menekan elemen di bawahnya, sambiltranslateY
memberikan efek "instan" yang kita inginkan. Masalah denganmax-height
masih ada, tetapi efeknya berkurang. Ini berarti Anda dapat mengatur ketinggian yang jauh lebih besar untukmax-height
nilai Anda dan lebih sedikit mengkhawatirkannya.Manfaat keseluruhan adalah bahwa pada transisi kembali (runtuh), pengguna melihat
translateY
animasi segera, jadi tidak masalah berapa lamamax-height
waktu yang dibutuhkan.Solusi sebagai Fiddle
sumber
translateY
lebihscale
karena saya tidak seperti bagaimanascale
memberi efek kompresi.Ok, jadi saya pikir saya datang dengan jawaban yang sangat sederhana ... tidak
max-height
, menggunakanrelative
positioning, bekerja padali
elemen, & adalah CSS murni. Saya belum menguji apa pun selain Firefox, meskipun dilihat dari CSS, itu harus bekerja di semua browser.FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
sumber
Suntingan: Gulir ke bawah untuk jawaban yang diperbarui.
Saya membuat daftar drop-down dan melihat posting ini ... banyak jawaban yang berbeda tetapi saya memutuskan untuk berbagi daftar drop-down saya juga, ... Itu tidak sempurna tetapi setidaknya itu akan menggunakan hanya css untuk jatuhkan! Saya telah menggunakan transform: translateY (y) untuk mengubah daftar menjadi tampilan ...
Anda dapat melihat lebih banyak di tes
http://jsfiddle.net/BVEpc/4/
Saya telah menempatkan div di belakang setiap li karena saya daftar drop-down datang dari atas dan untuk menunjukkan kepada mereka dengan benar ini diperlukan, kode div saya adalah:
dan melayang adalah:
dan karena ketinggian ul diatur ke konten itu bisa mendapatkan lebih dari konten tubuh Anda itu sebabnya saya melakukan ini untuk ul:
dan arahkan:
kedua kalinya setelah transisi adalah penundaan dan itu akan disembunyikan setelah daftar drop-down saya ditutup secara animasi ...
Semoga nanti ada orang yang mendapat manfaat dari ini.
EDIT: Saya tidak percaya ppl benar-benar menggunakan prototipe ini! menu tarik turun ini hanya untuk satu sub menu dan itu saja !! Saya telah memperbarui yang lebih baik yang dapat memiliki dua sub menu untuk ltr dan rtl direction dengan dukungan IE 8.
Fiddle for LTR
Fiddle for RTL
mudah-mudahan seseorang menemukan ini berguna di masa depan.
sumber
Anda dapat bertransisi dari ketinggian: 0 ke tinggi: dengan ketentuan otomatis bahwa Anda juga menyediakan tinggi-min dan tinggi-max.
sumber
Solusi Flexbox
Pro:
Cons:
Cara kerjanya adalah dengan selalu memiliki basis-fleksibel: otomatis pada elemen dengan konten, dan mentransisikan flex-grow dan flex-shrink sebagai gantinya.
Sunting: Peningkatan JS Fiddle terinspirasi oleh antarmuka Xbox One.
JS Fiddle
sumber
Memperluas jawaban @ jake, transisi akan mencapai nilai tinggi max, menyebabkan animasi yang sangat cepat - jika Anda mengatur transisi untuk keduanya: hover dan off Anda kemudian dapat mengontrol kecepatan gila sedikit lebih.
Jadi li: hover adalah ketika mouse memasuki negara dan kemudian transisi pada properti non-melayang akan menjadi cuti mouse.
Semoga ini bisa membantu.
misalnya:
Ini biola: http://jsfiddle.net/BukwJ/
sumber
Saya pikir saya datang dengan solusi yang sangat solid
BAIK! Saya tahu masalah ini setua internet, tapi saya pikir saya punya solusi yang saya berubah menjadi plugin yang disebut transisi-mutan . Solusi saya menetapkan
style=""
atribut untuk elemen yang dilacak setiap kali ada perubahan dalam DOM. hasil akhirnya adalah bahwa Anda dapat menggunakan CSS baik untuk transisi Anda dan tidak menggunakan perbaikan hacky atau javascript khusus. Satu-satunya hal yang harus Anda lakukan adalah mengatur apa yang ingin Anda lacak pada elemen yang digunakandata-mutant-attributes="X"
.Itu dia! Solusi ini menggunakan MutationObserver untuk mengikuti perubahan di DOM. Karena itu, Anda tidak perlu mengatur apa pun atau menggunakan javascript untuk menghidupkan benda secara manual. Perubahan dilacak secara otomatis. Namun, karena menggunakan MutationObserver, ini hanya akan transisi di IE11 +.
Biola
height: auto
keheight: 100%
height: auto
saat menambahkan anak-anaksumber
Berikut cara untuk beralih dari ketinggian mulai, termasuk 0, ke otomatis (ukuran penuh dan fleksibel) tanpa memerlukan kode hard-set pada basis per-simpul atau kode pengguna apa pun untuk menginisialisasi: https://github.com/csuwildcat / transisi-otomatis . Ini pada dasarnya adalah cawan suci untuk apa yang Anda inginkan, saya percaya -> http://codepen.io/csuwldcat/pen/kwsdF . Cukup tampar file JS berikut ke halaman Anda, dan yang perlu Anda lakukan setelah itu adalah menambah / menghapus atribut boolean tunggal -
reveal=""
- dari node yang ingin Anda kembangkan dan kontrak.Inilah yang perlu Anda lakukan sebagai pengguna, setelah Anda memasukkan blok kode yang ditemukan di bawah kode contoh:
Berikut ini blok kode untuk dimasukkan dalam halaman Anda, setelah itu, semuanya adalah saus:
Letakkan file JS ini di halaman Anda - semuanya Just Works ™
/ * Kode untuk tinggi: otomatis; transisi * /
/ * Kode untuk DEMO * /
sumber
clip
sebagai pemicu properti tiruan saya, dan untuk beberapa alasan IE berhenti mengizinkan klip untuk dianimasikan. Saya beralih ke opacity, dan semuanya bekerja lagi: codepen.io/csuwldcat/pen/FpzGa . Saya telah memperbarui kode dalam jawaban yang cocok.Jawaban Jake untuk menghidupkan max-height itu bagus, tetapi saya menemukan penundaan yang disebabkan oleh pengaturan max-height yang besar mengganggu.
Seseorang dapat memindahkan konten yang dapat diciutkan ke dalam div dalam dan menghitung ketinggian maks dengan mendapatkan ketinggian div dalam (melalui JQuery itu akan menjadi outerHeight ()).
Inilah tautan jsfiddle: http://jsfiddle.net/pbatey/duZpT
Inilah jsfiddle dengan jumlah minimal kode yang diperlukan: http://jsfiddle.net/8ncjjxh8/
sumber
Saya menyadari bahwa utas ini semakin tua, tetapi peringkatnya tinggi pada pencarian Google tertentu, jadi saya pikir ini layak diperbarui.
Anda juga hanya mendapatkan / mengatur tinggi elemen sendiri:
Anda harus membuang Javascript ini segera setelah tag penutup target_box dalam tag skrip inline.
sumber
Saya bisa melakukan ini. Saya memiliki
.child
& a.parent
div. Div anak sangat cocok dengan lebar / tinggi orang tua denganabsolute
posisi. Saya kemudian menghidupkantranslate
properti untuk mendorongY
nilainya turun100%
. Animasi sangat halus, tidak ada gangguan atau sisi bawah seperti solusi lain di sini.Sesuatu seperti ini, kode semu
Anda akan menentukan
height
pada.parent
, dipx
,%
, atau cuti sebagaiauto
. Div ini kemudian menutup.child
div saat slide turun.sumber
Saya mengeposkan jawaban dengan JavaScript dan turun undian, jadi jengkel dan mencoba lagi, dan telah memecahkannya dengan CSS saja!
Solusi ini menggunakan beberapa 'teknik':
padding-bottom:100%
'retas' di mana persentase didefinisikan dalam hal lebar elemen saat ini. Info lebih lanjut tentang teknik ini.Hasilnya adalah bahwa kita mendapatkan pergantian pemain hanya menggunakan CSS, dan satu fungsi transisi untuk mencapai transisi dengan lancar; cawan Suci!
Tentu saja, ada kekurangannya! Saya tidak tahu cara mengontrol lebar di mana konten terpotong (
overflow:hidden
); karena retakan padding-bottom, lebar dan tinggi saling terkait erat. Mungkin ada jalan, jadi akan kembali ke sana.https://jsfiddle.net/EoghanM/n1rp3zb4/28/
sumber
input[type="checkbox"]:checked
alih - alih:hover
jika Anda ingin (mis. Anda tidak ingin menggunakan JavaScript untuk menambahkan kelas apa pun)Inilah solusi yang saya gunakan dalam kombinasi dengan jQuery. Ini berfungsi untuk struktur HTML berikut:
dan fungsinya:
Anda kemudian dapat menggunakan fungsi klik untuk mengatur dan menghapus ketinggian menggunakan
css()
CSS:
sumber
Saya baru-baru ini mentransisikan
max-height
padali
elemen daripada pembungkusul
.Alasannya adalah bahwa penundaan untuk kecil
max-heights
jauh kurang terlihat (jika sama sekali) dibandingkan dengan besarmax-heights
, dan saya juga dapat mengatur sayamax-height
nilai relatif terhadapfont-size
satuli
daripada beberapa sejumlah besar sewenang-wenang dengan menggunakanems
ataurems
.Jika ukuran font saya
1rem
, saya akan mengatur sayamax-height
ke sesuatu seperti3rem
(untuk mengakomodasi teks yang dibungkus). Anda dapat melihat contoh di sini:http://codepen.io/mindfullsilence/pen/DtzjE
sumber
Saya belum membaca semuanya secara terperinci tetapi saya memiliki masalah ini baru-baru ini dan saya melakukan yang berikut:
Ini memungkinkan Anda untuk memiliki div yang pada awalnya menunjukkan konten hingga ketinggian 200px dan pada hover ukurannya menjadi setidaknya setinggi seluruh konten div. Div tidak menjadi 3000px tetapi 3000px adalah batas yang saya memaksakan. Pastikan untuk memiliki transisi pada non: hover, jika tidak, Anda mungkin mendapatkan render yang aneh. Dengan cara ini: hover mewarisi dari non: hover.
Transisi tidak berfungsi dari px ke% atau ke otomatis. Anda harus menggunakan satuan ukuran yang sama. Ini berfungsi baik untuk saya. Menggunakan HTML5 membuatnya sempurna ....
Ingatlah bahwa selalu ada pekerjaan di sekitar ...; )
Semoga seseorang menemukan ini berguna
sumber
Solusi max-height dari Jake bekerja dengan baik, jika nilai max-height hard-coded yang disediakan tidak jauh lebih besar dari tinggi sebenarnya (karena jika tidak ada penundaan dan masalah waktu yang tidak diinginkan). Di sisi lain jika nilai hard-kode secara tidak sengaja tidak lebih besar dari tinggi sebenarnya elemen tidak akan terbuka sepenuhnya.
Solusi CSS saja berikut ini juga membutuhkan ukuran kode keras yang harus lebih besar dari sebagian besar ukuran nyata yang terjadi. Namun solusi ini juga berfungsi jika ukuran sebenarnya dalam beberapa situasi lebih besar dari ukuran hard-coded. Jika itu terjadi, transisi mungkin akan melompat sedikit, tetapi tidak akan pernah meninggalkan elemen yang terlihat sebagian. Jadi solusi ini juga dapat digunakan untuk konten yang tidak dikenal, misalnya dari database, di mana Anda hanya tahu bahwa kontennya biasanya tidak lebih besar dari x piksel, tetapi ada pengecualian.
Gagasannya adalah menggunakan nilai negatif untuk margin-bottom (atau margin-top untuk animasi yang sedikit berbeda) dan untuk menempatkan elemen konten ke elemen tengah dengan overflow: tersembunyi. Margin negatif elemen konten sehingga mengurangi ketinggian elemen tengah.
Kode berikut menggunakan transisi pada margin-bottom dari -150px ke 0px. Ini saja berfungsi dengan baik selama elemen konten tidak lebih tinggi dari 150px. Selain itu menggunakan transisi pada max-height untuk elemen tengah dari 0px ke 100%. Ini akhirnya menyembunyikan elemen tengah jika elemen konten lebih tinggi dari 150px. Untuk max-height, transisi hanya digunakan untuk menunda penerapannya satu detik saat menutup, bukan untuk efek visual yang halus (dan karenanya dapat berjalan dari 0px hingga 100%).
CSS:
HTML:
Nilai untuk margin bawah harus negatif dan sedekat mungkin dengan ketinggian sebenarnya dari elemen konten. Jika itu (nilai absoute) lebih besar ada masalah keterlambatan dan waktu yang sama seperti dengan solusi max-height, yang bagaimanapun dapat dibatasi selama ukuran kode keras tidak jauh lebih besar dari yang asli. Jika nilai absolut untuk margin-bottom lebih kecil dari tinggi sebenarnya tansition melompat sedikit. Dalam kasus apa pun setelah transisi, elemen konten ditampilkan atau dihapus sepenuhnya.
Untuk lebih jelasnya lihat posting blog saya http://www.taccgl.org/blog/css_transition_display.html#combined_height
sumber
Anda bisa melakukan ini dengan membuat animasi terbalik (runtuh) dengan clip-path.
sumber
Ini bukan "solusi" untuk masalah ini, tetapi lebih dari solusi. Ini hanya berfungsi seperti yang ditulis dengan teks, tetapi dapat diubah untuk bekerja dengan elemen lain sesuai kebutuhan saya yakin.
Berikut ini sebuah contoh: http://codepen.io/overthemike/pen/wzjRKa
Pada dasarnya, Anda mengatur ukuran font ke 0 dan transisi yang bukan ketinggian, atau max-tinggi, atau scaleY () dll. Pada kecepatan yang cukup cepat untuk mendapatkan ketinggian untuk mengubah ke apa yang Anda inginkan. Untuk mengubah ketinggian aktual dengan CSS ke otomatis saat ini tidak mungkin, tetapi mentransformasikan konten di dalamnya adalah, karenanya transisi ukuran font.
sumber