4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
1

Супер "резиновое" меню на html

24.07.2018, 22:46. Показов 1406. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Хочу сделать меню по принципу:
а) Компьютер (планшет): полное отображение меню
б) Остальные устройства: 2-3 пункта и отобразить кнопку Еще или "три точки вертикально"
Сложнее с пунктом Б:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
           <div id="all_friendss_users_class">
               <div id="kostr_doipit">
                 <nav id="menu">
     <ul>
         <li><a href="">Мои друзья</a></li>
         <li><a href="?act=outbox">Исходящие</a></li>
         <li><a href="?act=inbox&user_login">Входящие</a></li>
         <li><a href="?act=subscribers">Подписчики</a></li>
         <li><a href="?act=findnew">Найти друзей</a></li>
     </ul>
</nav>
               </div>
           </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
#all_friendss_users_class{
     position: relative;
     background: linear-gradient(to left,#FFF,#000dff);
     height: 40px;
     width: 102%;
     display: block;
     margin-left:-23px;
     margin-bottom: 5px;
      transition:  10s ease-in;
}
#all_friendss_users_class:hover{
     filter: hue-rotate(120deg);
     }
#kostr_doipit{
     position: relative;
}
*{
     margin: 0;
     padding: 0;
}
#menu{
     height: 70px;
     margin-top: 0px;
     z-index: -10;
}
#menu ul{
     list-style: none;
}
#menu>ul>li{
     float: left;
     width: 150px;
     position: relative;
}
#menu li a{
     display: block;
     background: #0004ff;
     border: 1px solid #060A13;
     color: #FFF;
     font-size: 20px;
     padding: 8px;
     text-align: center;
     text-decoration: none;
     transition: linear 1s;
}
#menu li a:hover{
transition: linear 1s;
background: #ff8400;
 
}
.paniker{
     position: relative;
}
#twodig,#twodih{
     position: absolute;
}
Но как привинтить кнопку "Еще" не понял, еще загадкой остается переход, как в ВК Мои друзья --> Друзья онлайн.
Буду рад подсказкам!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2018, 22:46
Ответы с готовыми решениями:

Резиновое меню
Здравствуйте Сверстал меню под резиновый контент, но не как не дойдет как сделать чтобы можно было...

Резиновое меню
Всем доброго времени суток. Есть код : &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta...

Резиновое меню
Уважаемые форумчане, прошу помочь! Необходимо резиновое меню для сайта, чтобы растягивалось на всю...

Резиновое меню
Сейчас меню на ширину всего врапера нарисовано. Нужно сверстать резиновое меню, чтобы при...

Резиновое меню + картинка слева
Всем привет)) Не могу никак разобраться. Имеется резиновое меню: &lt;ul class=&quot;menu_top&quot;&gt; ...

15
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
25.07.2018, 02:38 2
Лучший ответ Сообщение было отмечено Uni_programist как решение

Решение

1. Чтобы сделать мобильную версию, используй

CSS
1
2
3
@media screen and (min-width: 320px) and (max-width: 768px) {
// Тут стили, которые будут выполняться только если экран пользователя больше 320 и меньше 768 пикселей шириной
}
2. Кнопка "ещё" делается как обычная кнопка, но по принципу выше ей пишется медиа-выражение, которое её скроет для всех экранов, которые больше мобильного.

CSS
1
2
3
4
5
@media screen and (max-width: 768px) {
    body {
        background: red;
    }
}
Вот для примера код, который сделает фон всей твоей страницы красным, но только если ширина окна браузера (или ширина экрана пользователя) меньше 768 пикселей.

Добавлено через 1 минуту
К слову, width: 102%; лучше не писать - у тебя в результате всегда внизу будет полоса прокрутки.

====================================

Добавлено через 2 часа 21 минуту
Советую вместо кнопки "Ещё" сделать кнопку "Меню" для мобильной версии - её сделать проще:

1. Добавь для ul с меню id "menu-list" (list - список)

2. Когда экран меньше определённого значения, меню (ul) поставь display: none.

3. При нажатии на кнопку, для ul добавляется класс "open" (или какой тебе больше нравится), и меню становится видно.

4. Если же нажимаешь ещё раз, класс "open" убирается, и меню пропадает.

Установка/удаление класса делается с помощью JavaScript.

В твоём случае, для этого тебе нужно:

1. Найти меню (для этого используй команду document.querySelector('#menu-list') и сохрани его в переменную menu-list)

Javascript
1
var menu-list = document.querySelector('#menu-list');
2. Добавить или удалить у меню класс "open" (для этого есть свойство classList.toggle (toggle - переключить)

Javascript
1
menu-list.classList.toggle('open');
Итого, код у тебя получится примерно вот такой:

Перед меню в код добавь кнопку-переключатель.

HTML5
1
<button class="menu-toggle">Меню</button>
Чтобы при нажатии на кнопку (событие "клик", или "onclick" по-браузеровски) открывалось меню, добавим соответствующий код (можно с переменной, как описано выше, а можно в одно действие):

HTML5
1
<button class="menu-toggle" onclick="document.querySelector('#menu').classList.toggle('open');">Меню</button>
Чтобы эта кнопка не показывалась всё время, скроем её (мы снова сделаем её видимой когда она нам понадобится):

CSS
1
2
3
.menu-toggle {
display: none;
}
Если экран меньше нужной ширины, показываем кнопку и скрываем меню. Чтобы при наличии класса "open" меню открывалась, также добавляем соответствующую команду.

CSS
1
2
3
4
5
6
7
8
9
10
11
12
@media screen and (max-width: 768px) {
.menu-toggle {
display: block;
}
 
#menu-list {
display: none;
}
 
.open#menu-list {
display: block;
}
Теперь осталось сделать меню и кнопку для его открытия более красивой =))

Если всё же решишь сделать кнопку "Ещё", она делается примерно также, но только открывающиеся пункты нужно вложить в отдельный список, и открывать не вбок, а вниз.

===================

P.S. Советую пройти интерактивнык курсы HTML Academy, там разбираются и такие вещи, и много других. К слову, также по шагам, как у меня выше, только более подробно =) Всё же у меня время ограничено, а там задания делаются один раз и на долго - качество объяснения получается куда лучшим.
1
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
26.07.2018, 22:04  [ТС] 3
Kornerupin, спасибо! Работает! Пожалуйста, подскажите как сделать что бы пункт меню в котором находишься был зеленым внизу, а до пункта (куда хочет перейти пользователь) эта маленькая зеленая полосочка "едет". Насколько я понимаю нужно использовать transition и transform и скорее всего псевдокласс, но точно не знаю...
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
26.07.2018, 22:52 4
Uni_programist, если я всё правильно понял, то это можно сделать только с помощью JavaScript'a. Нужно сделать "активный" стиль (который, собственно, и будет зелёным), а при наведении на другие пункты последовательно включать его на пунктах между активным и тем, на который навели. Тогда будет эффект, что полоска "бежит" от пункта к пункту.

Т.е., скажем, есть 5 пунктов: 1, 2, 3, 4 и 5.

Текущий пункт - 4й. При наведении на 1й пункт, убираем класс "активно" у 4го, ставим 3му. Затем убираем у 3го, ставим 2му. Затем убираем у 2, ставим 1му.

Всё это нужно настроить с помощью addEventListener, и засунуть в функцию, чтобы происходило автоматически для любых пунктов.

Но это намного сложнее, чем это меню, часа на два-три работы точно, у меня, к сожалению, сейчас нет столько времени, чтобы объяснить. =( Можешь попробовать сделать самостоятельно, я подскажу, если будут какие-то вопросы.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
28.07.2018, 20:20  [ТС] 5
Kornerupin, в том ли направлении я двигаю? С JS сталкиваюсь впервые поэтому немного запутался, а конкретно, в анимации... через js или css, а если через css то как? Вот пока набросок:
Javascript
1
2
3
4
5
6
7
function koderstrike(){
     function hovertime(o){
         return(o.parentNode && o.parentNode.querySelector(":hover")==o);
     }
         document.getElementById("xsco").addEventListener('mouseover',function(){
             if(hovertime(this)) document.getElementById("super-list").classList.toggle('logavo1');
             ), false
super-list это ul заменил (вместо menu-list)
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
28.07.2018, 21:51 6
Uni_programist, а что ты этим кодом хочешь сделать?

Если перебирать пункты от активного до того, на который навели, то куда проще:

1. Добавить всем пунктам два класса:

CSS
1
2
.item // - для стилизации
.item--№ // - чтобы отличать их друг от друга (т.е. вместо № там 1,2,3,4 и т.д.)
2. Найти все пункты
Javascript
1
 let list = document.querySelectorAll('.item');
3. Добавить слушателя (listener), который будет при наведении на один из пунктов смотреть его номер (
Javascript
1
this.classList[1][7]; // Номер смотрится так. Идея в том, что мы берём из списка классов второй класс (т.к. счёт идёт с нуля) и оттуда 7й элемент, т.е. цифру.
4. Найти активный пункт
Javascript
1
list.(querySelector('.active');
Ну и дальше в цикле с задержкой переключать классы, переставляя класс active

Добавлено через 2 минуты
P.S. Вообще, по-хорошему, класс лучше не через индекс массива classList получать, а распарсить (разобрать) строку - иначе не будет работать, если поменять классы местами, или между ними какой-то класс ещё появится, или перед ними, или если кол-во элементов меню будет больше 10 (0-9)... Но в принципе, если это учебный проект, а не заказ, то можно и так - парсеры нудные, как по мне =) В общем, имей в виду это.

Добавлено через 4 минуты
P.P.S. И да, разумеется, классы .item - только для примера, реальные будут выглядеть примерно так:

HTML5
1
<li class="main-menu__item main-menu__item--0">Пункт меню</li>
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
28.07.2018, 22:50  [ТС] 7
Kornerupin,
Цитата Сообщение от Kornerupin Посмотреть сообщение
Ну и дальше в цикле с задержкой переключать классы, переставляя класс active
А что такое задержка, в смысле реализации?
А откуда в li
Цитата Сообщение от Kornerupin Посмотреть сообщение
main-menu__item main-menu__item--0
это так будут обозначатся номера пунктов?
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
28.07.2018, 22:55 8
Uni_programist

Задержка - это одна из этих функций: https://learn.javascript.ru/settimeout-setinterval
Они позволяют запустить какой-то код не сразу, а через заданное время.

Да, так обозначаются пункты.

Это просто классы - они как id, но если id на странице может быть только один (если будет больше, то все, что будет написано применится только к первому, по крайней мере для JS это 100%), то классы можно назначать любому кол-ву элементов.

Общий класс - чтобы можно было менять сразу все одним набором стилей, и вспомогательный класс (тот, что с --) - чтобы можно было добавлять какие-то стили (или какую-то активность) каждому конкретному пункту. Нужно же как-то различать их.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
28.07.2018, 22:55  [ТС] 9
Да, тут нашел из онлайн-учебников, может попробовать так?
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<ul>
  <li>Этот</li>
  <li>тест</li>
</ul>
<ul>
  <li>полностью</li>
  <li>пройден</li>
</ul>
<script>
  var elements = document.querySelectorAll('ul > li:last-child');
 
  for (var i = 0; i < elements.length; i++) {
    alert( elements[i].innerHTML ); // "тест", "пройден"
  }
</script>
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
28.07.2018, 22:58 10
Uni_programist, а что, по-вашему, делает этот код?

Можно, конечно, и по содержимому пунктов определять, какой это пункт меню, но что если вы захотите поменять его название? Код сразу же перестанет работать даже если вы вместо "друзья" напишете "Друзья".

Варианта с индексами намного универсальнее.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
28.07.2018, 23:52  [ТС] 11
Kornerupin,
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
function koderstrike(){
     let list= document.querySelectorAll('.item');
     list.addEventListener('mouseover',drupalniktwo,false);
     list.querySelector('.active');
     for(var i=0; i<drupalniktwo; i++){  
         list.classList.toggle('active');
         setTimeout(func, 3000);
     }       
     function drupalniktwo(){
         list.this.classList[1][7];
     }
}
вот что-то получилось? Не понятно только, что в стилях-то теперь прописывать для анимации?
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
01.08.2018, 13:13 12
Uni_programist, только что увидел ответ, извиняюсь - слишком много сообщений в почту приходят, видимо случайно отметил прочитанным.

В Вашем коде нет использования переменной-счётчика i, которая отсчитывает текущий элемент. В целом код правильный, но класс присваивается не элементу li, а массиву (list). Поменяйте на
Javascript
1
list[i]
Кроме того, если Вы будете с помощью toggle менять класс, то все пункты меню станут активными - Вы ведь не убираете этот класс с предыдущего элемента.

Как вариант, можно сделать проверку: если есть следующий элемент

Javascript
1
2
3
4
if (list[i + 1]) {
list[i].classList.remove('active');
list[i+1].classList.add('active');
}
Убираем класс "active" у текущего элемента, переходим к следующему и присваиваем этот класс ему.

Добавлено через 8 минут
Чтобы анимировать переход, задайте классу, который обозначает все пункты (скажем, .item) плавное изменение:

CSS
1
transition: all 3s ease; // Время можно задать любое, но в Вашем коде между сменой классов 3 секунды, поэтому тут также задал (хотя тут лучше около половины секунды использовать, может даже меньше, иначе слишком долго будет идти смена)
А дальше просто сделайте внешний вид для активного пункта, скажем, цвет фона сделайте другой, и всё будет работать.

Добавлено через 6 минут
Так, сейчас внимательнее посмотрел, что у Вас в коде происходит.

Сейчас слушатель видит, что на элемент навели мышь, и активирует функцию drupalniktwo. Это, конечно, хорошо, только вот всё, что сделает эта функция - это попытается от массива элементов взять this (даже представлять не хочу, что это будет), а потом выбрать из класса непонятно, какого элемента (скорее всего, это даже не элемент будет) цифру.

Кроме того, вот этот код:

Javascript
1
2
3
4
5
list.querySelector('.active');
     for(var i=0; i<drupalniktwo; i++){  
         list.classList.toggle('active');
         setTimeout(func, 3000);
     }
Будет выполнен только один раз, когда загрузится страница, причём скорее всего, выдаст ошибку, т.к. что такое func - вообще не понятно.


Вот примерный код, который должен быть: протестируйте.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Находим элементы, при наведении на которые будет что-то происходить.
var list = document.querySelectorAll('.item');
 
// Добавляем КАЖДОМУ (!!!) из элементов слушателя, который будет ждать, 
// пока на кого-то из них наведут мышь, и при наведении запустит функцию
for (var i = 0; i < list.length; i++) {
  list[i].addEventListener('mouseover', startSwitchingElements, false)
}
 
// Собственно, действия при наведении на элемент
function startSwitchingElements() {
  // Находим элемент, который сейчас активен
  var activeElement = document.querySelector('.item.active');
  // Вариант list.querySelector('.active'); работать не будет, т.к. list - это МАССИВ элементов, querySelector не работает с массивами.
 
  // Получаем номер активного элемента
  var activeElementNumber = activeElement.classList[1][7];
 
  // Узнаём, на какой по счёту элемент мы навели мышь
  var hoverElementNumber = this.classList[1][7];
 
// Теперь у нас есть два номера - номер активного элемента 
// и номер элемента, на который навели мышь.
  
// Если навели на неактивный элемент, переключаемся на следующий,
// и запускаем цикл переключений. Если на активный - ничего делать не надо.
if (activeElementNumber < hoverElementNumber) {
  // Проверяем, что следующий элемент существует, и если так и есть, убираем класс
  // у текущего элемента и ставим следующему
  if (list[activeElementNumber + 1]) {
    list[activeElementNumber].classList.remove('active');
    list[activeElementNumber + 1].classList.add('active');
  }
  // Т.к. мы уже переключились, увеличиваем номер активного элемента.
  activeElementNumber++;
 
  // Если после первого переключения всё ещё не дошли до элемента, на который навели мышь,
  // запускаем переключения каждые 3 секунды
  if (activeElementNumber < hoverElementNumber) {
    var intervalSwitchingElements = setInterval(function () {
      if (list[activeElementNumber + 1]) {
        list[activeElementNumber].classList.remove('active');
        list[activeElementNumber + 1].classList.add('active');
      }
      // Проверяем, не активировали ли мы элемент, на который навели мышь.
      // Если активировали, прекращаем переключения.
      if (activeElementNumber + 1 == hoverElementNumber) {
        clearInterval(intervalSwitchingElements);
      }
      activeElementNumber++;
    }, 3000);
  }
}
}
1
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
01.08.2018, 19:16  [ТС] 13
Kornerupin, странно скрипт внедрил css прописан, но эффект "магическая полоска" отсутствует.
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
01.08.2018, 19:18 14
Uni_programist, скиньте, пожалуйста, архив с кодом. Не видя код, проблему не решить никак.
0
4 / 3 / 2
Регистрация: 11.08.2016
Сообщений: 352
01.08.2018, 19:20  [ТС] 15
Kornerupin, да давайте
0
31 / 19 / 7
Регистрация: 08.05.2017
Сообщений: 115
01.08.2018, 20:14 16
Поправил код в ЛС.

Если кому нужен:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var list = document.querySelectorAll('.main-menu__item');
for (var i = 0; i < list.length; i++) {
  list[i].addEventListener('mouseover', startSwitchingElements, false);
}
function startSwitchingElements() {
  var activeElement = document.querySelector('.main-menu__item.active');
  var activeElementNumber = parseInt(activeElement.classList[1][17]);
  var hoverElementNumber = parseInt(this.classList[1][17]);
 
  if (activeElementNumber < hoverElementNumber) {
    if (list[activeElementNumber + 1]) {
      list[activeElementNumber].classList.remove('active');
      list[activeElementNumber + 1].classList.add('active');
      activeElementNumber++;
    }
    if (activeElementNumber < hoverElementNumber) {
      var intervalSwitchingElements = setInterval(function () {
        if (list[activeElementNumber + 1]) {
          list[activeElementNumber].classList.remove('active');
          list[activeElementNumber + 1].classList.add('active');
        }
        if (activeElementNumber + 1 == hoverElementNumber) {
          clearInterval(intervalSwitchingElements);
        }
        activeElementNumber++;
      }, 400);
    }
  }
 
// На случай, если нужно не идти вперёд по пунктам, а вернуться назад.
  if (activeElementNumber > hoverElementNumber) {
    if (list[activeElementNumber - 1]) {
      list[activeElementNumber].classList.remove('active');
      list[activeElementNumber - 1].classList.add('active');
      activeElementNumber--;
    }
 
    if (activeElementNumber > hoverElementNumber) {
      var intervalSwitchingElements = setInterval(function () {
        if (list[activeElementNumber - 1]) {
          list[activeElementNumber].classList.remove('active');
          list[activeElementNumber - 1].classList.add('active');
        }
        if (activeElementNumber - 1 == hoverElementNumber) {
          clearInterval(intervalSwitchingElements);
        }
        activeElementNumber--;
      }, 400);
    }
  }
}
Добавлено через 9 минут
Правки:

1. activeElement.classList[1][17] - чтобы работало, нужно указать сначала номер класса, а потом - номер цифры!!! ОБЯЗАТЕЛЬНО посмотреть, чтобы возвращалась именно цифра.

Для проверки можно использовать console.log() - открываете в любом браузере, нажимаете f12 и переходите во вкладку "Консоль". Туда будет выводиться то, что попадает в команду, описанную строчкой выше.

2. Не подумал о том, что activeElement.classList[1][17] вернёт строчку, т.к. класс - строчка. Добавил parseInt.

3. Добавил возможность крутить-вертеть меню в обе стороны, прошлый вариант работал только слева на право.


P.S. Если будете копипастить код, пожалуйста, прочитайте, что в нём происходит - я предельно подробно описал всё выше!

P.P.S. Сейчас происходит "переключение" активного пункта. Если нужно, чтобы когда человек убирает с кнопки мышь, активный пункт возвращался обратно, можно добавить второй класс hover (или какой-то ещё), и передвигать его.

В этом случае нужно с помощью CSS убирать стили класса active при наведении на список меню (раз человек навёл на меню курсор, значит, он навёл на какой-то элемент меню - если на активный, то ничего не изменится, если на неактивный, пойдёт анимация).

ВАЖНО: чтобы всё нормально работало, когда человек убирает мышь с меню, нужно вернуть hover туда, где стоит active. Либо делать это при наведении на меню, перед началом работы перемотки.

P.P.P.S. По-хорошему, обработчик с элемента, на который навели мышь, нужно снимать, как только он сработал, чтобы с каждым движением по элементу анимация не начиналась заново. А то получается довольно странное "эхо".
0
01.08.2018, 20:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2018, 20:14
Помогаю со студенческими работами здесь

Сделать резиновое меню в одну строку
Доброго времени суток подскажите как вот это меню сделать резиновым в одну строку...

Резиновое меню с вытягиванием пунктов по ширине
Прикрепил как должно быть. Поясню основные моменты. Меню имеет min-width 1000px и max-width 1280,...

Как создать горизонтальное резиновое меню?
Здравствуйте! Подскажите пожалуйста как создать горизонтальное резиновое меню на css? Имеется...

Резиновое горизонтальное меню на 100% ширины
Как меню растянуть на 100%? Количество пунктов будет меняться, поэтому нужно сделать так, чтобы не...

Резиновое меню на всю ширину окна
Здравствуйте, подскажите пж-та, только начинаю изучать wordpress, возникла проблема: сайт оформлен...

PSD to HTML - супер быстрая вёрстка!
Привет! У меня большое количество мелких заказов на сайты-одностранички. Я быстро рисую макеты в...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru