Скрыть Показать список содержимого только с CSS, не используется javascript
Я искал хороший трюк, чтобы сделать Hide/Show содержимое или список только с CSS и без javascript.
Мне удалось сделать это:
<!DOCTYPE html>
<head>
<style>
#cont {display: none; }
.show:focus + .hide {display: inline; }
.show:focus + .hide + #cont {display: block;}
</style>
</head>
<body>
<div>
<a href="#show"class="show">[Show]</a>
<a href="#hide"class="hide">/ [Hide]</a>
<div id="cont">Content</div>
</div>
</body>
</html>
Демо здесь: http://jsfiddle.net/6W7XD/
И это работает, но не так, как должно. Вот проблема:
Когда содержимое отображается, вы можете скрыть его, нажав "в любом месте страницы". Как отключить это? как скрыть контент "только", нажав кнопку "Скрыть"?
Заранее благодарю вас!
Ответы
Ответ 1
Я бы не использовал флажки, я бы использовал код, который у вас уже есть
DEMO http://jsfiddle.net/6W7XD/1/
CSS
body {
display: block;
}
.span3:focus ~ .alert {
display: none;
}
.span2:focus ~ .alert {
display: block;
}
.alert{display:none;}
HTML
<span class="span3">Hide Me</span>
<span class="span2">Show Me</span>
<p class="alert" >Some alarming information here</p>
Таким образом, текст скрывается только щелчком элемента hide
Ответ 2
Это поразит вас: скрытые радиокнопки.
input#show, input#hide {
display:none;
}
span#content {
display:none;
}
input#show:checked ~ span#content {
display:block;
}
input#hide:checked ~ span#content {
display:none;
}
<label for="show">
<span>[Show]</span>
</label>
<input type=radio id="show" name="group">
<label for="hide">
<span>[Hide]</span>
</label>
<input type=radio id="hide" name="group">
<span id="content">Content</span>
Ответ 3
Есть 3 быстрых примера с чистым CSS и без javascript, где содержимое отображается "на клик", с "поддерживаемым кликом" и третьим "onhover" (все они только проверены в Chrome). Извините за этот пост, но этот вопрос является первым результатом seo, и, возможно, мой вклад может помочь начинающему, как мне
Я думаю (не проверен), но преимущество аргумента "контент", что вы можете добавить отличный значок, например, из Font Awesome (его\f -Code) или шестнадцатеричный значок вместо текста "Скрыть" и "Показать", чтобы интернационализировать трюк.
example link http://jsfiddle.net/MonkeyTime/h3E9p/2/
<style>
label { position: absolute; top:0; left:0}
input#show, input#hide {
display:none;
}
span#content {
display: block;
-webkit-transition: opacity 1s ease-out;
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
font-size: 0;
overflow: hidden;
}
input#show:checked ~ .show:before {
content: ""
}
input#show:checked ~ .hide:before {
content: "Hide"
}
input#hide:checked ~ .hide:before {
content: ""
}
input#hide:checked ~ .show:before {
content: "Show"
}
input#show:checked ~ span#content {
opacity: 1;
font-size: 100%;
height: auto;
}
input#hide:checked ~ span#content {
display: block;
-webkit-transition: opacity 1s ease-out;
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
font-size: 0;
overflow: hidden;
}
</style>
<input type="radio" id="show" name="group">
<input type="radio" id="hide" name="group" checked>
<label for="hide" class="hide"></label>
<label for="show" class="show"></label>
<span id="content">Lorem iupsum dolor si amet</span>
<style>
#show1 { position: absolute; top:20px; left:0}
#content1 {
display: block;
-webkit-transition: opacity 1s ease-out;
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
font-size: 0;
overflow: hidden;
}
#show1:before {
content: "Show"
}
#show1:active.show1:before {
content: "Hide"
}
#show1:active ~ span#content1 {
opacity: 1;
font-size: 100%;
height: auto;
}
</style>
<div id="show1" class="show1"></div>
<span id="content1">Ipsum Lorem</span>
<style>
#show2 { position: absolute; top:40px; left:0}
#content2 {
display: block;
-webkit-transition: opacity 1s ease-out;
transition: opacity 1s ease-out;
opacity: 0;
height: 0;
font-size: 0;
overflow: hidden;
}
#show2:before {
content: "Show"
}
#show2:hover.show2:before {
content: "Hide"
}
#show2:hover ~ span#content2 {
opacity: 1;
font-size: 100%;
height: auto;
}
/* extra */
#content, #content1, #content2 {
float: left;
margin: 100px auto;
}
</style>
<div id="show2" class="show2"></div>
<span id="content2">Lorem Ipsum</span>
Ответ 4
Это то, что я использовал недавно.
CSS
div#tabs p{display:none;}
div#tabs p.tab1:target {display:block;}
div#tabs p.tab2:target {display:block;}
div#tabs p.tab3:target {display:block;}
HTML
<div id='tabs'>
<h2 class="nav-tab-wrapper">
<a href="#tab1" class="nav-tab tab1">Pages</a>
<a href="#tab2" class="nav-tab nav-tab-active tab2">Email</a>
<a href="#tab3" class="nav-tab tab3">Support</a>
</h2>
<p id='tab1' class='tab1'>Awesome tab1 stuff</p>
<p id='tab2' class='tab2'>Tab2 stuff</p>
<p id='tab3' class='tab3'>Tab3 stuff</p>
</div>
https://jsfiddle.net/hoq0djwc/1/
Надеюсь, это поможет где-нибудь.
Ответ 5
Я использовал скрытый флажок для постоянного просмотра некоторых сообщений. Флажок может быть скрыт (отображение: нет) или нет. Это крошечный код, который я мог бы написать.
Вы можете увидеть и протестировать демо на JSFiddle
HTML:
<input type=checkbox id="show">
<label for="show">Help?</label>
<span id="content">Do you need some help?</span>
CSS:
#show,#content{display:none;}
#show:checked~#content{display:block;}
Выполнить фрагмент кода:
#show,#content{display:none;}
#show:checked~#content{display:block;}
<input id="show" type=checkbox>
<label for="show">Click for Help</label>
<span id="content">Do you need some help?</span>
Ответ 6
Во-первых, благодаря Уильяму.
Второй - мне нужна динамическая версия. И это работает!
Пример:
CSS
p[id^="detailView-"]
{
display: none;
}
p[id^="detailView-"]:target
{
display: block;
}
HTML:
<a href="#detailView-1">Show View1</a>
<p id="detailView-1">View1</p>
<a href="#detailView-2">Show View2</a>
<p id="detailView-2">View2</p>
Ответ 7
У меня есть еще одно простое решение:
HTML:
<a href="#alert" class="span3" tabindex="0">Hide Me</a>
<a href="#" class="span2" tabindex="0">Show Me</a>
<p id="alert" class="alert" >Some alarming information here</p>
CSS
body { display: block; }
p.alert:target { display: none; }
Источник: http://css-tricks.com/off-canvas-menu-with-css-target/
Ответ 8
Очень простое решение от cssportal.com
Если нажать [show], текст [show] будет скрыт и наоборот.
Этот пример не работает в Chrome, я не знаю почему...
.show {
display: none;
}
.hide:focus + .show {
display: inline;
}
.hide:focus {
display: none;
}
.hide:focus ~ #list { display:none; }
@media print {
.hide, .show {
display: none;
}
}
<div><a class="hide" href="#">[hide]</a> <a class="show" href="#">[show]</a>
<ol id="list">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ol>
</div>
Ответ 9
Я знаю это старое сообщение, но как насчет этого решения (Я сделал JSFiddle, чтобы проиллюстрировать его)... Решение, которое использует :after
псевдоэлементы <span>
для отображения/скрытия самой ссылки переключения <span>
(в дополнение к сообщению .alert
, которое должно показать/скрыть). Когда псевдоэлемент теряет фокус, сообщение скрыто.
Исходная ситуация - это скрытое сообщение, которое появляется, когда фокусируется <span>
с :after content : "Show Me";
. Когда этот <span>
сфокусирован, он :after content
становится пустым, а :after content
второго <span>
(который был первоначально пуст) превращается в "Скрыть меня" . Итак, когда вы нажимаете эту секунду <span>
, первая теряет фокус, и ситуация возвращается к исходному состоянию.
Я начал с решения, предлагаемого @Vector. Я сохранил представленную DOM информацию ky @Frederic Kizar
HTML:
<span class="span3" tabindex="0"></span>
<span class="span2" tabindex="0"></span>
<p class="alert" >Some message to show here</p>
CSS
body {
display: inline-block;
}
.span3 ~ .span2:after{
content:"";
}
.span3:focus ~ .alert {
display:block;
}
.span3:focus ~ .span2:after {
content:"Hide Me";
}
.span3:after {
content: "Show Me";
}
.span3:focus:after {
content: "";
}
.alert {
display:none;
}
Ответ 10
Ответ ниже включает в себя изменение текста для "show/hide" и использует один флажок, две метки, всего четыре строки html и пять строк css. Он также начинается с скрытого содержимого.
Попробуйте в JSFiddle
HTML
<input id="display-toggle" type=checkbox>
<label id="display-button" for="display-toggle"><span>Display Content</span></label>
<label id="hide-button" for="display-toggle"><span>Hide Content</span></label>
<div id="hidden-content"><br />Hidden Content</div>
CSS
label {
background-color: #ccc;
color: brown;
padding: 15px;
text-decoration: none;
font-size: 16px;
border: 2px solid brown;
border-radius: 5px;
display: block;
width: 200px;
text-align: center;
}
input,
label#hide-button,
#hidden-content {
display: none;
}
input#display-toggle:checked ~ label#display-button {
display: none;
}
input#display-toggle:checked ~ label#hide-button {
display: block;
background-color: #aaa;
color: #333
}
input#display-toggle:checked ~ #hidden-content {
display: block;
}
Ответ 11
Просто хочу проиллюстрировать в контексте вложенных списков полезность подхода скрытого чекбокса <input>
, который рекомендует @jeffmcneill - контекст, в котором каждый показанный/скрытый элемент должен сохранять свое состояние независимо от фокуса и состояния показа/скрытия других элементов на странице.
Придание значений с общим набором начальных символов атрибутам id
всех флажков, используемых для отображаемых/скрытых элементов на странице, позволяет использовать экономичную схему выбора [id^=""]
для правил таблицы стилей, которые переключают внешний вид элементов, на которые можно нажимать, и связанные показанные/скрытые элементы display
устанавливаются назад и вперед. Здесь мои id
- это расширенный-1, расширенный-2, расширенный-3.
Обратите внимание, что я также использовал идею селектора @Diepens :after
, чтобы сохранить элемент <label>
свободным от содержимого в html.
Также обратите внимание, что последовательность <input>
<label>
<div class="collapsible">
имеет значение, и соответствующий CSS с селектором +
вместо ~
.
jsfiddle здесь
.collapse-below {
display: inline;
}
p.collapse-below::after {
content: '\000A0\000A0';
}
p.collapse-below ~ label {
display: inline;
}
p.collapse-below ~ label:hover {
color: #ccc;
}
input.collapse-below,
ul.collapsible {
display: none;
}
input[id^="expanded"]:checked + label::after {
content: '\025BE';
}
input[id^="expanded"]:not(:checked) + label::after {
content: '\025B8';
}
input[id^="expanded"]:checked + label + ul.collapsible {
display: block;
}
input[id^="expanded"]:not(:checked) + label + ul.collapsible {
display: none;
}
<ul>
<li>single item a</li>
<li>single item b</li>
<li>
<p class="collapse-below" title="this expands">multiple item a</p>
<input type="checkbox" id="expanded-1" class="collapse-below" name="toggle">
<label for="expanded-1" title="click to expand"></label>
<ul class="collapsible">
<li>sub item a.1</li>
<li>sub item a.2</li>
</ul>
</li>
<li>single item c</li>
<li>
<p class="collapse-below" title="this expands">multiple item b</p>
<input type="checkbox" id="expanded-2" class="collapse-below" name="toggle">
<label for="expanded-2" title="click to expand"></label>
<ul class="collapsible">
<li>sub item b.1</li>
<li>sub item b.2</li>
</ul>
</li>
<li>single item d</li>
<li>single item e</li>
<li>
<p class="collapse-below" title="this expands">multiple item c</p>
<input type="checkbox" id="expanded-3" class="collapse-below" name="toggle">
<label for="expanded-3" title="click to expand"></label>
<ul class="collapsible">
<li>sub item c.1</li>
<li>sub item c.2</li>
</ul>
</li>
</ul>