CSS ทั้งหมดยุบ / ขยาย div


94

ฉันมี div ที่ยุบได้ CSS บริสุทธิ์ซึ่งอ้างอิงจากรหัสของคนอื่นที่ใช้:targetpsuedoclass สิ่งที่ฉันกำลังพยายามตั้งค่าคือหน้าที่มีคำถามมากกว่า 12 ข้อและเมื่อคุณคลิกที่ปุ่ม + div คำตอบจะขยายออกด้านล่าง ฉันไม่สามารถหาวิธีสร้างองค์ประกอบ div ที่ยุบได้หลายรายการในหน้านี้โดยไม่ต้องเขียน CSS เพิ่มเติมมากมาย ใครมีคำแนะนำในการเขียนสิ่งนี้เพื่อย่อโค้ด CSS ของฉัน? (กล่าวคือฉันไม่ต้องป้อนตัวเลือกที่ไม่ซ้ำกันสำหรับคำถามมากกว่า 12 ข้อแต่ละข้อ)

ฉันไม่สามารถใช้ Javascript ได้เนื่องจากสิ่งนี้เกิดขึ้นบนไซต์ wordpress.com ซึ่งไม่อนุญาตให้ใช้ JS

นี่คือ jfiddle ของฉัน: 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;
}

6
สำหรับใครก็ตามที่เห็นสิ่งนี้โดยไม่ใช้ wordpress ฉันสามารถพูดได้โปรดอย่าทำสิ่งนี้ มันเป็นการแฮ็กและทำลายการทำงานด้านหลังของหน้าเว็บซึ่งน่ารำคาญมาก
gbtimmon

คำตอบ:


110

ขึ้นอยู่กับเบราว์เซอร์ / อุปกรณ์ที่คุณต้องการรองรับหรือสิ่งที่คุณเตรียมไว้สำหรับเบราว์เซอร์ที่ไม่เข้ากันได้คุณอาจต้องการตรวจสอบ<summary>และ<detail>แท็ก พวกเขามีไว้เพื่อจุดประสงค์นี้ ไม่จำเป็นต้องใช้ css เลยเนื่องจากการยุบและการแสดงเป็นส่วนหนึ่งของการกำหนดแท็ก / การจัดรูปแบบ

ฉันได้ทำตัวอย่างไว้ที่นี่ :

<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>

การรองรับเบราว์เซอร์แตกต่างกันไป ลองใช้ webkit เพื่อผลลัพธ์ที่ดีที่สุด เบราว์เซอร์อื่น ๆ อาจใช้ค่าเริ่มต้นเพื่อแสดงโซลูชันทั้งหมด คุณอาจใช้วิธีซ่อน / แสดงที่อธิบายไว้ข้างต้นได้


2
Bug 591737คือบั๊กที่ติดตามการรองรับใน Firefox
ShreevatsaR

9
เกือบกลางปี ​​2016 และการสนับสนุนสำหรับสิ่งนี้ก็ไม่มีอยู่จริง อย่าใช้วิธีนี้อย่างแน่นอน
Dwayne Charrington

3
การสนับสนุน @DigitalSea เป็น 'ไม่มีอยู่จริง' ไม่ถูกต้องและ 'ไม่ใช้วิธีแก้ปัญหานี้อย่างแน่นอน' เป็นคำพูดที่ชัดเจนสำหรับมาตรฐานที่มีความเสถียรมาหลายปีและมี polyfill ให้บริการตั้งแต่ปี 2010 mathiasbynens.be/notes/html5-details- jQuery อะไรคือพื้นฐานสำหรับการโต้แย้งของคุณ? MS edge มีแนวโน้มที่จะใช้แท็กเหล่านี้เร็ว ๆ นี้ Firefox ได้ติดตั้งแท็กสรุป / รายละเอียด (แต่ปัจจุบันมีอยู่หลังธง) Webkit สนับสนุนเป็นค่าเริ่มต้นตั้งแต่ chrome 12 เช่นเดียวกับซาฟารีบนเบราว์เซอร์ที่ได้รับ OS X และ iOS Blink - Chrome มือถือ / เดสก์ท็อป โอเปร่ารองรับเป็นค่าเริ่มต้น
Thurstan

1
@Thurstan ไม่มีการสนับสนุนใน; IE8, IE9, IE10, IE11, Edge 13 ไม่มีการสนับสนุนใน Firefox จนถึงเดือนสิงหาคม 2016 ดังนั้นหากคุณไม่ได้รับการสนับสนุนจาก IE ทั้งหมดและในปัจจุบัน Edge และ Firefox ใช่ไม่ได้รับการสนับสนุนอย่างดี โดยพื้นฐานแล้ว polyfill จะทำสิ่งที่คุณสามารถทำได้กับ Javascript (โดยไม่ใช้ jQuery) และค่อนข้างมีประสิทธิภาพ polyfill สำหรับคุณลักษณะนี้ง่ายต่อการใช้งานด้วยตัวคุณเองนั้นเกินความจำเป็น โซลูชันที่คุณเชื่อมโยงใช้ jQuery ซึ่งไม่จำเป็น ฉันจะไม่แปลกใจถ้าเราเห็นสิ่งนี้ถูกลบออกจากสเป็คในวันหนึ่ง
Dwayne Charrington

