Czysty CSS zwiń / rozwiń div

91

Mam czysty, :targetzwijany element DIV CSS oparty na kodzie innej osoby korzystającej z psuedoclass. Próbuję skonfigurować stronę z ponad 12 pytaniami, a po kliknięciu przycisku + element div odpowiedzi rozwija się poniżej. Nie potrafię wymyślić, jak utworzyć wiele zwijanych elementów div na tej stronie bez pisania mnóstwa dodatkowego kodu CSS. Czy ktoś ma sugestie, jak to napisać, aby zminimalizować mój kod CSS? (tzn. nie muszę wprowadzać wielu unikalnych selektorów dla każdego z ponad 12 pytań).

Nie mogę używać Javascript, ponieważ dzieje się to w witrynie wordpress.com, która nie zezwala na JS.

Oto mój 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;
}
dmarvs
źródło
6
Każdemu, kto widzi to i nie używa wordpressa, mogę powiedzieć PROSZĘ NIE ROBIĆ TEGO. To hack i niszczy tylną funkcjonalność strony, która jest bardzo irytująca.
gbtimmon

Odpowiedzi:

104

W zależności od tego, jakie przeglądarki / urządzenia chcesz obsługiwać, lub na co jesteś przygotowany w przypadku niezgodnych przeglądarek, możesz sprawdzić tagi <summary>i <detail>. Służą dokładnie do tego celu. W ogóle nie jest wymagany css, ponieważ zwijanie i wyświetlanie są częścią definicji / formatowania tagów.

Zrobiłem tutaj przykład :

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

Obsługiwane przeglądarki są różne. Wypróbuj zestaw internetowy, aby uzyskać najlepsze wyniki. Inne przeglądarki mogą domyślnie wyświetlać wszystkie rozwiązania. Być może możesz wrócić do metody ukrywania / pokazywania opisanej powyżej.

Thurstan
źródło
2
Błąd 591737 to błąd, który śledzi obsługę przeglądarki Firefox.
ShreevatsaR
9
Jest już prawie połowa 2016 roku, a wsparcie dla tego nie istnieje. Zdecydowanie nie używaj tego rozwiązania.
Dwayne Charrington
3
Brak wsparcia @DigitalSea jest niepoprawny, a `` zdecydowanie nie używaj tego rozwiązania '' to mocne słowa na określenie standardu, który jest stabilny od kilku lat i ma polyfill dostępny od 2010 r. Mathiasbynens.be/notes/html5-details- jquery . Jaka jest podstawa twojego argumentu? MS edge prawdopodobnie zaimplementuje te tagi wkrótce Firefox zaimplementował tagi podsumowujące / szczegółowe (ale obecnie ma je za flagą) Webkit obsługuje je domyślnie od chrome 12, podobnie jak Safari w przeglądarkach opartych na OS X i iOS Blink - chrome mobile / desktop, opera obsługuje to domyślnie
Thurstan
1
@Thurstan Brak wsparcia w; IE8, IE9, IE10, IE11, Edge 13, brak wsparcia w Firefoksie do sierpnia 2016 r. Więc jeśli nie masz luksusu całkowitego rezygnacji z obsługi IE, a obecnie Edge i Firefox, tak, nie są dobrze obsługiwane. Wypełnienie zasadniczo robi to, co można już zrobić z Javascriptem (bez jQuery) i całkiem wydajnie. Wypełnienie dla tej łatwej do zaimplementowania funkcji to przesada. Rozwiązanie, które utworzyłeś, używa jQuery, co jest niepotrzebne. Nie zdziwiłbym się, gdybyśmy i tak pewnego dnia zobaczyli to usunięte ze specyfikacji.
Dwayne Charrington
4
Tworzę tylko dla nowoczesnych przeglądarek i ta technika działała idealnie w moim przypadku użycia i nie wymagała odrobiny CSS!
Josh Habdas
39

Korzystanie <summary>i<details>

Korzystanie z elementów <summary>i <details>jest najprostsze, ale zobacz obsługę przeglądarki, ponieważ obecny IE jej nie obsługuje. Możesz jednak wypełnić polyfill (większość z nich jest oparta na jQuery). Pamiętaj, że nieobsługiwana przeglądarka pokaże oczywiście po prostu rozszerzoną wersję, więc w niektórych przypadkach może to być dopuszczalne.

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

Zobacz także, jak stylizować <details>element (HTML5 Doctor) (trochę skomplikowane).

Czysty CSS3

:targetSelektor ma bardzo dobrą obsługę przeglądarki , a to może być wykorzystane do dokonania jednego składany elementu wewnątrz ramki.

.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
źródło
1
<summary>i <details>nadal nie działa we wszystkich głównych przeglądarkach.
Neurotransmitter
4
@TranslucentCloud Tak powiedziałem. ;)
Wernight
A także to powiedział autor drugiej odpowiedzi.
Neurotransmitter
1
Czy w ogóle można dodać do tego animację przejścia?
azizj1
1
Wersja animowana, w której tekst zsuwa się w dół i zanika przy użyciu przejścia CSS, można znaleźć w tym
wpisie na
25

Odpowiedź @ gbtimmon jest świetna, ale zdecydowanie zbyt skomplikowana. Uprościłem jego kod tak bardzo, jak tylko mogłem.

#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
źródło
3
Praca z CSS3 jest czasami bardzo satysfakcjonująca :-)
mrmut
To nie działa, gdy jest używane więcej niż raz na tej samej stronie: kliknięcie ukryj / pokaż wpływa na wszystkie elementy div. Czy ktoś wie, jak go zmodyfikować, aby działał, gdy jest używany więcej niż raz?
phhu
Aktualizacja: CSS @Wernight odpowiada tylko poniżej („Pure CSS3”, podobny CSS do tego, ale z użyciem klas). działa z wieloma elementami div na tej samej stronie.
phhu
1
@phhu tak, nie zadziała, jeśli ponownie użyjesz tych samych identyfikatorów. Będzie działać, jeśli będzie wprowadzić inny zestaw identyfikatorów ( hide2, show2, answer2na przykład). Albo zajęcia, to nie ma znaczenia.
Neurotransmiter
22

Wystarczy powtórzyć zakotwiczenia w dwóch łączach.

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

Zobacz to jsfiddle http://jsfiddle.net/eJX8z/

Dodałem również trochę marginesu do wezwania do FAQ, aby poprawić format.

gbtimmon
źródło
Dziękuję Ci! Próbowałem tego, ale z jakiegoś powodu to nie zadziała. Musiał mieć błąd, którego nigdy nie złapałem.
dmarvs
18

Lub super prosta wersja z prawie żadnym 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
źródło
Przy okazji zapomniałem o tym wspomnieć: target nie działa w IE8 lub starszym, niespodzianka! Css PIE też nie pomoże, więc możesz spojrzeć na opcję jQuery, jeśli interesuje Cię kompatybilność przeglądarki.
Ionko Gueorguiev
Dziękuję, to jest znacznie czystsze. Około jedna trzecia naszej potencjalnej grupy docelowej będzie korzystała z IE8. Myślałem o dodaniu warunkowego CSS, który po załadowaniu otworzyłby wszystkie elementy div.
dmarvs
Myślę, że interfejs z zakładkami może być dla Ciebie odpowiednim rozwiązaniem. Zrobiłem jeden jakiś czas temu, możesz go pobrać / sprawdzić tutaj: ionko.com/index.php/work/simple-and-f flexible-tabs .
Ionko Gueorguiev