Чистий CSS згортання / розгортання div


91

У мене є чистий CSS-розбірний div, який базується на чужому коді, який використовує :targetpsuedoclass. Я намагаюся створити сторінку з 12+ запитаннями, і коли ви натискаєте кнопку +, відповідь 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

Відповіді:


104

Залежно від того, які браузери / пристрої ви хочете підтримати, або що ви готові змиритися з несумісними браузерами, ви можете перевірити теги <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>

Підтримка браузера різниться. Спробуйте веб-комплект для найкращих результатів. Інші браузери можуть за замовчуванням відображати всі рішення. Можливо, ви можете повернутися до методу приховування / показу, описаного вище.


2
Помилка 591737 - це помилка, яка відстежує підтримку у Firefox.
ShreevatsaR

9
Майже середина 2016 року, і підтримка цього відсутня. Безумовно, не використовуйте це рішення.
Дуейн Чаррінгтон,

3
Підтримка @DigitalSea, оскільки `` не існує '', є неправильною, і `` однозначно не використовувати це рішення '' - сильні слова для стандарту, який був стабільним протягом декількох років і з 2010 року мав доступ до полізаповнення mathiasbynens.be/notes/html5-details- jquery . Що є підставою для Вашого аргументу? MS edge, швидше за все, реалізує ці теги найближчим часом Firefox застосував теги зведення / деталізації (але в даний час він стоїть за прапором). Webkit підтримує його за замовчуванням, починаючи з chrome 12, як і сафарі в браузерах, похідних від OS X та iOS - chrome mobile / desktop, Opera підтримує це за замовчуванням
Турстан

1
@Thurstan Немає підтримки в; IE8, IE9, IE10, IE11, Edge 13, підтримка у Firefox не відбуватиметься до серпня 2016 року. Отже, якщо ви не маєте розкоші повністю відмовитись від підтримки IE і в даний час Edge та Firefox, так, не підтримуються добре. Полізаповнення по суті робить те, що ви вже можете робити з Javascript (без jQuery), і досить ефективно. Поліфіл для цієї простої у реалізації функції - надмірний. Рішення, яке ви зв’язали, використовує jQuery, що є непотрібним. Я не був би здивований, якщо б ми все одно побачили це як видалене зі специфікації.
Дуейн Чаррінгтон,

4
Я розробляю лише для сучасних браузерів, і ця техніка чудово працювала для мого випадку використання, і не вимагала жодного вибору CSS!
Джош Хабдас

39

Використання <summary>та<details>

Використання <summary>та <details>елементи є найпростішим, але ми бачимо підтримку браузера, оскільки поточний IE його не підтримує. Ви можете поліфіл заповнити (більшість із них засновані на 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) (трохи хитро).

Чистий CSS3

: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>все ще не працює у всіх основних браузерах.
Нейромедіатор

4
@TranslucentCloud Ось що я сказав. ;)
Wernight

А також це сказав автор іншої відповіді.
Нейромедіатор

1
Чи є спосіб додати до цього анімацію переходу?
azizj1

1
Для анімованої версії, де текст ковзає вниз і зникає при використанні переходу CSS, дивіться цей допис у блозі
sketchyTech

25

Відповідь @ 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 відповідає лише нижче ("Чистий 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

18

Або супер проста версія з ледве будь-яким 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, якщо сумісність браузера вас цікавить.
Йонко Георгієв

Дякую, це набагато чистіше. Близько третини нашої потенційної цільової аудиторії буде на IE8. Я думав просто додати якийсь умовний CSS, який би просто відкрив усі div при завантаженні.
dmarvs

Я думаю, що інтерфейс із вкладками може бути правильним рішенням для вас. Я зробив це трохи назад, ви можете завантажити / перевірити це тут: ionko.com/index.php/work/simple-and-flex-tabs .
Йонко Георгієв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.