Div penciutan / perluasan CSS murni

92

Saya memiliki div collapsable CSS murni yang didasarkan pada kode orang lain yang menggunakan :targetpsuedoclass. Apa yang saya coba siapkan adalah halaman dengan 12+ pertanyaan, dan ketika Anda mengklik tombol + div jawaban meluas di bawahnya. Saya tidak tahu cara membuat beberapa elemen div yang runtuh di halaman ini tanpa menulis banyak CSS tambahan. Adakah yang punya saran tentang cara menulis ini sehingga kode CSS saya diminimalkan? (yaitu, jadi saya tidak perlu memasukkan banyak pemilih unik untuk masing-masing dari 12+ pertanyaan).

Saya tidak dapat menggunakan Javascript karena ini terjadi di situs wordpress.com yang tidak mengizinkan JS.

Ini jfiddle saya: http://jsfiddle.net/dmarvs/94ukA/4/

<div class="FAQ">
    <a href="#hide1" class="hide" id="hide1">+</a>
    <a href="#show1" class="show" id="show1">-</a>
    <div class="question"> Question Question Question Question Question Question Question Question Question Question Question? </div>
        <div class="list">
            <p>Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer Answer </p>
        </div>
</div>
/* source: http://www.ehow.com/how_12214447_make-collapsing-lists-java.html */

.FAQ { 
    vertical-align: top; 
    height:auto !important; 
}
.list {
    display:none; 
    height:auto;
    margin:0;
    float: left;
}
.show {
    display: none; 
}
.hide:target + .show {
    display: inline; 
}
.hide:target {
    display: none; 
}
.hide:target ~ .list {
    display:inline; 
}

/*style the (+) and (-) */
.hide, .show {
    width: 30px;
    height: 30px;
    border-radius: 30px;
    font-size: 20px;
    color: #fff;
    text-shadow: 0 1px 0 #666;
    text-align: center;
    text-decoration: none;
    box-shadow: 1px 1px 2px #000;
    background: #cccbbb;
    opacity: .95;
    margin-right: 0;
    float: left;
    margin-bottom: 25px;
}

.hide:hover, .show:hover {
    color: #eee;
    text-shadow: 0 0 1px #666;
    text-decoration: none;
    box-shadow: 0 0 4px #222 inset;
    opacity: 1;
    margin-bottom: 25px;
}

.list p{
    height:auto;
    margin:0;
}
.question {
    float: left;
    height: auto;
    width: 90%;
    line-height: 20px;
    padding-left: 20px;
    margin-bottom: 25px;
    font-style: italic;
}
dmarvs
sumber
6
Kepada siapa pun yang melihat ini tidak menggunakan wordpress, dapatkah saya mengatakan TOLONG JANGAN LAKUKAN INI. Ini adalah retasan dan itu merusak fungsi belakang halaman yang sangat mengganggu.
gbtimmon

Jawaban:

106

Bergantung pada browser / perangkat apa yang ingin Anda dukung, atau apa yang Anda siapkan untuk browser yang tidak sesuai, Anda mungkin ingin memeriksa tag <summary>dan <detail>. Mereka tepat untuk tujuan ini. Tidak diperlukan css sama sekali karena menutup dan menampilkan adalah bagian dari definisi / pemformatan tag.

Saya telah membuat contoh di sini :

<details>
<summary>This is what you want to show before expanding</summary>
<p>This is where you put the details that are shown once expanded</p>
</details>

Dukungan browser bervariasi. Coba di webkit untuk hasil terbaik. Browser lain mungkin secara default menampilkan semua solusi. Anda mungkin dapat kembali ke metode sembunyikan / tampilkan yang dijelaskan di atas.

Thurstan
sumber
2
Bug 591737 adalah bug yang melacak dukungan di Firefox.
ShreevatsaR
9
Ini hampir pertengahan 2016 dan dukungan untuk ini tidak ada. Pastinya jangan gunakan solusi ini.
Dwayne Charrington
3
Dukungan @DigitalSea menjadi 'tidak ada' tidak benar dan 'pasti jangan gunakan solusi ini' adalah kata-kata yang kuat untuk standar yang telah stabil selama beberapa tahun dan telah memiliki polyfill yang tersedia sejak 2010 mathiasbynens.be/notes/html5-details- jquery . Apa dasar argumen Anda? MS edge kemungkinan akan segera menerapkan tag ini Firefox telah menerapkan tag ringkasan / detail (tetapi saat ini memilikinya di belakang bendera) Webkit mendukungnya sebagai default sejak chrome 12 seperti halnya safari di OS X dan browser yang diturunkan dari iOS Blink - chrome mobile / desktop, opera mendukungnya sebagai default
Thurstan
1
@Thurstan Tidak ada dukungan dalam; IE8, IE9, IE10, IE11, Edge 13, tidak ada dukungan di Firefox hingga Agustus 2016. Jadi, kecuali Anda memiliki kemewahan untuk tidak lagi mendukung IE sepenuhnya dan saat ini Edge dan Firefox, ya, tidak didukung dengan baik. Polyfill pada dasarnya melakukan apa yang sudah dapat Anda lakukan dengan Javascript (tanpa jQuery) dan cukup efisien. Sebuah polyfill untuk fitur yang mudah diimplementasikan sendiri ini berlebihan. Solusi yang Anda tautkan menggunakan jQuery yang tidak diperlukan. Saya tidak akan terkejut jika kami melihat ini dihapus dari spesifikasi suatu hari nanti.
Dwayne Charrington
4
Saya mengembangkan hanya untuk browser modern dan teknik ini bekerja dengan sempurna untuk kasus penggunaan saya, dan tidak memerlukan sedikit pun CSS!
Josh Habdas
39

Menggunakan <summary>dan<details>

Penggunaan <summary>dan <details>elemen adalah yang paling sederhana tetapi lihat dukungan browser karena IE saat ini tidak mendukungnya. Anda dapat melakukan polyfill (sebagian besar berbasis jQuery). Perhatikan bahwa browser yang tidak didukung tentu saja hanya akan menampilkan versi yang diperluas, jadi itu mungkin dapat diterima dalam beberapa kasus.

/* Optional styling */
summary::-webkit-details-marker {
  color: blue;
}
summary:focus {
  outline-style: none;
}
<details>
  <summary>Summary, caption, or legend for the content</summary>
  Content goes here.
</details>

Lihat juga bagaimana memberi style pada <details>elemen (HTML5 Doctor) (sedikit rumit).

CSS3 murni

The :targetpemilih memiliki cukup bagus dukungan browser , dan dapat digunakan untuk membuat satu elemen dilipat dalam bingkai.

.details,
.show,
.hide:target {
  display: none;
}
.hide:target + .show,
.hide:target ~ .details {
  display: block;
}
<div>
  <a id="hide1" href="#hide1" class="hide">+ Summary goes here</a>
  <a id="show1" href="#show1" class="show">- Summary goes here</a>
  <div class="details">
    Content goes here.
  </div>
</div>
<div>
  <a id="hide2" href="#hide2" class="hide">+ Summary goes here</a>
  <a id="show2" href="#show2" class="show">- Summary goes here</a>
  <div class="details">
    Content goes here.
  </div>
</div>

Wernight
sumber
1
<summary>dan <details>masih tidak berfungsi di semua browser utama.
Neurotransmitter
4
@TranslentCloud Itulah yang saya katakan. ;)
Wernight
Dan juga ini dikatakan oleh penulis jawaban lainnya.
Neurotransmitter
1
Apakah ada cara untuk menambahkan animasi transisi ke ini?
azizj1
1
Untuk versi animasi di mana teks meluncur ke bawah dan memudar dalam menggunakan transisi CSS, lihat posting blog
sketchyTech
25

