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