В этом уроке мы создадим футер в стиле Facebook.
Популярность Facebook растет с каждым днем. Некоторые решения, которые используются на этом сайте довольно интересные. Мне очень нравится многофункциональный футер.
Этот урок будет состоять из нескольких частей. Сегодня в первой части урока мы создадим структуру футера с помощью CSS и jQuery.
Шаг №1 - HTML & CSS
Для фундамента нашего футера будем использовать неупорядоченный список. Последние два элемента списка (Alert Panel и Chat Panel) будут содержать подпанели. Поскольку эти две панели будут выровнены по правую сторону, порядок разметки будет обратным.
Обратите внимание на тег <small> внутри тега <a>. С помощью него мы добьемся эффекта тултипа (вслывающего сообщения) в нашем меню.
HTML
<div id="footpanel">
<ul id="mainpanel">
<li><a href="#" class="home">Inspiration <small>Design Bombs</small></a></li>
<li><a href="#" class="profile">View Profile <small>View Profile</small></a></li>
<li><a href="#" class="editprofile">Edit Profile <small>Edit
Profile</small></a></li>
<li><a href="#" class="contacts">Contacts <small>Contacts</small></a></li>
<li><a href="#" class="messages">Messages (10) <small>Messages</small></a></li>
<li><a href="#" class="playlist">Play List <small>Play List</small></a></li>
<li><a href="#" class="videos">Videos <small>Videos</small></a></li>
<li id="alertpanel"><a href="#" class="alerts">Alerts</a></li>
<li id="chatpanel"><a href="#" class="chat">Friends (<strong>18</strong>)</a></li>
</ul>
</div>
CSS
Для начала прикрепим наш футер в самый низ зоны обозрения:
#footpanel {
position: fixed;
bottom: 0; left: 0;
z-index: 9999; /*--Панель всегда поверх всех остальных элементов--*/
background: #e3e2e2;
border: 1px solid #c3c3c3;
border-bottom: none;
width: 94%;
margin: 0 3%;
}
6-я версия Интернет Эксплорера не понимает фиксированную позицию, и поэтому нам необходимо добавить небольшой хак:
*html #footpanel {
margin-top: -1px;
position: absolute;
top:expression(eval(document.compatMode &&document.compatMode=='CSS1Compat') ?documentElement.scrollTop+(documentElement.clientHeight-this.clientHeight)
: document.body.scrollTop +(document.body.clientHeight-this.clientHeight));
}
Теперь давайте придадим стиля нашему неупорядоченному списку:
#footpanel ul {
padding: 0; margin: 0;
float: left;
width: 100%;
list-style: none;
border-top: 1px solid #fff;
font-size: 1.1em;
}
#footpanel ul li{
padding: 0; margin: 0;
float: left;
}
#footpanel ul li a{
padding: 5px;
float: left;
text-indent: -9999px; /*--Для замены текста - Текст выталкивается за пределы
страницы --*/
height: 16px; width: 16px;
text-decoration: none;
color: #333;
position: relative;
}
html #footpanel ul li a:hover{ background-color: #fff; }
html #footpanel ul li a.active {
background-color: #fff;
height: 17px;
margin-top: -2px;
border: 1px solid #555;
border-top: none;
z-index: 200;
position: relative;
}
Далее прописываем замену текста для каждого элемента (вместо текста - иконки):
#footpanel a.home{
background: url(home.png) no-repeat 15px center;
width: 50px;
padding-left: 40px;
border-right: 1px solid #bbb;
text-indent: 0;
}
a.profile{ background: url(user.png) no-repeat center center; }
a.editprofile{ background: url(wrench_screwdriver.png) no-repeat center center; }
a.contacts{ background: url(address_book.png) no-repeat center center; }
a.messages{ background: url(mail.png) no-repeat center center; }
a.playlist{ background: url(document_music_playlist.png) no-repeat center center; }
a.videos{ background: url(film.png) no-repeat center center; }
a.alerts{ background: url(newspaper.png) no-repeat center center; }
#footpanel a.chat{
background: url(balloon.png) no-repeat 15px center;
width: 126px;
border-left: 1px solid #bbb;
border-right: 1px solid #bbb;
padding-left: 40px;
text-indent: 0;
}
#footpanel li#chatpanel, #footpanel li#alertpanel { float: right; }
Теперь давайте оформим всплывающую подсказку. Тег <small> будет спрятан с помощью display:none;. При наведении на ссылку будет преобразован в display:block;.
#footpanel a small {
text-align: center;
width: 70px;
background: url(pop_arrow.gif) no-repeat center bottom;
padding: 5px 5px 11px;
display: none; /*--Спрятать по умолчанию--*/
color: #fff;
font-size: 1em;
text-indent: 0;
}
#footpanel a:hover small{
display: block; /*--Показывать при наведении--*/
position: absolute;
top: -35px; /*--Позиционируем подсказку 35 пикселей над меню--*/
left: 50%;
margin-left: -40px; /*--Центрирование подсказки--*/
z-index: 9999;
}
Что нас ждет дальше?
В следующей части урока мы добавим немного jQuery магии и заставим панели двигаться и взаимодействовать :).
Шаг №2 - HTML & CSS
Нам необходимо разместить встроенную субпанель в списке. Можете взглянуть на изображение ниже.
HTML
<li id="alertpanel">
<a href="#" class="alerts">Alerts</a>
<div class="subpanel">
<h3><span> – </span>Notifications</h3>
<ul>
<li class="view"><a href="#">View All</a></li>
<li>
<a href="#" class="delete">X</a>
<p><!--Content--></p>
</li>
<li>
<a href="#" class="delete">X</a>
<p><!--Content--></p>
</li>
</ul>
</div>
</li>
<li id="chatpanel">
<a href="#" class="chat">Friends (<strong>18</strong>) </a>
<div class="subpanel">
<h3><span> – </span>Friends Online</h3>
<ul>
<li><span>Family Members</span></li>
<li><a href="#"><img src="chat-thumb.gif" alt="" /> Your Friend</a></li>
<li><a href="#"><img src="chat-thumb.gif" alt="" /> Your Friend</a></li>
</ul>
</div>
</li>
CSS
Поскольку в первой части мы уже определили стили для элементов списка, нам необходимо их отменить для того, чтобы использовать обычные ссылки в субпанелях.
#footpanel ul li div a { /*--Reset link style for sub-panel links--*/
text-indent: 0;
width: auto;
height: auto;
padding: 0;
float: none;
color: #00629a;
}
#footpanel ul li div a:hover { text-decoration: underline; } /*--Reset hover
style for sub-panel links--*/
Теперь необходимо придать контейнеру субпанели абсолютное позиционирование (над главной панелью футера - 27 пикселей от футера панели). Далее создадим заголовки используя тег <h3>.
#footpanel .subpanel {
position: absolute;
left: 0; bottom: 27px;
display: none; /*--Hide by default--*/
width: 198px;
border: 1px solid #555;
background: #fff;
overflow: hidden;
}
#footpanel h3 {
background: #526ea6;
padding: 5px 10px;
color: #fff;
font-size: 1.1em;
cursor: pointer;
}
#footpanel h3 span { /*--Right aligned "-" icon--*/
font-size: 1.5em;
float: right;
line-height: 0.6em;
font-weight: normal;
}
Следующая секция это место где будет скролл. Используйте overflow: auto; для разрешения появления скролла, когда высота контента превысит высоту <ul>
#footpanel .subpanel ul{
padding: 0; margin: 0;
background: #fff;
width: 100%;
overflow: auto;
padding-bottom: 2px;
}
#footpanel .subpanel li{
float: none; /*--Reset float--*/
display: block;
padding: 0; margin: 0;
overflow: hidden;
clear: both;
background: #fff;
position: static; /*--Reset relative positioning--*/
font-size: 0.9em;
}
Панель Чата
#chatpanel .subpanel li { background: url(dash.gif) repeat-x left center; }
#chatpanel .subpanel li span {
padding: 5px;
background: #fff;
color: #777;
float: left;
}
#chatpanel .subpanel li a img {
float: left;
margin: 0 5px;
}
#chatpanel .subpanel li a{
padding: 3px 0; margin: 0;
line-height: 22px;
height: 22px;
background: #fff;
display: block;
}
#chatpanel .subpanel li a:hover {
background: #3b5998;
color: #fff;
text-decoration: none;
}
Панель сообщений
#alertpanel .subpanel { right: 0; left: auto; /*--Reset left positioning and make it right positioned--*/ }
#alertpanel .subpanel li {
border-top: 1px solid #f0f0f0;
display: block;
}
#alertpanel .subpanel li p {padding: 5px 10px;}
#alertpanel .subpanel li a.delete{
background: url(delete_x.gif) no-repeat;
float: right;
width: 13px; height: 14px;
margin: 5px;
text-indent: -9999px;
visibility: hidden; /*--Hides by default but still takes up space (not completely gone like display:none;)--*/
}
#alertpanel .subpanel li a.delete:hover { background-position: left bottom; }
#footpanel #alertpanel li.view {
text-align: right;
padding: 5px 10px 5px 0;
}
Шаг №3 - jQuery
Настройка высоты субпанелей
Очень важно сделать так, чтобы в субпанеле контент не растягивался за пределы зоны видимости.
Для того, чтобы гарантировать это необходимо использовать следующую функцию для подсчета и ресайза высоты панели с учетом размера зоны видимости.
jQuery
//Настроить высоту панели
$.fn.adjustPanel = function(){
$(this).find("ul, .subpanel").css({ 'height' : 'auto'}); //Сброс высоты субпанели и ul
var windowHeight = $(window).height(); //Взять высоту зоны видимости
var panelsub = $(this).find(".subpanel").height(); //Взять высоту субпанели
var panelAdjust = windowHeight - 100; //Высота зоны видимости - 100px
var ulAdjust = panelAdjust - 25; //Посчитать размер ul после подстройки субпанели
if ( panelsub > panelAdjust ) { //Если субпанель выше, тогда max height...
$(this).find(".subpanel").css({ 'height' : panelAdjust }); //Выравнивание субпанели на max height
$(this).find("ul").css({ 'height' : panelAdjust}); ////Настроить ul субпанели на новый размер
}
else if { //Если субпанель меньше тогда max height...
$(this).find("ul").css({ 'height' : 'auto'}); //Настроить ul субпанели на auto (размер по умолчанию)
}
};
//Выполнить функцию при загрузке
$("#chatpanel").adjustPanel(); //Выполнить функцию adjustPanel на #chatpanel
$("#alertpanel").adjustPanel(); //Выполнить функцию adjustPanel на #alertpanel
//Каждый раз когда зона видимости меняется, выполнять функцию
$(window).resize(function () {
$("#chatpanel").adjustPanel();
$("#alertpanel").adjustPanel();
});
Добавить функцию переключения
Поскольку обе панели складывающиеся, нам необходимо относиться к ним следующим образом: когда одна открывается, вторая должна закрываться. Также нам необходимо, чтобы они закрывались при клике вне их зоны.
//Событие нажатия на Chat Panel и Alert Panel
$("#chatpanel a:first, #alertpanel a:first").click(function() { //Если нажата первая ссылка #chatpanel и #alertpanel...
if($(this).next(".subpanel").is(':visible')){ //If subpanel is already active...
$(this).next(".subpanel").hide(); //Спрятать активную субпанель
$("#footpanel li a").removeClass('active'); //Убрать класс active с субпенели
}
else { //Если субпанель не активна...
$(".subpanel").hide(); //Hide all subpanels
$(this).next(".subpanel").toggle(); //Включить субпанель
$("#footpanel li a").removeClass('active'); //Убрать класс active с субпенели
$(this).toggleClass('active');
}
return false;
});
//При клике вне зоны субпанели
$(document).click(function() { //Click anywhere and...
$(".subpanel").hide(); //Спрятать субпанель
$("#footpanel li a").removeClass('active'); //Убрать класс active с субпенели
});
$('.subpanel ul').click(function(e) {
e.stopPropagation();
});
//Показать/спрятать иконки delete на Alert Panel
$("#alertpanel li").hover(function() {
$(this).find("a.delete").css({'visibility': 'visible'});
},function() {
$(this).find("a.delete").css({'visibility': 'hidden'});
});
Заключение
Наша панель может быть использована во многих админских приложениях. В этом уроке мы рассмотрели множество интересных техник, которые могут Вам сильно пригодиться при разработке других приложений.