순수 CSS 축소 / 확장 div


92

:targetpsuedoclass 를 사용하는 다른 사람의 코드를 기반으로하는 순수한 CSS 축소 가능 div가 있습니다. 내가 설정하려는 것은 12 개 이상의 질문이있는 페이지이며 + 버튼을 클릭하면 답변 div가 아래로 확장됩니다. 많은 추가 CSS를 작성하지 않고이 페이지에서 여러 축소 div 요소를 만드는 방법을 알 수 없습니다. 누구든지 이것을 작성하는 방법에 대한 제안이 있으므로 CSS 코드가 최소화됩니까? (즉, 12 개 이상의 질문에 대해 고유 한 선택자를 입력 할 필요가 없습니다.)

이것은 JS를 허용하지 않는 wordpress.com 사이트에서 진행되고 있기 때문에 Javascript를 사용할 수 없습니다.

내 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
워드 프레스를 사용하지 않는 것을 본 사람에게 제발 제발 이렇게 말 해주세요. 그것은 해킹이며 매우 성가신 페이지의 뒷면 기능을 손상시킵니다.
gbtimmon 2013

답변:


107

지원하려는 브라우저 / 장치 또는 비 호환 브라우저를 위해 준비한 사항에 따라 <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 2014 년

9
거의 2016 년 중반이며 이에 대한 지원이 존재하지 않습니다. 이 솔루션을 사용하지 마십시오.
Dwayne Charrington 2016

3
@DigitalSea 지원이 '존재하지 않음'은 올바르지 않으며 '확실히이 솔루션을 사용하지 마십시오'는 몇 년 동안 안정적이었고 2010 년부터 폴리 필을 사용할 수있는 표준에 대한 강력한 단어입니다 mathiasbynens.be/notes/html5-details- jquery . 당신의 주장의 근거는 무엇입니까? MS edge는 곧 이러한 태그를 구현할 것입니다. Firefox는 요약 / 세부 태그를 구현했습니다 (현재는 플래그 뒤에 있음) Webkit은 OS X 및 iOS Blink 파생 브라우저 (Chrome 모바일 / 데스크톱에서 사파리)와 마찬가지로 Chrome 12부터 기본으로 지원합니다. 오페라가 기본으로 지원
Thurstan

1
@Thurstan 지원 안 함; IE8, IE9, IE10, IE11, Edge 13, 2016 년 8 월까지 Firefox에서 지원되지 않습니다. 따라서 IE를 완전히 지원하지 않고 현재 Edge와 Firefox를 지원하지 않는 한 잘 지원되지 않습니다. polyfill은 기본적으로 Javascript (jQuery없이)로 이미 할 수있는 작업을 매우 효율적으로 수행합니다. 이 기능을 쉽게 구현할 수있는 polyfill은 과잉입니다. 링크 한 솔루션은 불필요한 jQuery를 사용합니다. 어쨌든 언젠가 사양에서 제거되는 것을 보면 놀라지 않을 것입니다.
Dwayne Charrington 2016

4
저는 최신 브라우저 용으로 만 개발 중이며이 기술은 제 사용 사례에 완벽하게 작동했으며 CSS를 핥을 필요가 없었습니다!
Josh Habdas

39

<summary>및 사용<details>

<summary><details>요소를 사용 하는 것이 가장 간단하지만 현재 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>

요소 스타일 지정 방법 <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

업데이트 : @Wernight의 CSS 만 아래에 답변합니다 ( "Pure CSS3", CSS와 비슷하지만 클래스 사용). 동일한 페이지에서 여러 div에서 작동합니다.
phhu

1
@phhu 예, 동일한 ID를 재사용하면 작동하지 않습니다. 다른 ID 세트 ( 예 : 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 2013

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 옵션을 살펴 보는 것이 좋습니다.
Ionko Gueorguiev 2013

감사합니다. 훨씬 깨끗합니다. 잠재적 인 타겟 고객의 약 1/3이 IE8에있을 것입니다. 로드시 모든 div를 여는 조건부 CSS를 추가하려고 생각했습니다.
dmarvs 2013

탭으로 된 인터페이스가 귀하에게 적합한 솔루션이라고 생각합니다. 나는 잠시 전에 다운로드 / 확인할 수 있습니다 : ionko.com/index.php/work/simple-and-flexible-tabs .
Ionko Gueorguiev 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.