Вертикальный аккордеон
HTML аккордеон, в отличии от таб-вкладок, должен иметь фиксированную высоту, пусть даже она равна 100% высоты экрана монитора [см. единицу измерения vh]. Его можно применять для создания вертикального меню, которое раскрывается вниз, например, что-то вроде этого [www.cssplay.co.uk].
<div class="horizontal-click"> <input type="radio" name="vkl" id="vkl1" checked="checked"/> <label for="vkl1">Заголовок 1</label> <div>Вкладка 1</div> <input type="radio" name="vkl" id="vkl2"/> <label for="vkl2">Заголовок 2</label> <div>Вкладка 2</div> <input type="radio" name="vkl" id="vkl3"/> <label for="vkl3">Заголовка 3</label> <div>Вкладка 3</div> </div>
.horizontal-click [name="vkl"] { display: none; } .horizontal-click > :not(input):not(label) { overflow: hidden; height: 0; margin: 0; padding: 0 .5em; border: 1px solid #808080; border-top-style: none; transition: .5s; } .horizontal-click > label { overflow: hidden; display: block; padding: .5em 1em; background: #606060; color: rgb(200,200,200); white-space: nowrap; text-overflow: ellipsis; cursor: pointer; } .horizontal-click > :checked + label + * { overflow: auto; height: 310px; } .horizontal-click > :checked + label { background: #454545; cursor: default; }
Код подходит для "резинового" дизайна:
- если содержимое не помещается в поле
div
, то появляются полосы прокрутки, - если заголовок вкладки не помещается в строку, то он будет обрезан, в окончании названия проставлено многоточие.
Изначально будет открыта та вкладка, радиокнопка которой помечена checked="checked"
.
На странице может быть несколько аккордионов. id
и for
каждого input
и label
соответственно, а также name
группы input
должны отличаться.
После названия вкладки label
может идти любой тег, не обязательно div
.
-
HTML
<ul class="horizontal-hover"> <li> <h4>Заголовок 1</h4> <div>Вкладка 1</div> <li> <h4>Заголовок 2</h4> <div>Вкладка 2</div> <li> <h4>Заголовка 3</h4> <div>Вкладка 3</div> </ul>
-
CSS
.horizontal-hover { height: calc(310px + 35px*3 + 1px*2); overflow: hidden; outline: 1px solid #808080; } .horizontal-hover, .horizontal-hover > li, .horizontal-hover > li > h4 { display: block; margin: 0; padding: 0; } .horizontal-hover > li > h4 { overflow: hidden; height: 35px; line-height: 35px; border-bottom: 1px solid #808080; text-indent: .5em; background: #606060; color: rgb(200,200,200); white-space: nowrap; text-overflow: ellipsis; cursor: pointer; } .horizontal-hover > li > div, .horizontal-hover:hover > li:not(:last-child):not(:hover) > div { overflow: auto; height: 0; padding: 0 .5em; transition: .5s; } .horizontal-hover > li:first-child > div, .horizontal-hover > li:last-child > div, .horizontal-hover > li:hover > div { height: 310px; }
-
Дополнительная информация
Код подходит для "резинового" дизайна:
- если содержимое не помещается в поле
div
, то появляются полосы прокрутки, - если заголовок вкладки не помещается в строку, то он будет обрезан, в окончании названия проставлено многоточие.
На странице может быть несколько аккордионов.
- если содержимое не помещается в поле
Горизонтальный аккордеон.
Далее по аналогии.
<style type="text/css"> .galleryh {width: 490px;} .galleryh img, .galleryh:hover img:first-child {height: 333px; width: 30px; padding: 0px; outline: groove #9a3425;} .galleryh img:hover, .galleryh img:first-child, .galleryh:hover img:first-child:hover {width: 400px;} </style> <div class="galleryh"> <img alt="" src="URL_изо"/><img alt="" src="URL_изо"/><img alt="" src="URL_изо"/><img alt="" src="URL_изо"/></div>
- HTML<ul class="horizontalaccordion1">
<li id="raz1"><a href="#raz1">HTML</a><div>Информация первого слайда.</div></li>
<li id="dva1"><a href="#dva1">CSS</a><div>Информация второго слайда.</div></li>
<li id="tri1"><a href="#tri1">Автор</a><div>Информация третьего слайда.</div></li>
</ul> - CSS<style type="text/css">
.horizontalaccordion1 {
margin: 0; padding: 0;
height: 300px;
}
.horizontalaccordion1>li {
overflow: hidden;
float:left;
margin: 0; padding: 0;
list-style:none;
width:40px;
height: 300px;
background:#f0f0f0;
transition: width 0.3s; -moz-transition: width 0.3s; -webkit-transition: width 0.3s; -o-transition: width 0.3s;
}
.horizontalaccordion1>li>a {
display: inline-block;
margin: 0; padding: 10px;
height: 19px;
width: 280px;
border-left:#f0f0f0 1px solid;
font-family: Arial, Helvetica, sans-serif;
text-decoration: none;
color: #000;
background: #ccc;
white-space:nowrap;
background: -moz-linear-gradient(#999999, #cccccc);
background: -ms-linear-gradient(#999999, #cccccc);
background: -o-linear-gradient(#999999, #cccccc);
background: -webkit-linear-gradient(#999999, #cccccc);
-moz-transform: rotate(90.0deg) translate(-40px,0px); /* FF3.5+ */
-moz-transform-origin: 0 100%;
-o-transform: rotate(90.0deg) translate(-40px,0px); /* Opera 10.5 */
-o-transform-origin: 0 100%;
-webkit-transform: rotate(90.0deg) translate(-40px,0px); /* Saf3.1+, Chrome */
-webkit-transform-origin: 0 100%;
transform: rotate(90.0deg) translate(-40px,0px); /* Saf3.1+, Chrome */
transform-origin: 0 100%;
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)
progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff999999, endColorstr=#ffcccccc); /* IE6,IE7 */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)"
"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff999999, endColorstr=#ffcccccc)"; /* IE8 */
}
.horizontalaccordion1>li>div {
display: inline-block;
overflow: auto;
position:relative; top:-40px; left:40px;
*top:0px; *left:0px; /* IE7 Hack */
margin:0;
width:320px;
height:280px;
padding:10px;
}
.horizontalaccordion1>li:target {
overflow: hidden;
width: 380px;
}
.horizontalaccordion1>li:target>a {
color:#fff;
background: #000;
background: -moz-linear-gradient(#454545, #000000);
background: -ms-linear-gradient(#454545, #000000);
background: -o-linear-gradient(#454545, #000000);
background: -webkit-linear-gradient(#454545, #000000);
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0) progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff454545, endColorstr=#ff000000); /* IE 5.5 - IE 7 */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)"
"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff454545, endColorstr=#ff000000)"; /* IE 8 */
}
</style>
- АвторСм. ниже, только немного подкорректирован.
- HTML<ul class="horizontalaccordion">
<li><strong>HTML</strong><div>Информация первого слайда.</div></li>
<li><strong>CSS</strong><div>Информация второго слайда.</div></li>
<li><strong>Автор</strong><div>Информация третьего слайда.</div></li>
</ul> - CSS<style type="text/css">
.horizontalaccordion {
margin: 0; padding: 0;
height: 300px; width:460px;
}
.horizontalaccordion>li, .horizontalaccordion:hover>li:last-child {
overflow: hidden;
float:left;
margin: 0; padding: 0;
list-style:none;
width:40px;
height: 300px;
background:#f0f0f0;
transition: width 0.3s; -moz-transition: width 0.3s; -webkit-transition: width 0.3s; -o-transition: width 0.3s;
}
.horizontalaccordion>li>strong, .horizontalaccordion:hover>li:last-child>strong {
display: inline-block;
margin: 0; padding: 10px;
height: 19px;
width: 280px;
border-left:#f0f0f0 1px solid;
font-family: Arial, Helvetica, sans-serif;
text-decoration: none;
color: #000;
background: #ccc;
white-space:nowrap;
background: -moz-linear-gradient(#999999, #cccccc);
background: -ms-linear-gradient(#999999, #cccccc);
background: -o-linear-gradient(#999999, #cccccc);
background: -webkit-linear-gradient(#999999, #cccccc);
-moz-transform: rotate(90.0deg) translate(-40px,0px); /* FF3.5+ */
-moz-transform-origin: 0 100%;
-o-transform: rotate(90.0deg) translate(-40px,0px); /* Opera 10.5 */
-o-transform-origin: 0 100%;
-webkit-transform: rotate(90.0deg) translate(-40px,0px); /* Saf3.1+, Chrome */
-webkit-transform-origin: 0 100%;
transform: rotate(90.0deg) translate(-40px,0px); /* Saf3.1+, Chrome */
transform-origin: 0 100%;
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)
progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff999999, endColorstr=#ffcccccc); /* IE6,IE7 */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)"
"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff999999, endColorstr=#ffcccccc)"; /* IE8 */
}
.horizontalaccordion>li>div, .horizontalaccordion:hover>li:last-child>div {
font: 13px normal helvetica, sans-serif;
display:none;
overflow: auto;
position:relative; top:-40px; left:40px;
*top:0px; *left:0px; /* IE7 Hack */
margin:0;
width:320px;
height:280px;
padding:10px;
}
.horizontalaccordion>li:hover, .horizontalaccordion>li:last-child, .horizontalaccordion:hover>li:last-child:hover {
overflow: hidden;
width: 380px;
}
.horizontalaccordion:hover>li:hover>div, .horizontalaccordion>li:last-child>div, .horizontalaccordion:hover>li:last-child:hover>div {
display: inline-block;
}
.horizontalaccordion:hover>li:hover>strong, .horizontalaccordion>li:last-child>strong, .horizontalaccordion:hover>li:last-child:hover>strong {
color:#fff;
background: #000;
background: -moz-linear-gradient(#454545, #000000);
background: -ms-linear-gradient(#454545, #000000);
background: -o-linear-gradient(#454545, #000000);
background: -webkit-linear-gradient(#454545, #000000);
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0) progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff454545, endColorstr=#ff000000); /* IE 5.5 - IE 7 */
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1.0)"
"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff454545, endColorstr=#ff000000)"; /* IE 8 */
}
.horizontalaccordion>li>strong:hover {
cursor:pointer;
}
</style> - Автор
Похожие материалы:
51 комментарий:
Это то, что мне уже давно было необходимым сделать, а теперь к конкретике. На счет вот этого "аккордеона", попробовал его поставить на экспериментальный блог, получилось довольно не плохо. Но сделал это не в сообщении, а на отдельной странице, так как при открытии все, что находится ниже съезжает вниз. Хотя, это не так важно, ведь при закрытии возвращается обратно и человек может читать дальше,так что можно и сообщение поставить (попробую). А спросить хотел вот что: как Вы считаете, будет ли индексироваться тот текст, который находиться внутри. То есть, сможет ли увидеть его ПС?
И если Вы не возражаете, то я опубликую у себя на блоге пост про Вас и ваши полезности со ссылкой на ваш блог (открытой), а потом вернусь и оставлю свою ссылку? На этот вопрос можете ответить по почте misecondi45@gmail.com. И еще раз Вам спасибо!
Да, поисковые системы его превосходно индексируют, они читают код, который можно увидеть, нажав правую клавишу мышки на странице сайта-"Исходный код страницы".
Вот только как они его воспримут затрудняюсь сказать.
У "страниц с невидимым или слабовидимым текстом или ссылками" могут быть проблемы с ранжированием и индексированием (http://help.yandex.ru/webmaster/?id=995298#995342). Дело в том, ряд веб-мастеров размещают контент только для поисковых систем, которые не нужно видеть пользователю, чтобы повлиять на позицию в выдаче. Например, когда количество ключевых слов на странице было определяющим фактором, они прятали "купить машину купить машину купить машину..." и так несколько сток в display: none. Тоже самое с ссылками: продавали ссылки со страницы, но посетителям они ни к чему. Поисковики стали наказывать.
Но с другой стороны, сейчас активно используют раскрывающее меню, которое построено на том же display: none. Или моя страница со скриптом показать/скрыть текст http://yandex.ru/yandsearch?text=%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B+%D0%B4%D0%BB%D1%8F+%D0%B2%D0%B5%D0%B1%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0&clid=50368&lr=51. И они прекрасно себя чувствуют в выдаче.
ОПИСАНИЕ -
текст описания
ИНГРИДИЕНТЫ +
РЕКОММЕНДАЦИИ +
.menu15 li > label:after {content: "\2b"; position: absolute; right:2%;}
.menu15 li > input:checked + label:after {content: "\2d"; position: absolute; right:2%;}
.menu15 li:hover > label {background: red;}
Mails, прошу, не нужно больше вопросов, у тебя для этого есть педагоги. Зачем тебе вообще институт, для чего тратишь время людей? 5 лет! Армия - 1 год! Купи корочку диплома и займись чем-нибудь полезным для себя. Х.З., может ты хочешь быть гениальным заправщиком на АЗС или суперпродавцом. У меня вон пример знакомого, который ничего не умеет в 30 лет кроме как сидеть у родителей на шее. Для этого высшее образование не нужно.
<a href="http://shpargalkablog.ru/2010/09/postroenie-ssylok-v-html.html" target="_blank">анкор</a>
или же приписывать sessionStorage к input, чтобы комп пользователя запоминал какой радио должен быть checked
<script>
document.getElementById('vkl1').onclick = function() {
if(document.getElementById('vkl1').checked) {
localStorage.setItem('vkl1', "true");
} else {
localStorage.setItem('vkl1', "false");
}
}
if (localStorage.getItem('vkl1') == "true") {
document.getElementById("vkl1").setAttribute('checked','checked');
}
document.getElementById('vkl2').onclick = function() {
if(document.getElementById('vkl2').checked) {
localStorage.setItem('vkl2', "true");
} else {
localStorage.setItem('vkl2', "false");
}
}
if (localStorage.getItem('vkl2') == "true") {
document.getElementById("vkl2").setAttribute('checked','checked');
}
document.getElementById('vkl3').onclick = function() {
if(document.getElementById('vkl3').checked) {
localStorage.setItem('vkl3', "true");
} else {
localStorage.setItem('vkl3', "false");
}
}
if (localStorage.getItem('vkl3') == "true") {
document.getElementById("vkl3").setAttribute('checked','checked');
}
</script>
Скрипт, наверно, можно как-то более красиво написать с меньшим количеством символов, но я сейчас не в силах думать над этим вопросом. Этот вариант работает безотказно.
К каждой вкладке надо дополнительно прописать строку. Разумеется к каждой дополнительной, после третьей. У меня их 8. Строки дописываем в CSS . ну и разумеется в коде HTML. вот CSS поправочки. В HTML, все так же по примеру на сайте :
.horizontal-click > [name^="vkl"]:nth-of-type(1):checked ~ [for^="vkl"]:nth-of-type(1) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(2):checked ~ [for^="vkl"]:nth-of-type(2) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(3):checked ~ [for^="vkl"]:nth-of-type(3) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(4):checked ~ [for^="vkl"]:nth-of-type(4) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(5):checked ~ [for^="vkl"]:nth-of-type(5) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(6):checked ~ [for^="vkl"]:nth-of-type(6) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(7):checked ~ [for^="vkl"]:nth-of-type(7) + *,
.horizontal-click > [name^="vkl"]:nth-of-type(8):checked ~ [for^="vkl"]:nth-of-type(8) + * {
overflow: auto;
height: 310px;
}
.horizontal-click > [name^="vkl"]:nth-of-type(1):checked ~ [for^="vkl"]:nth-of-type(1),
.horizontal-click > [name^="vkl"]:nth-of-type(2):checked ~ [for^="vkl"]:nth-of-type(2),
.horizontal-click > [name^="vkl"]:nth-of-type(3):checked ~ [for^="vkl"]:nth-of-type(3),
.horizontal-click > [name^="vkl"]:nth-of-type(4):checked ~ [for^="vkl"]:nth-of-type(4),
.horizontal-click > [name^="vkl"]:nth-of-type(5):checked ~ [for^="vkl"]:nth-of-type(5),
.horizontal-click > [name^="vkl"]:nth-of-type(6):checked ~ [for^="vkl"]:nth-of-type(6),
.horizontal-click > [name^="vkl"]:nth-of-type(7):checked ~ [for^="vkl"]:nth-of-type(7),
.horizontal-click > [name^="vkl"]:nth-of-type(8):checked ~ [for^="vkl"]:nth-of-type(8) {
background: #454545;
cursor: default;
http://jsfiddle.net/m3teersj/
Замените на visibility (см. http://shpargalkablog.ru/2012/12/display-visibility-css.html )
Скрипт очень удобный, решил добавить к кнопкам не текст а картинку. Как переключаться между картинками по клику?
Роман.
div class="horizontal-click"
input type="radio" name="anons" id="anons1" checked="checked"
label for="anons1"
img src="images/imgleft001.png" style="float: left;"
/label
div div
.horizontal-click label[for="vkl2"] {
background-image: url(http://2.bp.blogspot.com/-c4ScvKxvKBs/TkoXOfNQFHI/AAAAAAAACLA/0x_aaffS0t0/s00/background.jpg);
background-size: cover;
}
Если поле активное
.horizontal-click > :checked + label[for="vkl2"] {
background-image: url(http://2.bp.blogspot.com/-c4ScvKxvKBs/TkoXOfNQFHI/AAAAAAAACLA/0x_aaffS0t0/s00/background.jpg);
}
Роман.
наверное придется остановиться на куче background для активного и не активного label, но картинки тяжелые, хотелось менять только активные иконки без смены основного background.
Роман.
1) http://jsfiddle.net/NMitra/8s6y8axt/ (одна картинка - для активного состояния, другая - для неактивного)
2) http://jsfiddle.net/NMitra/8s6y8axt/1/ (у каждого label своя картинка, которая меняется на общую картинку для активного состояния)
3) см. комментарий 36 (у каждого своя активная и неактивная картинка)
1) Для .horizontal-click > label установить единый background-color, но индивидуальные иконки (img.png)
пути к которым прописывать в CSS.
2) Единая подложка для
.horizontal-click > :checked + label {background-image: url('images/bg_slider.jpg'); background-repeat: no-repeat; cursor: default;}
Задача менять IMG1, IMG2 и т.д. при раскрытии активного аккордеона без изменения background-image в пункте 2.
Вариант коммента 39 отрабатывает все на 100%, но background-image большого размера, а IMG иконки весят 10кб.
Как подключить изменение IMG1-1 на IMG1-2 к .horizontal-click > :checked + label.
Перешерстил много примеров, ничего подобного не нашел.
Роман.
Можно иконки добавлять поверх label с помощью :after и уже менять :after, а не label
В сложенном состоянии все картинки smile желтые, по клику меняется на зеленую
Можно брать прозрачные картинки и менять фон под ними.
Других вариантов нет, только менять саму картинку, то есть background-image.
О, вспомнила! Есть ещё background-blend-mode (для фона)
http://shpargalkablog.ru/2011/08/fon-dlya-saita-html.html#size
http://sarasoueidan.com/blog/compositing-and-blending-in-css/
То есть, мне надо, чтобы при заходе на страницу в зависимости от текущего времени сервера по умолчанию открывалась определенная вкладка в горизонтальном аккордеоне.