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

Корректная верстка выпадающего списка

24.10.2015, 13:46. Показов 4109. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Делаю сайт, в котором есть несколько выпадающих списков в хедере:
1. список с выбором языка;
2. список с выбором валюты (денежной единицы отображения стоимости товара);
3. список с выбором телефона службы поддержки, в зависимости от региона/города/страны;

Все списки выпадают по клику. Вариантов верстки подобных списков в просторах интернета достаточно: от банального select (option) до создания обыкновенного ненумерованного списка ul>li и "прикручивания" к нему JS.

Вопрос в том как "правильно" делаются/верстаются подобные списки?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2015, 13:46
Ответы с готовыми решениями:

Эстетичность верстки, семантика, корректная верстка
Неоднократно замечал, что в сайтах, которые верстали настоящие профи - всегда минимум строк css. Даже если это довольно сложная страничка,...

Корректная верстка макета, где главное фоновое изображение больше чем wrapper
Привет ребят! Нуждаюсь в мудром наставлении. Зачастую min-width блока wrapper составляет 960 px, и когда фоновое изображение не превышает...

Ограничение выпадающего списка
Добрый час ! Есть 2 выпадающих списка. надо при выборе в первом ограничить значения из второго. Второй список представляет из себя набор...

12
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
24.10.2015, 14:23
Цитата Сообщение от Gorbuz Посмотреть сообщение
от банального select (option)
Проблема selecta в том, что он по-разному отображается в разных браузерах, почти не поддается стилизации, а главное - внутри option может быть только текст и не может быть ссылок.
А по-поводу
Цитата Сообщение от Gorbuz Посмотреть сообщение
до создания обыкновенного ненумерованного списка ul>li и "прикручивания" к нему JS.
зачем далеко ходить, посмотрите на бутстрап, там именно так и сделано
0
 Аватар для fol
511 / 485 / 161
Регистрация: 08.07.2013
Сообщений: 1,714
Записей в блоге: 1
24.10.2015, 16:06
в основном это делается списками или блоками, которые показываются при клике посредством js
0
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 18
25.10.2015, 11:04  [ТС]
к примеру у нас есть список выбора языка страницы. там три пункта: англ.яз, рус.яз, укр.яз. все пункты показаны как иконка флага + название языка. при выборе любого пункта должен меняться язык на странице ну и соответственно отображение выбранного пункта в списке. как быть в таком случае?

Добавлено через 16 часов 0 минут
В общем, сделал через ul>li. подскажите как теперь передать значение пункта li при клике на него в span class="title" ?
http://jsfiddle.net/gorbuz9kin/m7gxk5s4/
HTML5
1
2
3
4
5
6
7
8
<div id="dropdown-menu" class="dropdown-menu">
  <span class="title">English</span>
  <ul>
    <li><a href="#">English</a></li>
    <li><a href="#">Русский</a></li>
    <li><a href="#">Украинский</a></li>
 </ul>
</div>
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
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
.dropdown-menu ul {
  margin: 0;
  padding: 0;
  width: 135px;    
  list-style: none;
  display: none;
  
}
.dropdown-menu ul li {
    background: #0085b6;
    height: 35px;
}
.dropdown-menu ul li:hover {
    background: #1d9fcb;
}    
.dropdown-menu ul li a {
  display: block;
  width: 100%;
  padding: 5px 35px;
  text-decoration: none;
    font-size: 15px;
    color: #fff;
}
.dropdown-menu ul li:first-child a {
    background: url(img/flag_english_active.png) no-repeat 5px center;
}
.dropdown-menu ul li:nth-child(2) a {
    background: url(img/flag_russion.png) no-repeat 5px center;
}
.dropdown-menu ul li:last-child a {
    background: url(img/flag_ukraine.png) no-repeat 5px center;
}   
 
.dropdown-menu .title {
    display: inline-block;
    width: 80px;
    height: 20px;
    padding: 5px 0  5px 35px;
    font-size: 15px;
    line-height: 20px;
    cursor: pointer;
    background: #eaecf0 url(img/flag_english.png) no-repeat 5px center;
}
    
