Форум программистов, компьютерный форум, киберфорум
HTML, CSS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/173: Рейтинг темы: голосов - 173, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 25.04.2012
Сообщений: 13

Как сделать спойлер без JS?

25.04.2012, 14:48. Показов 34871. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно сделать спойлеры для этой страницы:
http://saytum.ru/faq

Примерно так же как на этой странице:
http://www.seone.ru/vazhno-znat/faq/

Но выпадающий текст должен индаксироваться! Так что JS не подходит. На одном из форумов мне кинули вот такой код:

HTML5
1
2
<a class="dynamic" href="#" onclick="$('.spoiler').toggle();return false;">Подробнее...</a>
<div class="spoiler">Скрытый текст</div>
#если несколько спойлеров на странице, то меняем на spoilerN в теге A и в div
CSS
1
2
3
4
5
6
7
8
9
10
11
12
.spoiler {
  display: none;
}
.spoiler1 {
  display: none;
}
 
class="dynamic"
a.dynamic {
    border-bottom: 1px dashed #0066CC;
    text-decoration: none;
}

НО как он работает я так и не понял...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2012, 14:48
Ответы с готовыми решениями:

Как сделать наиболее простой спойлер (spoiler) в php? (с минимумом кода)
Я хочу сделать самый простой спойлер в php: чтобы он просто открывался и закрывался, без анимации. Желательно чтобы кода было поменьше;...

Как сделать спойлер?
Почему не работает? &lt;head&gt; &lt;title&gt;Продвижение Вконтакте и Instagram&lt;/title&gt; &lt;meta charset=&quot;utf-8&quot;&gt; &lt;link...

Как сделать спойлер на каждый пункт?
Здравствуйте, допустим, есть FAQ на сайте, в нем есть несколько пунктов и в пунктах еще 8-10 подпунктов, можно ли сделать спойлер на каждый...

17
 Аватар для Heleg
209 / 209 / 6
Регистрация: 23.10.2011
Сообщений: 971
25.04.2012, 17:17
ну короче, тут библиотека jquery. по умолчанию крытый текст скрыт (display: none; ), при щелчке на .dynamic display меняется на block
зачем класс spoiler1 мне непонятно

Добавлено через 3 минуты
а, понял зачем

Цитата Сообщение от SlayerLiving Посмотреть сообщение
#если несколько спойлеров на странице, то меняем на spoilerN в теге A и в div
это бред
0
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
26.04.2012, 09:53
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script>
    var id_menu = new Array('user_block_1');
startList = function allclose() {
    for (i=0; i < id_menu.length; i++){
        document.getElementById(id_menu[i]).style.display = "none";
    }
}
 
 
function openMenu(id){
    for (i=0; i < id_menu.length; i++){
        if (id != id_menu[i]){
            document.getElementById(id_menu[i]).style.display = "none";
        }
    }
    if (document.getElementById(id).style.display == "block"){
        document.getElementById(id).style.display = "none";
    }else{
        document.getElementById(id).style.display = "block";
    }
}
window.onload=startList;
</script>
HTML5
1
2
3
4
<p  class="post_user_otkl"><a href="#" onclick="openMenu('user_block_1');return(false)">Показать все комментарии..</a> 
<div id="user_block_1">
//text
</div>
0
 Аватар для Heleg
209 / 209 / 6
Регистрация: 23.10.2011
Сообщений: 971
26.04.2012, 10:50
Макc, это перебор
0
466 / 430 / 117
Регистрация: 15.02.2012
Сообщений: 1,943
26.04.2012, 11:10
у человека тема без js - а это css3? что не будет дружить с ie

если же все же устроит js как предлагают выше можно еще так
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<style>
div.cli {display:none;margin-left:20px;}
div.clion {display:block;padding:5px;}
</style>
<script type="text/javascript">
    
$(document).ready(function(){
    $('a.cli').click(function(){
        if($(this).parent().next('div').hasClass("clion")){
            $('div.cli').removeClass("clion");
        }
        else{
        $('div.cli').removeClass("clion");
        $(this).parent().next('div').addClass("clion");
        }
    });
 
});
</script>
<p><a href="javascript:void(0);" class="cli">Маршрут</a></p>
 
<div class="cli">
<p> Возможность отследить на карте маршрут движения автомобиля позволит вам оценить оптимальность маршрута грузоперевозчика, предотвратить "левые" рейсы, сократить простои и пробег автомобилей.</p>
</div>
 
