Плавающие вкладки

17 января 2008 года, 18:14
К данной статье привязаны следующие примеры:

Плавающие вкладки — это элементы div с абсолютным позиционированием и смещением за основное рабочее пространство документа.

По сути, это не практическая рекомендация, а концептуальная модель освобождения места на рабочем пространстве документа.

Создадим, для начала, структурную часть нашей вкладки:

<div class="visualtip" id="loginbox"> E-Mail address: <p><input type="text" /></p> Password: <p><input type="password" /></p> </div> <div class="visualtip v2" id="drownbox"> <p>This is paragraph.</p> <p>Another paragraph of text.</p> </div>

Здесь мы обозначили идентификаторы элементов, а также их CSS-классы.

Уже было сказано, что данный элемент должен быть абсолютно позиционирован. Для этого мы будем использовать следующий стиль:

.visualtip { position: absolute; }

Но этого мало: теперь нужно сместить элементы относительно всего документа влево так, чтобы был виден лишь их край. Вместе с этим, придаём элементам законченный вид.

.visualtip { display: block; padding: 10px; background: #F2F4B2; border: dashed 1px #ddd; position: absolute; letter-spacing: 1.4px; font-family: Arial; position: absolute; width: 300px; left: -290px; top: 40px; }

Так как у нас две вкладки, то вторая должна быть ниже первой, поэтому переопределяем для неё свойство top.

.v2 { top: 250px; }

После этого, зададим свойства для вложенных во вкладки полей input.

.visualtip input { border: solid 1px #ccc; font-size: 18px; color: #444; letter-spacing: 1.2px; text-align: center; }

Приступаем за разработку управляющего JavaScript-кода.

И реализуем основную функцию для создания подобного элемента интерфейса:

function AddSideWidget(fieldid) { //Определяем переменные this.field = $(fieldid); this.field.setAttribute("maxleft", this.field.offsetLeft); //Создаём функции для прослушивания событий listen(this.field, "mouseover", bind(this, "h_mousemove")); listen(this.field, "mouseout", bind(this, "h_mouseout")); this.h_mousemove = function() { if (this.field.getAttribute("isvisible") == null || this.field.getAttribute("isvisible") == "false") { var interval = false; var _field = this.field; _field.style.left = parseInt(_field.offsetLeft) + "px"; var t_func = function() { if (parseInt(_field.style.left) <= 0) { _field.style.left = (parseInt(_field.style.left)+8) + "px"; } else { clearInterval(interval); _field.style.left = "0px"; _field.setAttribute("isvisible", "true"); } } interval = setInterval(t_func, 10); } } this.h_mouseout = function(e) { var canout = true; try { if (!e) var e = window.event; var tg = (window.event) ? e.srcElement : e.target; if (tg.nodeName != 'DIV') canout = false; var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement; while (reltg != tg && reltg.nodeName != 'BODY') reltg= reltg.parentNode if (reltg== tg) canout = false; } catch (excp) { } if (canout && this.field.getAttribute("isvisible") == "true") { var interval = false; var _field = this.field; _field.style.left = parseInt(_field.offsetLeft) + "px"; var t_func = function() { if (parseInt(_field.style.left) >= parseInt(_field.getAttribute("maxleft"))) { _field.style.left = (parseInt(_field.style.left)-8) + "px"; } else { clearInterval(interval); _field.style.left = parseInt(_field.getAttribute("maxleft")) + "px"; _field.setAttribute("isvisible", "false"); } } interval = setInterval(t_func, 10); } } }

Теперь всё готово и можно использовать эти функции.

new AddSideWidget("loginbox"); new AddSideWidget("drownbox");

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

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

Мнения (15)

Все эти хорошие люди уже прокомментировали запись. Поделитесь собственным мнением, расскажите, что вы думаете о поставленной проблеме, задаче, озвученных мыслях.

  • chrono

    17 января 2008 г.19:35

    очень красиво, а не сильно ли это много весит для такой вкладки?

  • Дин автор

    17 января 2008 г.19:37

    Всмысле? Не понял вопроса…

  • chrono

    17 января 2008 г.19:48

    ну не слишком ли долго из за этого у людей будет страничка грузиться?

  • Дин автор

    17 января 2008 г.19:51

    А почему она должна долго грузиться? Ничего подобного.

  • kizu

    17 января 2008 г.20:14

    Думаю, имеет смысл добавить откат на выпадение вкладки с чистым CSS, в случае если яваскрипт будет отключен.
    Понятно, что вероятность этого крайне мала, но… =)

  • Дин автор

    17 января 2008 г.20:19

    Ага, имеет, в более практической версии так и сделаю. Оно того стоит.

  • Mischka

    18 января 2008 г.13:14

    а можно в примерах сделать так, чтобы форма не исчезала, если фокус ввода в ее инпутах? А то мышь убираешь и емэйл уехал.

  • Дин автор

    18 января 2008 г.13:20

    Хорошая идея. Через такие идеи понимаешь, что надо к комментариям приделывать +/— систему.

  • Mischka

    18 января 2008 г.15:40

    к комментариям надо приделать авторизацию на сайте. Иначе непонятно, естьновые для меня каменты или нету? Да и +/- система без авторизации не проканает.
    Только не нужно принудительной авторизации для каментов. Каменты только с регистрацией — фуфло.

  • Дин автор

    18 января 2008 г.15:46

    Я вот против авторизации. Я был бы за авторизацию только в случае раздачи персонального ключа единовременного, который после этого подставляется в URL (самим пользователем в первый раз, системой — в последующие) и пользователь считается аутентифицированным. Важно, чтобы он этот ключ не посеял (хотя это не проблема) и не отдал кому-нибудь (не показывал кому не надо). Только так.

    Принудительной авторизации никогда не будет. Я хочу чтобы любой мог комментировать любую статью. А над персонализацией я подумаю.

    Про +/- в комментариях без авторизации — проканает. Просто не понятно будет, зачем кому-то накручивать ничего по сути не значащие плюсики или минусики, а значит они и не нужны.

  • Mischka

    18 января 2008 г.16:06

    авторизация нужна только для того, чтобы править свои каменты. Больше я пока не вижу для нее применения.
    Ну и полезно бы видеть, в каких статьях добавились каменты, которые еще не читал.

  • Дин автор

    18 января 2008 г.16:10

    Ну тогда пока не вижу смысла вводить авторизацию, так как правку комментариев можно избежать через их проверку в предпросмотре.

    А про комментарии, которые не читал, это можно упростить: добавить RSS-ленту всех комментариев на сайте. Я вижу в этом выход, так как это наиболее простой и эффективный способ оповещения пользователя о новых комментариях.

  • Mischka

    18 января 2008 г.15:54

    ЗЫ: И еще для зарегистрированных пользователей флуд-контроль можно уменьшить до 30 секунд. И убрать галочку «Оповестить по е-мэйл» в куки (задолбало убирать постоянно).

  • Алексей

    20 февраля 2009 г.05:54

    Супер! :) Очень забавная выезжающая панель получилась. 1 вопрос — сложно ли с базы загружать категории чего либо в одну из панелек? И потом чтобы можно клацать по этим категориям? Благодарю за ответ.

  • Асхат

    26 мая 2010 г.14:02

    при просмотре примера я вот что обнаружил… 1. если нажать на поле, то при убирании мышки панель все равно уезжает… 2. если что либо написать и навести на 2 панель, потом снова на первую и выше первой — обе панели уезжают, но не до конца и дергаются-дергаются…

Я тоже знаю!

Для обращения к человеку используйте символ @, после которого следует имя того, к кому обращаетесь (пробелы заменяются на знак подчёркивания). Если вам интересно, можете подписаться на комментарии по RSS или по эл. почте. Ведите себя достойно, вы же не роботы, правда?

Вы можете использовать следующие XHTML-элементы в разметке комментария: strong, em, span[class=crossline], a[href=uri], code[type=язык], blockquote, ul и ol. В качестве языка кода может быть указан, например, javascript или css.