Свернуть / развернуть div на чистом CSS

91

У меня есть сворачиваемый div на чистом CSS, который основан на чужом коде, который использует :targetпсевдокласс. Я пытаюсь создать страницу с более чем 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;
}
dmarvs
источник
6
Всем, кто видит это, не используя wordpress, я могу сказать, ПОЖАЛУЙСТА, НЕ ДЕЛАЙТЕ ЭТО. Это взлом, и он нарушает заднюю функциональность страницы, что очень раздражает.
gbtimmon

Ответы:

105

В зависимости от того, что браузеры / устройства вы хотите поддержать, или то , что вы готовы мириться с для несовместимых браузеров вы можете проверить <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 для достижения наилучших результатов. Другие браузеры могут по умолчанию отображать все решения. Возможно, вы можете вернуться к методу скрытия / показа, описанному выше.

Thurstan
источник
2
Ошибка 591737 - это ошибка, которая отслеживает поддержку в Firefox.
ShreevatsaR
9
Сейчас почти середина 2016 года, а поддержки для этого нет. Определенно не используйте это решение.
Дуэйн Чаррингтон
3
Поддержка @DigitalSea "несуществующая" неверна, а "определенно не используйте это решение" - сильные слова для стандарта, который был стабильным в течение нескольких лет и для которого с 2010 года доступен полифилл mathiasbynens.be/notes/html5-details- jquery . На чем основаны ваши аргументы? MS Edge, скорее всего, скоро реализует эти теги. Firefox реализовал теги сводки / подробности (но в настоящее время имеет это за флагом). Webkit поддерживает его по умолчанию, начиная с Chrome 12, как и Safari в браузерах, производных от OS X и iOS Blink - Chrome для мобильных / настольных ПК, Opera поддерживает его по умолчанию
Thurstan
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>

Wernight
источник
1
<summary>и по- <details>прежнему не работают во всех основных браузерах.
Нейротрансмиттер
4
@TranslucentCloud Вот что я сказал. ;)
Wernight
Об этом же сказал и автор другого ответа.
Neurotransmitter
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 очень
полезна
Это не работает при использовании более одного раза на одной странице: нажатие на скрыть / показать влияет на все 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, чтобы улучшить формат.

gbtimmon
источник
Спасибо! Я пробовал это, но по какой-то причине у меня это не сработало. Должно быть, у меня была ошибка, которую я никогда не ловил.
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/

Ионко Георгиев
источник
Кстати, забыл упомянуть, что: target не работает в IE8 и старше, сюрприз-сюрприз! И css PIE тоже не поможет, так что вы можете посмотреть на вариант jQuery, если вам интересна совместимость с браузером.
Ионко Георгиев
Спасибо, это намного чище. Около трети нашей потенциальной целевой аудитории будет использовать IE8. Я думал просто добавить некоторый условный CSS, который просто открывал бы все div при загрузке.
dmarvs
Я думаю, что интерфейс с вкладками может быть для вас правильным решением. Некоторое время назад я сделал один, вы можете скачать / проверить его здесь: ionko.com/index.php/work/simple-and-f flexible-tabs .
Ионко Георгиев