<p><a href="javascript:void(0);" class="cli">Маршрут2</a></p>
 
<div class="cli">
<p> Возможность отследить на карте маршрут движения автомобиля позволит вам оценить оптимальность маршрута грузоперевозчика, предотвратить "левые" рейсы, сократить простои и пробег автомобилей.</p>
</div>
0
 Аватар для Heleg
209 / 209 / 6
Регистрация: 23.10.2011
Сообщений: 971
26.04.2012, 11:11
я если найду код, который писал парню в похожей теме – вышлю
0
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
26.04.2012, 12:03
Цитата Сообщение от Heleg Посмотреть сообщение
Макc, это перебор
ой действительно! заголовок то какой!!!
0
 Аватар для Heleg
209 / 209 / 6
Регистрация: 23.10.2011
Сообщений: 971
26.04.2012, 23:02
о, нашел
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        div#content {
            width: 200px;
            height: 100%;
            margin: 0 auto;
        }
        
        p.post {
            background: #CCC;
        }
        
        p.read_more {
            background: #EE2255;
            text-align: center;
        }
        
    </style>
    <script type="text/javascript">
    
    // параметры
    var parameters = {
        buttonClass: 'read_more', //класс для кнопки
        hiddenTextClass: 'hidden' //класс для скрытого текста
    }
    
    
    
        function readMoreButton() {
            var p = document.createElement('p');
            p.setAttribute('class', parameters.buttonClass);
            var button = document.createElement('a');
            button.appendChild(document.createTextNode('читать далее'));
            p.appendChild(button);
            p.onclick = function() {
                this.previousSibling.style.display = 'inline';
                this.parentNode.removeChild(this);
                return false;
            }
            
            return p;
        }
        
        
        function insertAfter(parent, node, referenceNode) {
            parent.insertBefore(node, referenceNode.nextSibling);
        }
        
        
        if(document.getElementsByClassName) {
 
            getElementsByClass = function(classList, node) {    
                return (node || document).getElementsByClassName(classList)
            }
 
        } else {
 
            getElementsByClass = function(classList, node) {            
                var node = node || document,
                list = node.getElementsByTagName('*'), 
                length = list.length,  
                classArray = classList.split(/\s+/), 
                classes = classArray.length, 
                result = [], i,j
                for(i = 0; i < length; i++) {
                    for(j = 0; j < classes; j++)  {
                        if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
                            result.push(list[i])
                            break
                        }
                    }
                }
 
                return result
            }
        }
        
        window.onload = function() {
            
            var hiddenTexts = getElementsByClass(parameters.hiddenTextClass, document.getElementsByTagName('body')[0]);
            for(var i = 0; i<hiddenTexts.length; i++) {
                hiddenTexts[i].style.display = 'none';
                hiddenTexts[i].parentNode.insertBefore(readMoreButton(), hiddenTexts[i].nextSibling);
            }
            
        }
        
    </script>
</head>
<body>
 
<div id="content">
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
</div>
</body>
Добавлено через 3 минуты
span с классом hidden будет скрыт, а перед ним в коде появится кнопка

Добавлено через 11 минут
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<!DOCTYPE HTML>
<html lang="ru-RU">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        div#content {
            width: 200px;
            height: 100%;
            margin: 0 auto;
        }
        
        p.post {
            background: #CCC;
        }
        
        p.read_more {
            background: #EE2255;
            text-align: center;
        }
        
    </style>
    <script type="text/javascript">
    
    // параметры
    var parameters = {
        buttonClass: 'read_more', //класс для кнопки
        buttonText: 'читать далее', //текст внутри кнопки
        hiddenTextClass: 'hidden' //класс для скрытого текста
    }
    
    
    
        function readMoreButton() {
            var p = document.createElement('p');
            p.setAttribute('class', parameters.buttonClass);
            var button = document.createElement('a');
            button.setAttribute('href','#');
            button.appendChild(document.createTextNode(parameters.buttonText));
            p.appendChild(button);
            p.onclick = function() {
                this.previousSibling.style.display = 'inline';
                this.parentNode.removeChild(this);
                return false;
            }
            
            return p;
        }
        
        
        function insertAfter(parent, node, referenceNode) {
            parent.insertBefore(node, referenceNode.nextSibling);
        }
        
        
        if(document.getElementsByClassName) {
 
            getElementsByClass = function(classList, node) {    
                return (node || document).getElementsByClassName(classList)
            }
 
        } else {
 
            getElementsByClass = function(classList, node) {            
                var node = node || document,
                list = node.getElementsByTagName('*'), 
                length = list.length,  
                classArray = classList.split(/\s+/), 
                classes = classArray.length, 
                result = [], i,j
                for(i = 0; i < length; i++) {
                    for(j = 0; j < classes; j++)  {
                        if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) {
                            result.push(list[i])
                            break
                        }
                    }
                }
 
                return result
            }
        }
        
        window.onload = function() {
            
            var hiddenTexts = getElementsByClass(parameters.hiddenTextClass, document.getElementsByTagName('body')[0]);
            for(var i = 0; i<hiddenTexts.length; i++) {
                hiddenTexts[i].style.display = 'none';
                hiddenTexts[i].parentNode.insertBefore(readMoreButton(), hiddenTexts[i].nextSibling);
            }
            
        }
        
    </script>
</head>
<body>
 
<div id="content">
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
    <p class="post"><span>видимый текст видимый текст видимый текст видимый текст видимый текст видимый текст </span><span class="hidden">скрытый текст скрытый текст скрытый текст скрытый текст скрытый текст </span></p>
</div>
</body>
</html>
добаил ещё один параметр
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.04.2012, 19:50
Лучший ответ Сообщение было отмечено как решение

Решение

В целом идея такая: http://jsfiddle.net/PX55t/
HTML5
1
2
3
4
5
<div class="spoiler">
    <input type="checkbox" id="x" />
    <label class="title" for="x">Title</label>
    <div class="body">Lorem ipsum dolor sit amet consectepture adipisicing elit sed do eiusmod.</div>
</div>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.spoiler {
    width: 200px;
    border: #ccc solid 1px;
}
.spoiler > .title {
    display: block;
    padding: 4px;
}
.spoiler > .body {
    padding: 4px;
    border-top: #ccc solid 1px;
    display: none;
}
.spoiler > :checked ~ .body {
    display: block;
}
Вся беда в потребности в id. Чтобы избавиться от id, надо input вложить в label. Но тогда беда в css: нет псевдо-класса :contains(), чтобы выбрать :contains(:checked), и нет выдоха к родителю, чтобы от :checked вылезть наверх к label:
HTML5
1
2
3
4
<div class="spoiler">
    <label class="title"><input type="checkbox" />Title</label>
    <div class="body">Lorem ipsum dolor sit amet consectepture adipisicing elit sed do eiusmod.</div>
</div>
Поэтому альтернативный вариант изврата: http://jsfiddle.net/e4DeZ/
HTML5
1
2
3
4
5
<label class="spoiler">
    <input type="checkbox" />
    <div class="title">Title</div>
    <div class="body">Lorem ipsum dolor sit amet consectepture adipisicing elit sed do eiusmod.</div>
</label>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.spoiler {
    display: block;
    width: 200px;
    border: #ccc solid 1px;
}
.spoiler > .title {
    padding: 4px;
}
.spoiler > .body {
    padding: 4px;
    border-top: #ccc solid 1px;
    display: none;
}
.spoiler > :checked ~ .body {
    display: block;
}
Замечание: предложенный вариант является техническим наброском, а не готовым продуктом для быстрого и легкого использования направо и налево. См. продолжение дальше в теме.
5
32 / 30 / 1
Регистрация: 08.03.2012
Сообщений: 96
28.04.2012, 21:47
Vovan-VE, классное решение ) Галку можно спрятать через display: none, а жмакать по label..
1
 Аватар для Heleg
209 / 209 / 6
Регистрация: 23.10.2011
Сообщений: 971
30.04.2012, 17:22
это круто!
0
 Аватар для Forastero
562 / 339 / 87
Регистрация: 15.05.2013
Сообщений: 812
Записей в блоге: 1
18.05.2013, 22:23
Vovan-VE, напомни как вот такую вложенность селекторов
CSS
1
.spoiler > :checked ~ .body
Я так понимаю - это Прямые checked потомки класса .spoiler, после которых нужно отобрать все элементы с классом .body?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
19.05.2013, 05:47
Цитата Сообщение от SoraxWeb Посмотреть сообщение
Я так понимаю - это Прямые checked потомки класса .spoiler, после которых нужно отобрать все элементы с классом .body?
Да, так и есть.
1
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 2
21.11.2013, 14:49
Vovan-VE, спасибо за спойлер! Только вот такая проблема при первой загрузке страницы не отображаются стили спойлера, а после перезагрузки страницы все работает.
Первая загрузка, имеется ввиду в браузере в котором еще не заходили на эту страницу.
HTML5
1
2
3
4
5
<label class="spoiler1">
    <input type="checkbox" class="bo"/>
    <div class="title">Резервная солнечная система для дачи на 1 кВт</div>
    <div class="body">Как правило системы для дачи заказывают небольшой мощности, даже малой мощности (например, чтобы включить только телевизор и холодильник). Ниже, для примера, коммерческое предложение на солнечную систему для дачи.</div>
</label>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.spoiler1 {
 
    display: block;
    background: #2f5585;
    text-decoration: none;
    color: white;
    font-weight: bold;
    border: 1px solid #ffffff;
    border-radius: 5px;
    padding: 0 5px 0 5px;
    margin: 0 0 5px 0;
}
.spoiler1 > .title {
 
    font-weight: bold;
}
.spoiler1 > .body {
    padding: 4px;
 
    font-weight: normal;
    font-size: 11pt;
    text-align: justify;  
    display: none;
}
.spoiler1 > .bo {
    display: none;
}
.spoiler1 > :checked ~ .body {
    display: block;
}
Миниатюры
Как сделать спойлер без JS?   Как сделать спойлер без JS?  
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.11.2013, 15:02
Нельзя скрывать checkbox и radio, когда от них требуется такое поведение. По крайней мере, нельзя так явно скрывать через display: none, или т.п. Моментально перестанет работать по меньшей мере в одном из наиболее распространенных браузеров. Делать им нулевой размер тоже не все браузеры позволяют.

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

Также, поскольку label принимает фокус и проглатывает любой клик внутри, область применения такого спойлера уже существенно ограничивается. Также наблюдались проблемы с выделением текста внутри такого спойлера.
0
0 / 0 / 0
Регистрация: 21.11.2013
Сообщений: 2
21.11.2013, 15:14
Ясно. Спасибо. Этот Спойлер работает в хроме, фаерфоксе и опере, но только после первой и единоразовой перезагрузки страницы. А с выделением текста не проблема, пусть меньше выделяют и копируют)
0
Эксперт JSЭксперт HTML/CSS
2436 / 1115 / 312
Регистрация: 23.06.2011
Сообщений: 3,529
21.11.2013, 21:17
Спойлер на html
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
04.03.2016, 10:20
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<style>
.spoiler
{
    margin: 10px;
    margin-top:5px;
}
.spoiler-body
{
    margin: 0px;
    padding: 6px;
    border: 0px inset;
}
.spoiler-title
{
    margin-bottom:2px;
    text-decoration: underline;
    cursor: pointer;
}
</style>
<div class="spoiler">
    <span class="spoiler-title" onclick="
        if (this.parentNode.getElementsByTagName('div')[0].style.display != '')
        {
            this.parentNode.getElementsByTagName('div')[0].style.display = '';
            this.innerText = 'свернуть';
        }
        else
        {
            this.parentNode.getElementsByTagName('div')[0].style.display = 'none';
            this.innerText = 'показать';
        }">
        показать
    </span>
    <div class="spoiler-body" style="display: none;">
        Текст внутри спойлера
    </div>
</div>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2016, 10:20
Помогаю со студенческими работами здесь

Подскажите как сделать спойлер с надписью
Подскажите как сделать спойлер с надписью при раскрытии чтоб там была информация.

Как сделать спойлер в Windows Store app?
Доброго времени дня. При разработке приложения типа Windows 8 Store App мне понадобилось сделать что типа спойлеров, как на скриншоте...

Как сделать спойлер открывающий файлы Frame Docs для открытия pdf
Фрейм для открытия pdf &lt;iframe src=&quot;https://docs.google.com/viewer?url=http://72863.prohoster.biz/PUBLICATION/Электрохим способ получения...

Как сделать спойлер, чтобы при нажатии на ссылку вместо неё был другой текст?
Как сделать спойлер, чтобы при нажатии на ссылку вместо неё был другой текст?

Не получается установить спойлер без плагина
Здравствуйте! Испробовал несколько вариантов. Прописываю код в function.php, header.php, footer.php. Styles.css Даже вроде спойлер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru