Thu gọn / mở rộng CSS thuần túy div


91

Tôi có một div có thể thu gọn CSS thuần túy dựa trên mã của người khác, người sử dụng :targettân cổ điển. Những gì tôi đang cố gắng thiết lập là một trang có hơn 12 câu hỏi và khi bạn nhấp vào nút +, div câu trả lời sẽ mở rộng bên dưới. Tôi không thể tìm ra cách tạo nhiều phần tử div thu gọn trên trang này mà không cần viết thêm nhiều CSS. Bất cứ ai có đề xuất về cách viết điều này để mã CSS của tôi được giảm thiểu? (tức là, tôi không phải nhập một loạt các bộ chọn duy nhất cho mỗi câu hỏi trong số hơn 12 câu hỏi).

Tôi không thể sử dụng Javascript vì nó đang diễn ra trên một trang web wordpress.com không cho phép JS.

Đây là jfiddle của tôi: 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
Đối với bất kỳ ai nhìn thấy điều này không sử dụng wordpress, tôi có thể vui lòng nói VUI LÒNG KHÔNG LÀM VIỆC NÀY. Đó là một cuộc tấn công và nó phá vỡ chức năng trở lại của một trang, điều này rất khó chịu.
gbtimmon

Câu trả lời:


104

Tùy thuộc vào trình duyệt / thiết bị mà bạn đang tìm kiếm để hỗ trợ hoặc những gì bạn chuẩn bị sẵn sàng để áp dụng cho các trình duyệt không tuân thủ mà bạn có thể muốn xem các thẻ <summary><detail>. Chúng là chính xác cho mục đích này. Không cần css nào cả vì việc thu gọn và hiển thị là một phần của định nghĩa / định dạng thẻ.

Tôi đã làm một ví dụ ở đây :

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

Hỗ trợ trình duyệt khác nhau. Hãy thử trong bộ web để có kết quả tốt nhất. Các trình duyệt khác có thể mặc định hiển thị tất cả các giải pháp. Bạn có thể dự phòng cho phương pháp ẩn / hiện được mô tả ở trên.


2
Lỗi 591737 là lỗi theo dõi hỗ trợ trong Firefox.
ShreevatsaR

9
Đã gần giữa năm 2016 và hỗ trợ cho điều này là không tồn tại. Chắc chắn không sử dụng giải pháp này.
Dwayne Charrington

3
Hỗ trợ @DigitalSea là 'không tồn tại' là không chính xác và 'chắc chắn không sử dụng giải pháp này' là những từ mạnh mẽ cho một tiêu chuẩn đã ổn định trong vài năm và đã có sẵn một polyfill từ năm 2010 mathiasbynens.be/notes/html5-details- jquery . Cơ sở cho lập luận của bạn là gì? MS edge có thể sẽ sớm triển khai các thẻ này Firefox đã triển khai các thẻ tóm tắt / chi tiết (nhưng hiện có thẻ này đằng sau một lá cờ) Webkit hỗ trợ nó làm mặc định kể từ chrome 12 cũng như safari trên các trình duyệt bắt nguồn từ OS X và iOS Blink - chrome mobile / desktop, opera hỗ trợ nó như mặc định
Thurstan

1
@Thurstan Không hỗ trợ trong; IE8, IE9, IE10, IE11, Edge 13, không được hỗ trợ trong Firefox cho đến tháng 8 năm 2016. Vì vậy, trừ khi bạn không thể bỏ qua hỗ trợ hoàn toàn của IE và hiện tại Edge và Firefox, vâng, không được hỗ trợ tốt. Về cơ bản, polyfill thực hiện những gì bạn có thể làm với Javascript (không có jQuery) và khá hiệu quả. Một polyfill cho một tính năng dễ thực hiện này là quá mức cần thiết. Giải pháp bạn đã liên kết sử dụng jQuery là không cần thiết. Tôi sẽ không ngạc nhiên nếu một ngày nào đó chúng ta thấy điều này bị xóa khỏi thông số kỹ thuật.
Dwayne Charrington

4
Tôi đang phát triển chỉ cho các trình duyệt hiện đại và kỹ thuật này hoạt động hoàn hảo cho trường hợp sử dụng của tôi và không yêu cầu một chút CSS!
Josh Habdas