.dropdown-menu .title::after {
  content: "";
  float: right;
  display: block;
  background: url(img/arrow_down.png) no-repeat 10px center;
  width: 20px;
  height: 20px;
  margin-right: 10px;    
}
    
.dropdown-menu.open .title {
  background: #0085b6 url(img/flag_english_active.png) no-repeat 5px center;
  color: #fff;
  border-bottom: 4px solid #1d9fcb;
}
    
.dropdown-menu.open .title::after {
  background: url(img/arrow_up.png) no-repeat 10px center;
}
 
.dropdown-menu.open ul {
  display: block;
}
JavaScript
1
2
3
4
5
6
var menuElem = document.getElementById('dropdown-menu');
    var titleElem = menuElem.querySelector('.title');
 
    titleElem.onclick = function() {
      menuElem.classList.toggle('open');
    };
0
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
25.10.2015, 11:43
JavaScript
1
2
3
4
5
6
var links = menuElem.getElementsByTagName("li");
    for(var i = 0, l = links.length; i < l; i++){
        links[i].onclick = function(){
            titleElem.innerHTML = this.innerHTML;
        }
    }
http://jsfiddle.net/m7gxk5s4/1/
0
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 18
25.10.2015, 12:11  [ТС]
Спасибо огромное!
А если у каждого пункта li есть своя фоновая (background-image) картинка (в данном случае это флаг), как сделать так чтобы эта картинка "подтягивалась" в title при выборе определенного li.
0
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
25.10.2015, 12:40
В вашем случае картинка не у <li>, а у <a>.
JavaScript
1
2
3
4
5
6
7
var links = menuElem.getElementsByTagName("li");
    for(var i = 0, l = links.length; i < l; i++){
        links[i].onclick = function(){
            titleElem.innerHTML = this.innerHTML;
            titleElem.style.backgroundImage = getComputedStyle(this.children[0]).backgroundImage;
        }
    }
1
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 18
25.10.2015, 23:19  [ТС]
Спасибо еще раз за помощь.
Добавил еще строчку
menuElem.classList.remove('open');
и теперь список закрывается после клика по определенному элементу <li>

Добавлено через 3 часа 0 минут
Возникли очередные траблы. Когда в хедере допустим один выпадающий список: все работает, но когда добавляешь второй - например с выбором валюты, то один из них перестает нормально "работать" либо оба не работают. К тому же при клике, допустим на title списка валют, title списка выбора языков съезжает на уровень последнего элемента другого списка.
Вот что получается http://jsfiddle.net/gorbuz9kin/w38bn0kw/
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <!--Dropdown List Language-->
        <div id="dropdown-menu-lang" class="dropdown-menu clearfix">
          <span class="title">English</span>
          <ul>
            <li><a href="#">English</a></li>
            <li><a href="#">Русский</a></li>
            <li><a href="#">Украинский</a></li>
         </ul>
        </div>
 
        <!--Dropdown List Currency -->
        <div id="dropdown-menu-currency" class="dropdown-menu-currency">
          <span class="title">UAH</span>
          <ul>
            <li><a href="#">USD</a></li>
            <li><a href="#">RUB</a></li>
            <li><a href="#">EUR</a></li>
            <li><a href="#">UAH</a></li>
          </ul>
        </div>
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
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
* {
    margin: 0;
    padding: 0;
}
.clearfix:after {
    content: "";
    clear: both;
    display: table;
}
header {
    background: #eaecf0;
    height: 40px;
}
.header-wrapper {
    width: 1150px;
    margin: 0 auto;
}
 
/* Dropdown List Language  */
.dropdown-menu,
.dropdown-menu-currency {
    display: inline-block;
    width: 200px;
}
 