5
ฉันกำลังพัฒนาสำหรับเบราว์เซอร์สมัยใหม่เท่านั้นและเทคนิคนี้ใช้ได้ดีกับกรณีการใช้งานของฉันและไม่ต้องใช้ CSS เลย!
Josh Habdas

42

การใช้<summary>และ<details>

การใช้<summary>และ<details>องค์ประกอบเป็นวิธีที่ง่ายที่สุด แต่โปรดดูการสนับสนุนเบราว์เซอร์เนื่องจาก IE ปัจจุบันไม่รองรับ คุณสามารถทำpolyfill ได้ (ส่วนใหญ่ใช้ jQuery) โปรดทราบว่าเบราว์เซอร์ที่ไม่รองรับจะแสดงเวอร์ชันที่ขยายออกมาซึ่งอาจเป็นที่ยอมรับในบางกรณี

/* 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>

ดูวิธีจัดรูปแบบ<details>องค์ประกอบ (HTML5 Doctor) (ยุ่งยากเล็กน้อย)

CSS บริสุทธิ์ 3

:targetเลือกมีที่ดีงามการสนับสนุนเบราว์เซอร์และก็สามารถที่จะใช้ในการทำเพียงครั้งเดียวองค์ประกอบพับภายในกรอบ

.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>


1
<summary>และ<details>ยังใช้ไม่ได้กับเบราว์เซอร์หลัก ๆ ทั้งหมด
Neurotransmitter

4
@TranslucentCloud นั่นคือสิ่งที่ฉันพูด ;)
Wernight

และผู้เขียนคำตอบคนอื่นก็กล่าวเช่นกัน
Neurotransmitter

1
มีการเพิ่มภาพเคลื่อนไหวการเปลี่ยนแปลงในสิ่งนี้หรือไม่
azizj1

1
สำหรับเวอร์ชันเคลื่อนไหวที่ข้อความเลื่อนลงและจางหายไปในการใช้การเปลี่ยน CSS โปรดดูที่บล็อกโพสต์
sketchyTech

26

คำตอบของ @ gbtimmonนั้นยอดเยี่ยม แต่วิธีนั้นซับซ้อนเกินไป ฉันทำให้รหัสของเขาง่ายขึ้นเท่าที่จะทำได้

#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>


3
การทำงานกับ CSS3 บางครั้งก็คุ้มค่ามาก :-)
mrmut

วิธีนี้ใช้ไม่ได้เมื่อใช้มากกว่าหนึ่งครั้งในหน้าเดียวกันการคลิกซ่อน / แสดงจะส่งผลต่อ div ทั้งหมด ใครทราบวิธีแก้ไขให้มันใช้งานได้เมื่อใช้มากกว่าหนึ่งครั้ง
phhu

อัปเดต: CSS ของ @Wernight มีคำตอบด้านล่างเท่านั้น ("Pure CSS3", CSS ที่คล้ายกับสิ่งนี้ แต่ใช้คลาส) ทำงานร่วมกับหลาย div ในหน้าเดียวกัน
phhu

1
@phhu ใช่มันจะใช้ไม่ได้ถ้าคุณใช้รหัสเดิมซ้ำ มันจะทำงานถ้าคุณจะแนะนำชุดอื่น ๆ ของรหัส ( hide2, show2, answer2ตัวอย่าง) หรือชั้นเรียนก็ไม่สำคัญ
สารสื่อประสาท

22

คุณเพียงแค่ต้องย้ำจุดยึดในสองลิงก์

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

ดู jsfiddle นี้http://jsfiddle.net/eJX8z/

ฉันยังเพิ่มขอบบางส่วนในการเรียก FAQ เพื่อปรับปรุงรูปแบบ


ขอขอบคุณ! ฉันได้ลองแล้ว แต่ด้วยเหตุผลบางอย่างมันไม่ได้ผลสำหรับฉัน ต้องมีข้อผิดพลาดที่ฉันไม่เคยจับได้
dmarvs

19

หรือรุ่นที่เรียบง่ายสุด ๆ โดยแทบไม่ต้องใช้ 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/


โดยวิธีการลืมที่จะพูดถึงว่า: เป้าหมายไม่ทำงานใน IE8 หรือเก่ากว่าเซอร์ไพรส์แปลกใจ! และ css PIE จะไม่ช่วยในเรื่องนี้ดังนั้นคุณอาจต้องการดูตัวเลือก jQuery หากความเข้ากันได้ของเบราว์เซอร์เป็นที่สนใจสำหรับคุณ
Ionko Gueorguiev

ขอบคุณที่สะอาดกว่ามาก ประมาณหนึ่งในสามของกลุ่มเป้าหมายที่มีศักยภาพของเราจะอยู่ใน IE8 ฉันคิดว่าจะเพิ่ม CSS แบบมีเงื่อนไขซึ่งจะเปิด div ทั้งหมดเมื่อโหลด
dmarvs

ฉันคิดว่าอินเทอร์เฟซแบบแท็บอาจเป็นทางออกที่เหมาะสมสำหรับคุณ ผมทำอย่างใดอย่างหนึ่งในขณะที่กลับคุณสามารถดาวน์โหลด / ตรวจสอบออกที่นี่: ionko.com/index.php/work/simple-and-flexible-tabs
Ionko Gueorguiev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.