2013-02-26 3 views
65

У меня есть чистый CSS-разборный div, который основан на чужом коде, который использует psedoclass :target. То, что я пытаюсь настроить, - это страница с 12 + вопросами, и когда вы нажимаете кнопку +, ответ div расширяется ниже. Я не могу понять, как сделать несколько сворачивающихся элементов div на этой странице без написания тонны дополнительного CSS. У кого-нибудь есть предложения по написанию этого, поэтому мой CSS-код сведен к минимуму? (т. е. поэтому мне не нужно вводить кучу уникальных селекторов для каждого из 12+ вопросов).Pure CSS collapse/expand div

Я не могу использовать 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

ответ

20

Вам просто нужно перебирать якоря в две ссылки.

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

Смотрите эту jsfiddle http://jsfiddle.net/eJX8z/

Я также добавил некоторый запас для часто задаваемых вопросов вызова, чтобы улучшить формат.

+0

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

+0

Кстати забыл упомянуть, что: цель не работает в IE8 или старше, сюрприз! И css PIE не поможет в этом, так что вы можете захотеть взглянуть на параметр jQuery, если вам интересна совместимость браузера. –

+0

Спасибо, это намного чище. Примерно треть нашей потенциальной целевой аудитории будет на IE8. Я думал о добавлении некоторого условного CSS, который бы просто открыл все divs при загрузке. – dmarvs

+0

Я думаю, что интерфейс с вкладками может быть правильным решением для вас. Я сделал это некоторое время назад, вы можете скачать/проверить его здесь: http://ionko.com/index.php/work/simple-and-flexible-tabs. –

72

В зависимости от того, что браузеры/устройства вы хотите поддержать, или то, что вы готовы мириться с не для совместимые браузеры, вы можете проверить теги <summary> и <detail>. Они предназначены именно для этой цели. Никакой css вообще не требуется, поскольку свертывание и показ являются частью определения/форматирования тегов.

Я сделал пример here:

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

Browser support varies. Try в WebKit для достижения наилучших результатов. Другие браузеры могут по умолчанию показывать все решения. Возможно, вы можете вернуться к методу hide/show, описанному выше.

+9

Это не работает для меня в браузере Firefox –

+1

[Ошибка 591737] (https://bugzilla.mozilla.org/show_bug.cgi?id=591737) - это ошибка, отслеживающая поддержку в Firefox. – ShreevatsaR

+3

Проверьте поддержку браузера [здесь] (http://www.w3schools.com/tags/tag_summary.asp) –

9

@gbtimmon Ответ велик, но путь слишком сложный. Я упростил его код настолько, насколько это возможно.

#answer, 
 
#show, 
 
#hide:target { 
 
    display: none; 
 
} 
 

 
#hide:target + #show, 
 
#hide:target ~ #answer { 
 
    display: initial; 
 
}
<a href="#hide" id="hide">Show</a> 
 
<a href="#" id="show">Hide</a> 
 
<div id="answer"><p>Answer</p></div>

16

Использование <summary> и <details>

Использование <summary> и <details> элементов является самым простым, но видеть, как browser support ток 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>

Смотрите также how to style the <details> element (HTML5 Doctor) (немного сложнее).

Чистого CSS3

Селектор :target имеет довольно хороший browser support, и он может быть использован, чтобы сделать единой складной элемент внутри рамы.

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

См How to Make Collapsing Lists Without Java | eHow.

+1

'

' и '
' все еще не работает во всех основных браузерах. – TranslucentCloud

+1

@TranslucentCloud Вот что я сказал. ;) – Wernight

+0

А также об этом сказал автор другого ответа. – TranslucentCloud

-2

Что-то вроде этого?

document.getElementById("control").addEventListener('click', function() { 
 
    var props = document.getElementsByClassName("property"); 
 
    for (var i = 0; i < props.length; i++) { 
 
    props[i].classList.toggle("show"); 
 
    } 
 
});
#control{ 
 
    height:24px; 
 
    width:24px; 
 
    background:blue; 
 
} 
 
.property{ 
 
    height:0px; 
 
    overflow: hidden; 
 
    transition: 4s ease-in-out; 
 
    font-size:0px; 
 
    margin:0; 
 
    border:1px solid green; 
 
} 
 
.show{ 
 
    height:1em; 
 
    overflow:initial; 
 
    font-size:12px; 
 
}
<div id="control"></div> 
 
<div class="property">red</div> 
 
<div class="property">blue</div> 
 
<div class="property">green</div>

+2

Автор темы попросил только решения CSS3 – mxmehl