39

Sử dụng <summary><details>

Sử dụng <summary><details>các phần tử là đơn giản nhất nhưng hãy xem hỗ trợ trình duyệt vì IE hiện tại không hỗ trợ. Tuy nhiên, bạn có thể polyfill (hầu hết đều dựa trên jQuery). Xin lưu ý rằng trình duyệt không được hỗ trợ tất nhiên sẽ hiển thị phiên bản mở rộng, vì vậy điều đó có thể được chấp nhận trong một số trường hợp.

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

Xem thêm cách tạo kiểu cho <details>phần tử (HTML5 Doctor) (hơi phức tạp).

CSS3 thuần túy

Bộ :targetchọn có hỗ trợ trình duyệt khá tốt và nó có thể được sử dụng để tạo một phần tử thu gọn duy nhất trong khung.

.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>vẫn không hoạt động trong tất cả các trình duyệt chính.
Neurotransmitter

4
@TranslucentCloud Đó là những gì tôi đã nói. ;)
Wernight

Và điều này cũng đã được tác giả của câu trả lời khác nói.
Neurotransmitter

1
Có cách nào để thêm hoạt ảnh chuyển tiếp vào này không?
azizj1

1
Đối với phiên bản hoạt hình nơi slide văn bản xuống và mất dần trong việc sử dụng chuyển tiếp CSS, thấy điều này blogpost
sketchyTech

25

Câu trả lời của @ gbtimmon rất hay, nhưng cách, quá phức tạp. Tôi đã đơn giản hóa mã của anh ấy nhiều nhất có thể.

#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
Làm việc với CSS3 đôi khi rất bổ ích :-)
mrmut

Điều này không hoạt động khi được sử dụng nhiều lần trên cùng một trang: nhấp vào ẩn / hiện ảnh hưởng đến tất cả các div. Có ai biết cách sửa đổi nó để nó hoạt động khi được sử dụng nhiều lần không?
phhu

Cập nhật: CSS của @Wernight chỉ trả lời bên dưới ("CSS3 thuần túy", CSS tương tự như này, nhưng sử dụng các lớp). không hoạt động với nhiều div trên cùng một trang.
phhu

1
@phhu vâng, nó sẽ không hoạt động nếu bạn sử dụng lại các ID giống nhau. Nó sẽ làm việc nếu bạn sẽ giới thiệu thiết lập khác của ID ( hide2, show2, answer2ví dụ). Hoặc các lớp học, nó không quan trọng.
Neurotransmitter

22

Bạn chỉ cần lặp lại các neo trong hai liên kết.

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

Xem jsfiddle này http://jsfiddle.net/eJX8z/

Tôi cũng đã thêm một số lợi nhuận vào lệnh gọi Câu hỏi thường gặp để cải thiện định dạng.


Cảm ơn bạn! Tôi đã thử điều đó, nhưng vì một số lý do mà nó không hiệu quả với tôi. Chắc hẳn đã có một lỗi mà tôi chưa bao giờ mắc phải.
dmarvs

18

Hoặc một phiên bản siêu đơn giản với hầu như không có bất kỳ css nào :)

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


Nhân tiện quên đề cập rằng: target không hoạt động trong IE8 trở lên, hãy ngạc nhiên! Và css PIE cũng không giúp được gì cho việc đó nên bạn có thể muốn xem xét tùy chọn jQuery nếu bạn quan tâm đến khả năng tương thích của trình duyệt.
Ionko Gueorguiev

Cảm ơn bạn, đó là sạch hơn nhiều. Khoảng một phần ba đối tượng mục tiêu tiềm năng của chúng tôi sẽ sử dụng IE8. Tôi đã nghĩ đến việc chỉ cần thêm một số CSS có điều kiện sẽ chỉ mở tất cả các div khi tải.
dmarvs

Tôi nghĩ rằng một giao diện được gắn thẻ có thể là giải pháp phù hợp cho bạn. Tôi đã làm một lần trở lại, bạn có thể tải xuống / kiểm tra nó tại đây: ionko.com/index.php/work/simple-and-flexible-tabs .
Ionko Gueorguiev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.