Гибкая форма поиска
Форма поиска с параметрами фильтрации, а так же ссылками на результат.
Создание удобной формы поиска — совершенно нетривиальная задача. В большинстве случаев всё заканчивается на текстовом поле, куда нужно вбивать интересующие слова и кнопкой поиска. В нашем же случае будет добавлена возможность фильтрации поиска по определённому типу контента, а так же показ результатов в отдельном блоке.
Для крупных порталов и интернет-магазинов задуманный функционал исключительно важен. Как правило, пользователь без понятия где на нашем сайте можно найти ту или иную информацию. Именно поэтому формы поиска не теряют своей актуальности. Фильтрация и быстрые ссылки — это прекрасная возможность сэкономить время пользователя.
Короткая демонстрация готового результата:
HTML структура
HTML структура будет разделена на три части: элемент <header>
для навигации, div.cd-main-search
для формы поиска и main.cd-main-content
для основного контента страницы.
<header class="cd-main-header animate-search"> <div class="cd-logo"><a href="#0"><img src="img/cd-logo.svg" alt="Logo"></a></div> <nav class="cd-main-nav-wrapper"> <a href="#search" class="cd-search-trigger cd-text-replace">Search</a> <ul class="cd-main-nav"> <li><a href="#0">Products</a></li> <!-- additional navigation items --> </ul> </nav> <a href="#0" class="cd-nav-trigger cd-text-replace">Menu<span></span></a> </header> <main class="cd-main-content"> <!-- your content here --> </main> <div id="search" class="cd-main-search"> <form> <input type="search" placeholder="Search..."> <div class="cd-select"> <span>in</span> <select name="select-category"> <option value="all-categories">all Categories</option> <!-- additional options here --> </select> <span class="selected-value">all Categories</span> </div> </form> <div class="cd-search-suggestions"> <div class="news"> <h3>News</h3> <ul> <li> <a class="image-wrapper" href="#0"><img src="img/placeholder.png" alt="News image"></a> <h4><a class="cd-nowrap" href="#0">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</a></h4> <time datetime="2016-01-12">Feb 03, 2016</time> </li> <!-- additional news here --> </ul> </div> <!-- .news --> <div class="quick-links"> <h3>Quick Links</h3> <ul> <li><a href="#0">Find a store</a></li> <!-- additional quick links here --> </ul> </div> </div> <!-- .cd-search-suggestions --> <a href="#0" class="close cd-text-replace">Close Form</a> </div> <!-- .cd-main-search -->
CSS стили
На устройствах с небольшим дисплеем (менее 1024px), основная навигации и форма поиска будут располагаться по правой стороне и изначально скрыты; при клике по иконке навигации, перемещаем элементы <main>
и <header>
влево (добавляем класс nav-is-visible
) для отображения навигации.
.cd-main-header, .cd-main-content { position: relative; transition: transform 0.3s; } .cd-main-header.nav-is-visible, .cd-main-content.nav-is-visible { transform: translateX(-260px); }
На устройствах с большим экраном форма поиска будет располагаться в верхней части страницы и раскрываться при клике на иконку. При клике по элементу .cd-search-trigger
, будет добавлен класс .is-visible
для отображения формы.
@media only screen and (min-width: 1024px) { .cd-main-search { position: absolute; z-index: 2; top: 0; left: 0; height: 100%; width: 100%; opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; } .cd-main-search.is-visible { /* открытие формы поиска */ opacity: 1; visibility: visible; } }
Для анимации формы добавим класс .animate-search
к элементу <header>
. Данный класс приводит в действие два разных типа CSS3 анимации: cd-slide-in
(для формы) и cd-3d-rotation
(для поисковых вариантов).
@media only screen and (min-width: 1024px) { .animate-search .cd-main-search.is-visible { /* вызываем анимацию если в <header> есть класс .animate-search */ animation: cd-slide-in 0.3s; } .animate-search .is-visible .cd-search-suggestions { /* вызываем анимацию если в <header> есть класс .animate-search */ transform-origin: center top; animation: cd-3d-rotation 0.5s 0.3s; animation-fill-mode: backwards; } } @keyframes cd-slide-in { 0% { transform: translateY(-100%); } 100% { transform: translateY(0); } } @keyframes cd-3d-rotation { 0% { transform: perspective(1000px) rotateX(-90deg); } 100% { transform: perspective(1000px) translateY(0); } }
Если вы предпочитаете простой эффект fade-in
(замена анимации формы), то уберите класс .animate-search
из элемента <header>
.
О выборе категорий: элемент <select>
позиционируется абсолютно (текст выбранного элемента меняется при выборе элемента списка через jQuery).
@media only screen and (min-width: 1024px) { .cd-main-search .cd-select { position: absolute; right: 0; overflow: hidden; } .cd-main-search select { /* элемент <select> невидим */ position: absolute; right: 0; opacity: 0; color: transparent; } .cd-main-search .selected-value { color: #ffffff; pointer-events: none; } .cd-main-search select, .cd-main-search .selected-value { padding: 0.5em 1.7em 0.5em .3em; font-size: 1.4rem; border-radius: 3px; } }
Обработка событий
В нашей HTML структуре элемент навигации находится в секции <header>
. На устройствах с небольшим экраном хотим, чтобы навигация изначально была скрыта и раскрывалась с правой стороны при клике на соответствующую иконку. Без перемещений элемента тут не обойтись. Для этого воспользуемся возможностями jQuery.
То же самое делаем и с элементом div.cd-main-search
: изначально данный элемент находится вне основной навигации. На устройствах с небольшим экраном переместим его в элемент nav.cd-main-nav-wrapper
.
var navigationWrapper = $('.cd-main-nav-wrapper'), navigation = navigationWrapper.children('.cd-main-nav'), searchForm = $('.cd-main-search'), navigationTrigger = $('.cd-nav-trigger'), mainHeader = $('.cd-main-header'); function moveNavigation(){ var screenSize = checkWindowWidth(); //returns 'mobile' or 'desktop' if ( screenSize == 'desktop' && (navigationTrigger.siblings('.cd-main-search').length == 0) ) { //размер ПК - вставляем навигацию и форму поиска в элемент <header> searchForm.detach().insertBefore(navigationTrigger); navigationWrapper.detach().insertBefore(searchForm).find('.cd-serch-wrapper').remove(); } else if( screenSize == 'mobile' && !(mainHeader.children('.cd-main-nav-wrapper').length == 0)) { //небольшие экраны - перемещаем навигаци и форму поиска в элемент после .cd-main-content element navigationWrapper.detach().insertAfter('.cd-main-content'); var newListItem = $('<li class="cd-serch-wrapper"></li>'); searchForm.detach().appendTo(newListItem); newListItem.appendTo(navigation); } }
Для отслеживания кликов воспользуемся возможностями jQuery. Так же через данный инструмент будет добавлять/удалять классы, а так же сменять текст span.selected-value
при смене активного значения элемента <select>
.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: https://codyhouse.co/gem/advanced-search-form/
Перевел: Станислав Протасевич
Урок создан: 28 Февраля 2016
Просмотров: 8993
Правила перепечатки
5 последних уроков рубрики "CSS"
-
Забавные эффекты для букв
Небольшой эффект с интерактивной анимацией букв.
-
Реализация забавных подсказок
Небольшой концепт забавных подсказок, которые реализованы на SVG и anime.js. Помимо особого стиля в примере реализована анимация и трансформация графических объектов.
-
Анимированные буквы
Эксперимент: анимированные SVG буквы на базе библиотеки anime.js.
-
Солнцезащитные очки от первого лица
Прикольный эксперимент веб страницы отображение которой осуществляется “от первого лица” через солнцезащитные очки.
-
Раскрывающаяся навигация
Экспериментальный скрипт раскрывающейся навигации.