Jawaban @ gbtimmon bagus, tapi terlalu rumit. Saya telah menyederhanakan kodenya sebanyak yang saya bisa.

#answer,
#show,
#hide:target {
    display: none; 
}

#hide:target + #show,
#hide:target ~ #answer {
    display: inherit; 
}
<a href="#hide" id="hide">Show</a>
<a href="#/" id="show">Hide</a>
<div id="answer"><p>Answer</p></div>

Neurotransmitter
sumber
3
Bekerja dengan CSS3 terkadang sangat bermanfaat :-)
mrmut
Ini tidak berfungsi jika digunakan lebih dari sekali pada halaman yang sama: mengklik sembunyikan / tampilkan memengaruhi semua div. Adakah yang tahu cara memodifikasinya sehingga berfungsi bila digunakan lebih dari sekali?
phhu
Update: Hanya jawaban CSS @Wernight di bawah ini ("Pure CSS3", mirip dengan CSS ini, tetapi menggunakan kelas). bekerja dengan beberapa div di halaman yang sama.
phhu
1
@phhu ya, itu tidak akan berhasil jika Anda menggunakan kembali ID yang sama. Ini akan bekerja jika Anda akan memperkenalkan set lain dari ID ( hide2, show2, answer2misalnya). Atau kelas, tidak masalah.
Neurotransmitter
22

Anda hanya perlu mengulang jangkar di dua tautan.

<a href="#hide2" class="hide" id="hide2">+</a>
<a href="#show2" class="show" id="show2">-</a>

Lihat jsfiddle http://jsfiddle.net/eJX8z/ ini

Saya juga menambahkan beberapa margin ke panggilan FAQ untuk meningkatkan format.

gbtimmon.dll
sumber
Terima kasih! Saya telah mencobanya, tetapi untuk beberapa alasan itu tidak berhasil untuk saya. Pasti ada bug yang tidak pernah saya tangkap.
dmarvs
18

Atau versi super sederhana dengan hampir tidak ada css :)

<style>   
.faq ul li {
    display:block;
    float:left;
    padding:5px;
}

.faq ul li div {
    display:none;
}

.faq ul li div:target {
    display:block;
}


</style>


<div class="faq">
   <ul>
   <li><a href="#question1">Question 1</a>   
   <div id="question1">Answer 1 </div>
   </li>


   <li><a href="#question2">Question 2</a>
   <div id="question2">Answer 2 </div>
   </li>
   <li><a href="#question3">Question 3</a>
   <div id="question3">Answer 3 </div>
   </li>
   <li><a href="#question4">Question 4</a>
   <div id="question4">Answer 4 </div>
   </li>
   <li><a href="#question5">Question 5</a>
   <div id="question5">Answer 5 </div>
   </li>
   <li><a href="#question6">Question 6</a>
   <div id="question6">Answer 6 </div>
   </li>
   </ul>  
</div>

http://jsfiddle.net/ionko22/4sKD3/

Ionko Gueorguiev
sumber
Ngomong-ngomong, lupa menyebutkan bahwa: target tidak berfungsi di IE8 atau lebih lama, kejutan! Dan css PIE juga tidak akan membantu jadi Anda mungkin ingin melihat opsi jQuery jika kompatibilitas browser menarik bagi Anda.
Ionko Gueorguiev
Terima kasih, jauh lebih bersih. Sekitar sepertiga dari target audiens potensial kami akan menggunakan IE8. Saya berpikir untuk menambahkan beberapa CSS bersyarat yang hanya akan membuka semua div saat dimuat.
dmarvs
Saya pikir antarmuka tab mungkin solusi yang tepat untuk Anda. Saya melakukannya beberapa waktu lalu, Anda dapat mendownload / memeriksanya di sini: ionko.com/index.php/work/simple-and-flexible-tabs .
Ionko Gueorguiev