Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Сделал простые табы на js, хотелось бы услышать критику

#javascript #html #css #инспекция_кода




let tabs = document.getElementsByClassName('tab');

let sections = document.getElementsByClassName('section');

for(let i =0; i
  
  • tab1
  • tab2
  • tab3
  • section1
    section2
    section3


    Ответы

    Ответ 1



    В основном замечания относятся к использованию современной версии JavaScript вместо старого ES5. const tabs = document.getElementsByClassName('tab'); const sections = document.getElementsByClassName('section'); [...tabs].forEach(tab => tab.addEventListener('click', tabClick)); function tabClick(event) { const tabId = event.target.dataset.id; [...tabs].forEach((tab, i) => { tab.classList.remove('active'); sections[i].classList.remove('active'); }) tabs[tabId - 1].classList.add('active'); sections[tabId - 1].classList.add('active'); } .tabs{ margin: 0; padding: 0; list-style:none; cursor:pointer; } .tab{ margin: 0; padding: 0; float:left; border: 1px solid black; padding: 10px; } .tab.active { background-color: #333; color: #eee; } .output{ clear:both; } .section { display: none; } .section.active { display: block; }
    • tab1
    • tab2
    • tab3
    section1
    section2
    section3
    Переменные не переназначаются, поэтому лучше использовать const Цикл for можно заменить на метод массива Установка onclick листенера лучше делать с помощью addEventListener Для названий функций и переменных в JS принято использовать camelCase Неиспользуемая переменная let tab = event.target; Добавление класса .active достаточно вызывать один раз, поэтому лучше всего вынести её из цикла

    Ответ 2



    Не вижу смысла использовать массив вовсе. Вот мой пример реализации: $('.tabs-block .tab-link').on('click', function() { if (!$(this).hasClass('active')) { var parentTabs = $(this).closest('.tabs-block'); parentTabs.find('.tab-link.active, .tab-content.active').removeClass('active'); var elemIndex = $(this).index(); $(this).addClass('active'); parentTabs.find('.tab-content').eq(elemIndex).addClass('active'); } }); body {background: #333;} .tabs-block { display: block; width: 100%; border-radius: 3px; overflow: hidden; } .tab-link-block { display: block; width: 100%; background: #4184f3; overflow: hidden; } .tab-link { padding: 0 10px; height: 50px; line-height: 50px; color: #bbb; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; cursor: pointer; } .tab-link:not(.active):hover { background: rgba(255, 255, 255, .1); } .tab-link.active { background: rgba(255, 255, 255, .1); color: #fff; } .tab-content-block { display: block; width: calc(100% - 20px); min-height: calc(50px - 20px); padding: 10px; background: #fefefe; color: #333; } .tab-content:not(.active) { display: none; } /* horizontal */ .tabs-block:not(.-vertical) .tab-link-block { height: 50px; } .tabs-block:not(.-vertical) .tab-link-block::after { content: ''; display: block; clear: both; } .tabs-block:not(.-vertical) .tab-link { display: inline-block; float: left; min-width: calc(50px - 20px); max-width: calc(150px - 20px); margin-right: 2px; } .tabs-block:not(.-vertical) .tab-link.active { box-shadow: 0 -3px 0 0 #f4b142 inset; } .tabs-block:not(.-vertical) .tab-link:last-child { margin-right: 0; } /* horizontal */ /* vertical */ .tabs-block.-vertical { display: grid; grid-template-columns: 150px 1fr; grid-gap: 0; } .tabs-block.-vertical .tab-link { display: block; width: calc(100% - 20px); } .tabs-block.-vertical .tab-link.active { box-shadow: -3px 0 0 0 #f4b142 inset; } /* vertical */ .tab-link { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; transition: all linear .2s; }
    1
    2
    3


    1
    2
    3


    Комментариев нет:

    Отправить комментарий