Пример:
Для большей наглядности в пример добавлен мобильник. В HTML, CSS и JS кодах его нет.
Оригинальный вид страницы с таб-баром можно посмотреть по ссылке
HTML:
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 |
<div class="page"> <div class="slides"> <div class="slide" id="1"> <div class="content"> <h2>Вкладка 1</h2> <p>Информация</p> </div> </div> <div class="slide" id="2"> <div class="content"> <h2>Вкладка 2</h2> <p>Информация</p> </div> </div> <div class="slide" id="3"> <div class="content"> <h2>Вкладка 3</h2> <p>Информация</p> </div> </div> <div class="slide" id="4"> <div class="content"> <h2>Вкладка 4</h2> <p>Информация</p> </div> </div> <div class="slide" id="5"> <div class="content"> <h2>Вкладка 5</h2> <p>Информация</p> </div> </div> </div> <div class="tab-bar"> <div class="tab-indicator"> <div class="tab-indicator-left"></div> <div class="tab-indicator-right"></div> </div> <div data-go="1" class="tab-item active"> <div class="tab-item-inner"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg> </div> </div> <div data-go="2" class="tab-item"> <div class="tab-item-inner"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><line x1="21" y1="10" x2="3" y2="10"></line><line x1="21" y1="6" x2="3" y2="6"></line><line x1="21" y1="14" x2="3" y2="14"></line><line x1="21" y1="18" x2="3" y2="18"></line></svg> </div> </div> <div data-go="3" class="tab-item"> <div class="tab-item-inner"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"></path><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"></path></svg> </div> </div> <div data-go="4" class="tab-item"> <div class="tab-item-inner"> <svg viewBox="0 0 24 24" > <path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path> <circle cx="12" cy="13" r="4"></circle> </svg> </div> </div> <div data-go="5" class="tab-item"> <div class="tab-item-inner"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path><circle cx="12" cy="10" r="3"></circle></svg> </div> </div> </div> </div> |
Иконки, которые прорисовываются как в примере, можно взять в теме Сборник SVG иконок Feather
CSS:
Если Tab Bar используется не на странице, а в секции - нужно будет изменить все величины прияязанные к вьюпорту (width: 500vw
, height: 100vh;
и другие)
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 |
.page { overflow: hidden; } .page * { box-sizing: border-box; } .slides { display: flex; height: 100vh; width: 500vw; /* ширина всех вкладок */ transition: transform 0.6s; } .slides .slide { height: 100vh; width: 100vw; } .slides .slide .content { width: 100vw; height: 100vh; padding: 0 10px 90px; overflow-y: auto; } .slides .slide .content h2 { font-size: 20px; line-height: 1.4; font-family: Verdana, sans-serif; } .slides .slide .content p { font-size: 14px; line-height: 1.4; font-family: Verdana, sans-serif; } .tab-bar { background-color: #111; padding: 0 20px; display: flex; position: fixed; z-index: 999999; bottom: 0; left: 0; width: 100vw; height: 53px; justify-content: space-between; } .tab-bar .tab-indicator { position: absolute; background-color: #FFF; width: 66px; height: 40px; border-radius: 0 0 50px 50px; z-index: 1; transform: translateX(-6px); transition: transform 0.3s ease-out; } .tab-bar .tab-indicator .tab-indicator-left, .tab-bar .tab-indicator .tab-indicator-right { background-color: #FFF; height: 16px; width: 16px; position: absolute; } .tab-bar .tab-indicator .tab-indicator-left:after, .tab-bar .tab-indicator .tab-indicator-right:after { content: ""; width: 100%; height: 100%; background-color: #111; display: block; } .tab-bar .tab-indicator .tab-indicator-left { left: -16px; } .tab-bar .tab-indicator .tab-indicator-left:after { border-radius: 0 22px 0 0; } .tab-bar .tab-indicator .tab-indicator-right { right: -16px; } .tab-bar .tab-indicator .tab-indicator-right:after { border-radius: 22px 0 0 0; } .tab-bar .tab-item { display: flex; align-items: center; justify-content: center; position: relative; width: 53px; } .tab-bar .tab-item .tab-item-inner { position: absolute; display: flex; height: 50px; width: 50px; border-radius: 50%; align-items: center; justify-content: center; transition: transform 0.2s ease-out, box-shadow 0.2s ease-out; } .tab-bar .tab-item .tab-item-inner svg { width: 60%; stroke: #FFF; fill: transparent; stroke-width: 1.5; stroke-miterlimit: 10; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 400; } .tab-bar .tab-item.active .tab-item-inner { transform: translateY(-20px); transition-delay: 0.2s; background-color: #337AB7; z-index: 2; box-shadow: 0 5px 5px 0px rgba(0, 0, 0, 0.25); } .tab-bar .tab-item.active .tab-item-inner svg { stroke: #FFF; animation: draw 1s reverse; } @keyframes draw { 100% { stroke-dashoffset: 400; } } |
jQuery:
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 |
$(function() { let currSlide = 0; function start() { let displacment = $(window).width() * currSlide; $('.slides').css('transform', 'translateX(-'+displacment+'px)'); distance = Math.floor($('.tab-bar').find('.active').position().left - 27); $('.tab-indicator').css('transform', 'translateX(' + distance +'px)'); } function showSlide(n) { currSlide = Math.min(Math.max(0, currSlide + n), $('.slide').length-1); start(); } $('.tab-bar .tab-item').each(function(){ $(this).on('click', function(e){ e.preventDefault(); distance = Math.floor($(this).position().left - 27); $('.tab-indicator').css('transform', 'translateX(' + distance +'px)'); $('.tab-bar .tab-item').removeClass('active'); $(this).addClass('active'); showSlide($(this).attr('data-go') - currSlide - 1); e.preventDefault(); }); }); $(window).resize(start); }); |
Привет, Админ!
было бы здорово, если бы был код для навигации внутри одной страницы между #секциями
может завалялся такой на сайте?
Если во вкладке 1 множество ссылок с переходом на внутренние страницы сайта.
По клику по ссылке попадаешь на внутреннюю страницу.
И 1 вкладка подгружается с самого верха.
То есть если я промотал сайт почти что до конца и решил перейти по статье после чего вернуться назад , мне придется вновь свайпать до самого низа. Проблема в overflow. Подумаю как исправить.
решил проблему удалением
Очень удобное и взвешенное решение. Жалко, что табы, а не отдельные страницы
На страницах анимации не будет, если только подгружать их, а не открывать на новой странице.
Или делать задержку - сперва иконка перешла, а потом пошла загрузка страницы.
Классно получилось, чем напоминает Инстаграм, уже думаю, как применить такую диковинку)) у себя на сайте)) Спасибо админу, за хорошие идеи.
Очень круто. Спасибо. Подписался на телегу вашу.