.dropdown-menu ul,
.dropdown-menu-currency ul {
  margin: 0;
  padding: 0;
  width: 145px;    
  list-style: none;
  display: none;
  
}
.dropdown-menu ul li, 
.dropdown-menu-currency ul li {
    background: #0085b6;
    height: 35px;
}
.dropdown-menu ul li:hover,
.dropdown-menu-currency ul li:hover {
    background: #1d9fcb;
}    
.dropdown-menu ul li a, 
.dropdown-menu-currency ul li a {
  display: block;
  width: 100%;
  padding: 5px 35px;
  text-decoration: none;
    font-size: 15px;
    color: #fff;
}
.dropdown-menu ul li:first-child a {
    background: url(img/flag_english_active.png) no-repeat 5px center;
}
.dropdown-menu ul li:nth-child(2) a {
    background: url(img/flag_russion.png) no-repeat 5px center;
}
.dropdown-menu ul li:last-child a {
    background: url(img/flag_ukraine.png) no-repeat 5px center;
}   
 
.dropdown-menu .title,
.dropdown-menu-currency .title {
    display: inline-block;
    width: 110px;
    height: 26px;
    padding: 5px 0 5px 35px;
    font-size: 15px;
    line-height: 30px;
    cursor: pointer;
    background: #eaecf0 url(img/flag_english.png) no-repeat 5px center;
}
.dropdown-menu .title a,
.dropdown-menu-currency .title a  {
    color: #000;
    text-decoration: none;
}    
.dropdown-menu .title::after,
.dropdown-menu-currency .title::after {
  content: "";
  float: right;
  display: block;
  background: url(img/arrow_down.png) no-repeat 10px center;
  width: 20px;
  height: 30px;
  margin-right: 5px;    
}
.dropdown-menu.open a,
.dropdown-menu-currency.open a {
    color: #fff;
}
 
.dropdown-menu.open .title,
.dropdown-menu-currency.open .title {
  background: #0085b6 url(img/flag_english_active.png) no-repeat 5px center;
  color: #fff;
  border-bottom: 4px solid #1d9fcb;
}
    
.dropdown-menu.open .title::after,
.dropdown-menu-currency.open .title::after {
  background: url(img/arrow_up.png) no-repeat 10px center;
}
 
.dropdown-menu.open ul,
.dropdown-menu-currency.open ul {
  display: block;
}
/* Dropdown List Currency  */
 .dropdown-menu-currency {
    width: 100px;
}
.dropdown-menu-currency ul { width: 95px;}
 
.dropdown-menu-currency ul li:first-child a {
    background: url(img/usd.png) no-repeat 5px center;
}
.dropdown-menu-currency ul li:nth-child(2) a {
    background: url(img/rub.png) no-repeat 5px center;
}
.dropdown-menu-currency ul li:nth-child(3) a {
    background: url(img/eur.png) no-repeat 5px center;
}
.dropdown-menu-currency ul li:last-child a {
    background: url(img/uah_active.png) no-repeat 5px center;
}   
 
.dropdown-menu-currency .title {
    width: 60px;
    background: #eaecf0 url(img/uah.png) no-repeat 5px center;
}
 
.dropdown-menu-currency.open .title {
  background: #0085b6 url(img/uah_active.png) no-repeat 5px center;
}
JavaScript
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
var menuElem = document.getElementById('dropdown-menu-lang');
    var titleElem = menuElem.querySelector('.title');
 
    titleElem.onclick = function() {
      menuElem.classList.toggle('open');
    };
    var links = menuElem.getElementsByTagName("li");
    for(var i = 0, l = links.length; i < l; i++){
        links[i].onclick = function(){
            titleElem.innerHTML = this.innerHTML;
            titleElem.style.backgroundImage = getComputedStyle(this.children[0]).backgroundImage;
            menuElem.classList.remove('open');
        }
    }
    
    
    var menuElem = document.getElementById('dropdown-menu-currency');
    var titleElem = menuElem.querySelector('.title');
 
    titleElem.onclick = function() {
      menuElem.classList.toggle('open');
    };
    var links = menuElem.getElementsByTagName("li");
    for(var i = 0, l = links.length; i < l; i++){
        links[i].onclick = function(){
            titleElem.innerHTML = this.innerHTML;
            titleElem.style.backgroundImage = getComputedStyle(this.children[0]).backgroundImage;
            menuElem.classList.remove('open');
        }
    }
Что я делаю не так?
0
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
26.10.2015, 09:16
Лучший ответ Сообщение было отмечено Gorbuz как решение

Решение

Вы используете глобальные переменные
JavaScript
1
2
var menuElem = document.getElementById('dropdown-menu-lang');
    var titleElem = menuElem.querySelector('.title');
вешаете на эти элементы обработчики, а потом переопределяете их. Вот у вас бред и получается.
Для второго дропдауна должно быть так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var menu = document.getElementById('dropdown-menu-currency');
    var title = menu.querySelector('.title');
 
    title.onclick = function() {
      menu.classList.toggle('open');
    };
    var links = menu.getElementsByTagName("li");
    for(var i = 0, l = links.length; i < l; i++){
        links[i].onclick = function(){
            title.innerHTML = this.innerHTML;
            title.style.backgroundImage = getComputedStyle(this.children[0]).backgroundImage;
            menu.classList.remove('open');
        }
    }
И выпадающий список должен быть позиционирован абсолютно, чтобы не влиять на размер вашего хедера.
CSS
1
2
3
4
5
.dropdown-menu ul, .dropdown-menu-currency ul{
    position:absolute;
    top:100%;
    left:0;
}
http://jsfiddle.net/w38bn0kw/1/
1
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 18
26.10.2015, 19:26  [ТС]
Спасибо. Я так и думал, что "натупил" с переменными. Просто пока я только учу JS и поэтому такие ошибки совершаю. и я так понимаю, если мне нужен будет на странице 3й, 4й или еще какой-нибудь по счету dropdown, я просто меняю название переменной в скрипте и все?
0
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
26.10.2015, 20:48
Цитата Сообщение от Gorbuz Посмотреть сообщение
или еще какой-нибудь по счету dropdown, я просто меняю название переменной в скрипте и все?
Ну если у вас дропдауны по структуре и действиям, которые происходят при клике, одинаковые, то можно просто написать 1 функцию обработчик и для каждого дропдауна ее задать
0
0 / 0 / 1
Регистрация: 24.10.2015
Сообщений: 18
26.10.2015, 23:21  [ТС]
да. принцип одинаковый. три дропдауна: языковой, валюта и номера телефонов.
0
Эксперт HTML/CSS
 Аватар для Shakalaka
653 / 556 / 322
Регистрация: 27.01.2015
Сообщений: 1,374
27.10.2015, 11:42
Цитата Сообщение от Gorbuz Посмотреть сообщение
да. принцип одинаковый.
Тогда для вашей разметки можно так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var dropdowns = document.querySelectorAll('[id|="dropdown-menu"]');
each(dropdowns, function(){
    var self = this;
    var titleElem = self.querySelector('.title');
     titleElem.onclick = function() {
        self.classList.toggle('open');
    }
    var links = self.getElementsByTagName("li");
    each(links, function(){
        this.onclick = function(){
            titleElem.innerHTML = this.innerHTML;
            titleElem.style.backgroundImage = getComputedStyle(this.children[0]).backgroundImage;
            self.classList.remove('open');
        }
    });
    
});
 
function each(elem, callback){
    for(var i = 0, l = elem.length; i < l; i++)
        callback.call(elem[i]);
}
http://jsfiddle.net/shakalaka/w38bn0kw/2/
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2015, 11:42
Помогаю со студенческими работами здесь

Музыка из выпадающего списка
У меня проблема: Есть страница с выпадающим списком. В этом списке название фильмов. Как при нажатии на фильм из вып. списка вывести в...

Имитация выпадающего списка
Здравствуйте, у меня возникла необходимость сделать выпадающий список с картинками. Так стандартными компонентами это не получается...

Дизайн выпадающего списка
Можно ли сменить кнопку выпадающего списка (стандартную) на свою (изображение). Вообще мне нужно сделать такой выпадающий список

Нужен код выпадающего списка
Добрый день. Мне нужен код выпадающего меню для сайта на HTML. Нужно когда нажимаешь выпадал список, а как на него нажмешь сразу с низу...

Подложка для выпадающего списка
Всем добрый. Помогите люди добрые разобраться! Есть выпадающий список, надо что б при выпадении менюшки, fix-table-td1-ul являлся...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru