JavaScript

индекс
246,38

Исследование на тему замены стандартных кнопок

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

Допустим, что она должна выглядеть примерно так:



Кнопка должна:
  1. быть inline-блоком
  2. иметь возможность наследовать стилизацию родителя (в пределах возможностей)
  3. Наследовать некоторые свойства и методы родителя.

На первом этапе я попробовал максимально минимизировать код, создавая подобную кнопку двумя контейнерами один из которых вложен во второй со смещениями для отображения красивого бэкграунда с закруглениями, в конце концов, этого не достаточно для того что бы в процессе была возможность наследовать свойства и методы самой кнопки, то есть сама кнопка как элемент должна присутствовать внутри контейнеров (<span><div><button/></div></span>).

Для упрощения эксперимента используем jQuery,

Спустя некоторое время выяснилось, что крайне сложно под IE, FF, Opera контролировать размеры и внешний вид всех контейнеров с кнопкой вкупе c помощью обычных CSS. Результат превратился в борьбу хаков над стилями. Тут же я впервые столкнулся с надобностью написания различных стилей для FF2 и FF3.

В конце концов за основу была взята концепция, используемая в ExtJS, а именно — таблица.

[левый край|кнопка|правый край]

В связи с этим, количество вопросов с позиционированием значительно сократилось, и вместе с ним — количество CSS.

Чит-коды



Допустим, что исходные кнопки задается следующим образом
<input type='submit' value='Submit' class='replaceMe w100'>
<input type='button' value='Pushme' class='replaceMe ico ico-image' disabled='disabled'>


В данном случае у нас получается что класс replaceMe будет являтся селектором для замены, класс w100 — вспомогательный класс (допустим, отвечающий за ширину кнопки), который должен будет наследоваться. ico и ico-image — классы отвечающие за иконки.

Картинка-спрайт для прототипа:
image

CSS прототипа:
.ico {
  padding-left: 20px !important;
  padding-bottom: 1px !important;
  background-position: 0px 0px;
  background-repeat: no-repeat;
}

.ico-image {  background-image: url("page_tick.gif") !important;}

/* Перебиваем все настройки которые могли бы помешать дизайну свыше*/
.xBtn tr td {
  border: 0 none !important;
  border-bottom: 0 none !important;
  padding: 0;
  font:normal 11px sans-serif, tahoma, verdana, helvetica ;
  height: 21px;
  min-height: 21px;
}

/* Стиль таблицы */
.xBtn {
  cursor:pointer;
  border-collapse: collapse;
  white-space: nowrap;
  display: inline;
  width: auto;
}

/* Стиль кнопки внутри центральной ячейки. Убираем все возможные отступы, пробелы.
* Имеем ввиду, что у IE есть такая странность: Добавлять лишние пробелы по краям кнопки,
* нечто походящее на padding: 0 1.3em;
* */
.xBtn button {
  border:0 none;
  background:transparent no-repeat;
  font:normal 11px tahoma,verdana,helvetica;
  padding-left:3px;
  padding-right:3px;
  height: 21px;
  cursor:pointer;
  margin:0;
  overflow:visible;
  width:auto;
  -moz-outline:0 none;
  outline:0 none;
}

/* Допольнение для IE */
* html .xBtn button {width: 1px;}
*+html .xBtn button {width: 1px;}
*+html .xBtn button {padding-top:3px;}

/* если кнопка будет с иконкой */
.xBtn .xBtn-text-ico {
  background-position: 0 0px;
  background-repeat: no-repeat;
  height: 16px;
  padding: 0 0 2px 18px;
  margin-top: 1px;
}

/* А возможно это будет просто текст */
.xBtn .xBtn-text {
  background-position: 0 0px;
  background-repeat: no-repeat;
  padding-top:0px;
  padding-bottom:2px;
  padding-right:0;
  margin-top: 1px;
  height: 16px;
}

/* борьба с IE */
*+html .xBtn .xBtn-text {  padding-top:1px;  margin-top: 2px;}

.xBtn-Left, .xBtn-Right {
  font-size:1px;
  line-height:1px;
  width:3px;
  height:21px;
}

.xBtn-Left   {  background: url(btn-sprite.png) no-repeat 0 0;}
.xBtn-Right {  background: url(btn-sprite.png) no-repeat 0 -21px;}

.xBtn .xBtn-Left i, .xBtn .xBtn-Right i {
  display:block;
  width:3px;
  overflow:hidden;
  font-size:1px;
  line-height:1px;
}

.xBtn .xBtn-Center {
  background:url(btn-sprite.png) repeat-x 0 -42px;
  vertical-align: middle;
  text-align:center;
  cursor:pointer;
  white-space:nowrap;
}

.xBtn-over .xBtn-Left{    background: url(btn-sprite.png) repeat-x 0 -63px !important; }
.xBtn-over .xBtn-Right{   background: url(btn-sprite.png) repeat-x 0 -84px !important; }
.xBtn-over .xBtn-Center {  background: url(btn-sprite.png) repeat-x 0 -105px !important;}
.xBtn-click .xBtn-Left {  background: url(btn-sprite.png) repeat-x 0 -126px !important;}
.xBtn-click .xBtn-Right {  background: url(btn-sprite.png) repeat-x 0 -147px !important; }
.xBtn-click .xBtn-Center {  background: url(btn-sprite.png) repeat-x 0 -168px !important;  }

.xBtn em {
  font-style:normal;
  font-weight:normal;
  height: 16px;
}


* This source code was highlighted with Source Code Highlighter.


И собственно, сам код:
$('.replaceMe').each(function(){
  // у исходника тут же убираем уже ненужный класс
  $(this).removeClass('replaceMe');

  // Создаем таблицу
  var BtnTable = document.createElement('table');
  var BtnTableRow = BtnTable.insertRow(0);
  var LeftBtnCell = BtnTableRow.insertCell(0);
  var CenterBtnCell = BtnTableRow.insertCell(1);
  var RightBtnCell = BtnTableRow.insertCell(2);
  
  // Что бы ячейки таблицы небыли пустыми,
  // создаем для них какие-нибуть контролируемые элементы DOM
  var newBtnContainer = document.createElement('em');
  var newBtnSideLContainer = document.createElement('i');
  var newBtnSideRContainer = document.createElement('i');

  // Назначаем классы, вставляем в контейнеры
  $(LeftBtnCell).addClass('xBtn-Left').append(newBtnSideLContainer);
  $(RightBtnCell).addClass('xBtn-Right').append(newBtnSideRContainer);

  // Замечательный атрибут,
  // предотвращающий выделение текстовой информации внутри блока
  newBtnContainer.setAttribute('uselectable', 'on');

  $(BtnTable)

    // Назначаем класс для самой таблицы-кнопки
    .addClass('xBtn')

    // Переносим из исходной кнопки ее значение в атрибут Title, для красоты эксперимента
    .attr('title', $(this).attr('value') || '')

    // Изменение классов при наведении и клике на таблице-кнопке
    .hover(
      function(){
        if ($('button:enabled', $(BtnTable)).length) $(this).addClass('xBtn-over');
      },
      function(){
        $(this).removeClass('xBtn-over');
        $(this).removeClass('xBtn-click');
      }
    )
    .mousedown(function(){
      //$(newBtn).focus();
      $(this).addClass('xBtn-click');
    })
    .mouseup(function(){
      $(this).removeClass('xBtn-click');
    });

  // Будем считать, что иконки на кнопках будут задаваться двумя классами
  // первый из которых будет отвечать за место под кнопку, второй - за само изображение.
  // ico ico-image

  // Определяем, есть ли у нас иконка, и что за...
  var xBtnClasses = this.className.split(' ');
  var hasIco = $(this).hasClass('ico');
  var icoClassName = '';
  for (var i = 0; i < xBtnClasses.length; i++ ) {
    if (xBtnClasses[i].toString().match(/ico-\w+/)) icoClassName = xBtnClasses[i].toString();
  }

  // Убираем из исходника классы отвечающие за иконки.
  if (hasIco && icoClassName) {
    $(this).removeClass('ico').removeClass(icoClassName)
  }

  // Копируем в центральную ячейку с будущей кнопкой классы из исходника (оставшиеся классы)
  // Обозначаем ее собственным классом и вставляем в нее контейнер для будущей кнопки
  $(CenterBtnCell).append(newBtnContainer).addClass(this.className).addClass('xBtn-Center');;
  
  // Копируем событие onclick исходника
  var onClickEv = $(this).attr('onclick');

  // Если есть какое событие, то устанавливаем его на всю таблицу-кнопку
  if (jQuery.isFunction(onClickEv)) {
    $(BtnTable).bind('click', function(e){
      onClickEv();
    });

  // Если нет события, то может быть наш родитель был submit-ом?
  // Нажимаем на кнопку и ждем спецэффектов
  } else if ( this.type == 'submit' ) {
    $(BtnTable).bind('click', function(e){
      if ($(this).find('button').length) {
        var f = $(this).find('button')[0];
        f.click();
      }
    });
  }
  
  // Скрываем нашего прородителя и вставляем перед ним прототип нашей кнопки
  $(this).hide().before(BtnTable);

  // Вместо кода написанного ниже сначала была попытка создать кнопку методами Javascript.
  // Но в связи с существующей проблемой под IE, которая запрещает изменять атрибут type
  // кнопку создаем обычным способом:
  
  var Btn = '<button ' +
    // Трансплантируем тип кнопки
    'type="' +  ($(this).attr('type') || 'button') +  '" ' +
    
    // Назначаем ID исходника
    'id="' +  this.id +  '" ' +
    
    // Передаем классы: иконок, если есть,
    'class="' +  ((hasIco && icoClassName) ? 'xBtn-text-ico ico ' + icoClassName : 'xBtn-text') + (($(this).attr('disabled')) ? ' disabled"' : '') + '" ' +
    
    // Передаем остальные аттрибуты
    (($(this).attr('disabled')) ? 'disabled="disabled"' : '') +
    'name="' +  $(this).attr('name')  +  '" ' +
    'title="' +  $(this).attr('title')  +  '" ' +
    'style="' +  (($(this).attr('value') == '') ? 'width:16px;' : '')  +  '" ' +
    '>' + $(this).attr('value') +
    '</button>';

  // Tadaaaa!
  newBtnContainer.innerHTML = Btn;

  // Небольшие жонглирования с шириной под IE, котрый не совсем понимает, что такое ширина, когда нет содержимого текста
  if ($.browser.msie && $(this).attr('value') != '') {
    if ($(CenterBtnCell).width()) {
      $(CenterBtnCell).find('button').css('width', $(CenterBtnCell).width() + 'px');
    } else {
      $(CenterBtnCell).find('button').css('width', TextMetrixWidth(this) + 18 + 'px');
    }
  }

  $(this).remove();
});

* This source code was highlighted with Source Code Highlighter.


Большое спасибо за внимание. Надеюсь что знания почерпнутые мной в процессе работы пригодились.

update: Демонстрация работы, по просьбам трудящихся.
+39
9 апреля 2009, 16:19
143

комментарии (113)

+30
LeKot #
Жесть. Я недооценивал труд веб-работников.
+1
MisterX #
А демку можно где-то глянуть?
0
khizhaster #
Да-да, покажите демку. Очень интересно, я как раз ковыряю гугло и ExtJS кнопки.
0
RayZ #
Читаем update к статье, или просто переходим по ссылке:
rayz.ru/misc/custombuttons/
+7
Supercharged #
Да чтоб я на сайты ходил с такими кнопками…
+5
khizhaster #
Простой пример — GMail :-) И ходят, поверьте мне, ходят!
0
Pirate #
Ходят, потому что аналогов нет. Но после введения этих кнопок, у меня сначала было какое-то отвращение к ним. Но это со временем прошло. Сейчас уже не обращаю на них внимание.
0
khizhaster #
Ой, да ладно ) Ну в конце-концов, если не утрировать, то какая разница? Кнопки то функциональны, во всех смыслах, выглядят оригинально и достаточно строго, выполняют свою работу. Чего же боле? Отчего же не ходить и не пробовать?
К тому же, лишние 20кб уже и не заметить. А ежели так тяжко, то можно включить стандартную версию (ну это касательно только гмыла :))
0
znvPredatoR #
Полностью согласен. Даже больше, так кнопки выглядят симпатичнее, если, конечно, они красиво задизайнены. А сайтов таких действительно много, тот же фейсбук.
0
slesar #
Вот есть хороший топик про кнопки habrahabr.ru/blogs/css/56389/
+2
RayZ #
Я больше делал упор не на сам результат «посморите, какая красота», а на функциональность и применение.
В смысле — как это сделать и каковы подводные камни.

Поэтому и заголовок — Исследование…
+1
pgg #
У вас код избыточный, посмотрите в камментах мой пример.
+5
Arekus #
Вы меня простите конечно, но 126кб плюс 36 секунд ожидания окончания загрузки (в примере отвалился один файл) — проверял Firebug'ом — ради двух кнопок — это как-то чересчур.
0
RayZ #
Пардон, сейчас поправим ;)

В реалии интерфейс продукта требует наличие какого-нибудь js-фреймворка, и вышеописанное делалось далеко не для двух кнопок, а для сотен ;)

И не только для кнопок.

Думаю, вскоре появится ещё одно небольшое исследование по поводу другого рода «удобности»
+3
gooddy #
задисейбленая кнопка не нажимается если жать где-то по середине, а если навести где-то с самого краю и попробовать нажать, то оппаньки :)
0
RayZ #
;) Это не баг, это фича
В цсс в демке забыл добавить пару строчек
0
kex #
В опере и ие6 жмется по всей ширине.
+1
alekciy #
Эх… старая избитая тема. Учитывая, извините меня, ублюдочный уровень поддежки оформления стиля кнопок как со стороны браузеров, так со стороны и стандартов проще всего использовать дефолтные стили офорления. А свете юзабили это даже предпочтительно делать, т.к. на каком бы сайте я не был я сразу вижу, где есть кнопки ибо стиль оформления у них от сайта к сайту один и тот же — дефолтный.

И вообще главное ехать, а не шашечки ;)
–1
RayZ #
Обоснуйте.

Кнопки рисуются как бы следуя законам гуя в котором порожден был браузер.
Любое приложение использует один стиль отображения интерфейса и по идее не должен выглядеть иначе. А тут у нас разброс и шатание. Я понимаю, какую сторону вы представляете. И вы правы, только не в моем случае.

Не с проста я статью начал со вышеперечисленных слов. Это было сделано ДЛЯ веб-приложения.
Юзабилити и дизайн имеет смысл. И попробуйте оспорить.
0
alekciy #
А я о веб и говорю. Законы гуя это все звучит хорошо я с этим согласен. Но в рамках какого то скомпилированного приложения. В рамках же веб приложения которое работает череб браузер не совсем согласен. Порой видишь на страницах такой закон гуя, что хочеться настучать дизайнеру по созвучному выступающему органу… Я привык к определенному виду кнопок в своем браузере, на какую бы страницу я не попал я всегда на ней без труда нахожу нужные кнопки. Но порой не сразу получается сориентироваться когда кнопки следуют законам гуя (особо когда их делает кривой дизайнер или кодер). И это не говоря уже о том, что у меня картинки отключены по дефолту…

Я не говорю, что не стоит следовать общей задумку дизайна, но, имхо, процентах в 90 это излишество. Лучше сосредоточиться на создании более практичных элементов страницы чем сбивать пользователя с привычного визуального образа кнопки в его браузере.
+2
MTonly #
Теперь увеличиваем размер шрифта средствами браузера и смотрим, что стало с кнопками. ;-)
–5
pgg #
Только один маньяк из десяти использует эту функцию.
Остальные 99.9999% пользователей сети даже не догадываются о существовании этого.

Тем более адекватные браузеры давно делают zoom.
+3
pvp #
фф3 — адекватный браузер? ну, по крайней мере, зум делает. Но с кнопками, как нам и намекал предыдущий оратор, при зуме происходит жопа.
+3
MTonly #
20% пользователей, в отличие от пользователей IE, выбрали Firefox осознанно. И столь же осознанно изменят размер шрифта. Не сомневайтесь. ;-)
0
RayZ #
Что-то я не понял, а в чем проблема? Графика растягивается? :)
+3
MTonly #
–1
RayZ #
оу :) Какой ужас!
НЛО прилетело и опубликовало эту надпись здесь
0
MTonly #
Вид → Масштаб → Только текст.
0
Mordraug #
я думаю, что можно немного усложнить разметку и сделать их масштабируемыми по самое «не балуйся» :)
0
Auru #
Не учитывается размер шрифта, в IE задизабленная кнопка реагирует на… фингеринг )
0
non7top #
блин. фф3 же поддерживает системные оформления. зачем еще нужны эти сложные и объемные велосипеды
–2
Auru #
кроссбраузерность нужна видимо кому-то все еще
–9
non7top #
кроссбраузерность — ненужный миф. бровзер должен быть удобным. отсутствие кроссброузерности — лишний повод подтолкнуть пользователей пересесть на нормальные бровзеры.
+3
SegaZero #
нормальные — это на оперу?=) не раздувайте холивар:)
0
non7top #
холивар не подразумевался. бывают нормальные бровзеры и бывает IE. в силу того что у IE нет сторонников, холивар не получится.
0
Mordraug #
<holywar:off>
ie вполне себе нормальный браузер — он умеет показывать страницы.

Докажите обратное той колде народа, что его используют (какая-то часть даже сознательно) :D
</holywar:off>
0
non7top #
да вот только страницы он не умеет показывать. и 99.9% кто его использует делают это несознательно.
0
MTonly #
Браузер, бровзер, броузер. Вы бы уже определились с написанием (подсказка: правильно — браузер). ;-)
–2
non7top #
бровзер. все что с кросс — от лукавого
0
MTonly #
А теперь внимание: правильный ответ (подсказка: смотреть надо на транскрипцию). ;-)
–5
non7top #
да и без транскрипции ясно как слово browser читается по-английски, достаточно вспомнить правило о произношении «o» под ударением. но ведь мы ж здесь не на чистом английском говорим. и вообще речь о бровзерах.
+6
MTonly #
Жесть.
+1
pgg #
Специально поинтерисовался у нашего переводчика:

англичане: "[броузер]"
американцы: "[браузер]"

Правильно и БРАУЗЕР и БРОУЗЕР, но никак не бровзер (уж вы меня простите, но это вообще не правильно). Так говорят все как хотят. Да, кстати и ВАЛИДАЦИЯ звучит как [вэлидэйшн].

GO — Гоу
MAKE — Мэйк
RUN — Ран
BROTHER — Бразер, браза.
0
non7top #
>англичане: "[броузер]"
вот это очень интересно. похоже это какие-то новые тенденции в разговорном языке англичан. тем более что они нарушают правила произношения. да и вряд ли англичане говорят р на конце слова.

>BROTHER — Бразер, браза.
да, браза, ты очень ч0ток.

для тех кто все еще в танке. бровзер это не то как читается browser. бровзер — это программа вэб страниц, т.е. то что в английском называется browser
0
Riddler #
Тогда уж бровСер
+6
DMS #
вам не кажется, что тут явно что-то не так?
–1
pgg #
Всё нетак!
0
RayZ #
Кажется. :) Но все началось далеко до создания кода, не так ли?
0
claymore #
позвольте спросить, а чем ExtJs то не подошел? там и стилизация есть и иконки на кнопке
0
RayZ #
:) Весом библиотек, скоростью работы, надобностью/ненадобностью функционала.
+1
Prometheus #
Афигеть, конечно, стока кода и стилей и все ради какой-то кнопочки :)
Должно быть таких кнопочек в проект дофигища.
0
pgg #
Согласен, тут можно половину отрезать.
0
RayZ #
Предложите оптимальный код, будем хлопать в ладоши!
0
Octane #
Лучше взять обычный <button>…</button>, сбросить его стандартное оформелние и положить внутрь необходимые элементы. Тогда кнопка сохранит превычное поведение и будет оформлена в нужном стиле.
+5
pgg #
Я так и сделал :-) pavelgorlov.ru/pgbtn/
0
RayZ #
Молодец! Мне нравится реализация.
+1
Xobb #
В никс браузерах глючит. подтверждаю (:
0
s1im #
«больная» кнопка, на которой написано, что она не лечится, почему-то выздоравливает :)
0
Arefiev #
при нажатии на кнопку текст смещается немного — как и должно быть — респект
+1
pgg #
Спасибо! У меня нехватает вермени, чтобы пофиксить это по все остальные браузеры и кармы для того, что бы писать об этом.
+1
pgg #
В вот мой вариант кнопки, без таблицы и с png32. И код меньше.

pavelgorlov.ru/pgbtn/

+ jQuery PG-плагин
+ Невалидны CSS код :-)
+ Два встроенных метода:
.pgFlash() — флешит кнопку,
.pgEnable(boolean) — выключает\включает кнопку, а при включеннии флешит.
+ Одна картинка:
0
Reey #
М, поехало чуть чуть.
www.picamatic.com/show/2009/04/10/04/24/3199431_365x202.png
Vista, ff 3.1b3 :)
0
pgg #
Будем лечить! Самое страшное это заставить эту конопку быть резиновой и поддерживать png-32 на фоне в IE6
0
mocksoul #
пациент мёртв, чего там лечить.

вы хоть понимаете что если умудрились сделать разное поведение в ff2, ff3 и ff3.1 — то с огромной доли вероятности вам для каждого багфикса фф придётся кнопки переделывать.

Да и значит накосячили вы там порядком. Слишком шатко.
0
mixx #
А прозрачность png-8 методом cssing.org.ua/2008/11/07/png-8-alpha/ не пробывал заменить? Почти везде удается безболезненно перейти с png-24 на png-8. Часть проблемы уйдет так думаю.
–1
pgg #
Нет, не читал, но читал в техногрете, а потом и проверял.
ИЕ неумеет, а гуглхром глуюч, отображать png8+alpha_channel

Хотя вы знаете, у меня нинастолько большое изображение, что бы его оптимизировать
0
mixx #
ИЕ6 умеет вполне адекватно, в данном случае думаю разница будет малозаметно. Chrome тоже в порядке. В статье выше указанной описан способ предварительной обработки изображений.
+3
Krovosos #
Я боюсь подумать о выпадающем списке в Ваших руках… ;-)

ЗЫ В Хроме 2.0.169.1 кнопка PushMe не работает
–3
RayZ #
Кнопка ПушМи DISABLED. Вы статью читали?
+3
badlittleduck #
Как это сделали в Google
www.usability.by/recreating-the-button/
+1
shtirlic #
Про кнупки гмейла тут
stopdesign.com/archive/2009/02/04/recreating-the-button.html
и тут stopdesign.com/eg/buttons/3.0/code.html#
0
MKrivosheev #
Маленький оффтоп: а как Вы счиатаете, при наведении на кнопку курсор должен становиться таким же, как при наведении на ссылку или оставаться стрелкой?
0
nobr #
Мне кажется, что любой элемент на сайте должен вести себя также, как и в реальной ОС: при наведении кнопка подсвечивается, а курсор остаётся обычной стрелкой.
+1
Denisio #
Перебор… Кнопки должны быть в стиле системы. Когда такие портянки кода и стилей должны тянуться ради нескольких кнопок — это перебор.
0
RayZ #
Кнопки в стиле системы. Эта система — продукт для которого делаются кнопки. :)
0
nobr #
Потрясающая работа. Спасибо за хорошую статью.

Мне стало интересно: можно ли сделать кнопку, которая растягивалась бы не только по ширине, но и по высоте? Нужна таблица на девять ячеек?
0
RayZ #
Нет.
0
RayZ #
Будут некоторые изменения со стилями и позиционированием бэкграундов. В остальном все остается примерно так же.
0
apkawa #
Я так и не понял что изменилось.
s57.radikal.ru/i155/0904/b4/1af64d5001d3.png
Кнопка как была обчыной так и осталась, разве что в правой какая то иконка появилась, которая невписывается.
0
RayZ #
Не скопированы картинки-спрайты для кнопок.
+1
TonyClifton #
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
+1
padonaque #
вот она — логика пользователей браузера опера.
+1
RayZ #
да и Опера в расчет не бралась при изготовлении. :) Я конечно извиняюсь перед пользователями оперы, что обошел этот браузер во время изготовления статьи.
+1
assTeT #
Ахахаха =) Браво!!!
Так их, этих двух!!!
0
mocksoul #
эм… 9.6 — не криво =)
0
Mordraug #
интересное исследование :)

одно время меня устраивало вот такое решение.

0
RayZ #
Ссылка не открывается :-/
0
Mordraug #
не знаю почему может не открываться.

попробуйте нагуглить Wii Buttons — по ссылке, собственно — они.
+1
aps #
[span][div]...[/div][/span] — некрасиво, даже если через CSS переопределено.
Кстати, если вы используете jquery, не смотрели в сторону CSS FrameWork jquery UI? Там куча заготовок для кнопок, панелей, иконок и т.п.
0
RayZ #
Я знаю про него, конечно же, но нет. Какой бы был смысл в моем опыте и исследовании?
0
aps #
>Какой бы был смысл
В принципе подобный опыт всегда положительный, Но я придерживаюсь мнения, что на смену всякой самодеятельности в области ui должны придти типовые решения. Может конечно я и ошибаюсь. Но глядя на эволюцию ui в десктопных приложениях все к тому должно идти.
+1
Triall #
По-моему слишком перегружено все, а jQuery можно юзать для наведения и нажатия.
0
aps #
>а jQuery можно юзать для наведения и нажатия.
хорошо хоть jQuery, а не extJS.

Для наведения и нажатия НУЖНО юзать соответствующие CSS-свойства hover и active. Они кстати и в ie6 ограниченно но работают.

+1
Duke #
а что будете делать для?
+1
Duke #
input type=file…
0
TiGR #
Видимо, отрисовывать заново, выставляя основному элементу 100% прозрачность. Где-то эта техника описывалась.
0
pgg #
Соберу плагин из моей кнопки и моего textinput'a с включенным readonly
0
foxyrus #
а firefox на первой кнопке появляется рамка при нажатии
вторая кнопка не нажимается хотя в explorer 6 и opera 9.5 кнопка визуально нажимается
0
milax #
Ничего себе))
0
brmn #
0
Nedomolkin #
интересное исследование.

небольшая опечаточка:

// Замечательный атрибут,
// предотвращающий выделение текстовой информации внутри блока
newBtnContainer.setAttribute('uselectable', 'on');

uselectable -> unselectable
0
mocksoul #
бу

$(el).disableSelection() / $(el).enableSelection() — кроссбраузерный вариант (effects.core вроде).
0
Nedomolkin #
да, верно. такое есть в ui.core. там: .attr(«unselectable»,«on»).css(«MozUserSelect»,«none»).
и у автора newBtnContainer не jquery объект по коду.
0
mocksoul #
не только:

(ui.core.js)
disableSelection: function() {
    return this
        .attr('unselectable', 'on')
        .css('MozUserSelect', 'none')
        .css('KhtmlUserSelect', 'none')
        .bind('selectstart.ui', function() { return false; });
},
0
mocksoul #
спорно…

а почему бы в IE6/7 рисовать обычные инпуты (один фиг юзеры оных браузеров не особо за финтифлюшками следят) а во всех остальных (включая IE8) по-человечески заюзать inline-block (коим на самом деле должна быть кнопка, а вовсе не inline).
0
mocksoul #
1) это будет гораздо быстрее работать
2) в IE при этом пострадает только дизайн, что терпимо, лишь бы функционал работал
3) будет больший охват браузеров. Уж лучше инпут обычный показать, чем все развалилось бы нахрен =)
0
terloger #
«В конце концов за основу была взята концепция, используемая в ExtJS, а именно — таблица.»

Блин, да вы оттуда все стащили и html и css и спрайты. Не есть гуд. Про лицензию вспомните.
0
RayZ #
Спрайты сделаны своими руками. И код, впрочем тоже. ;) А то, что я подглядел идею не делает меня нарушителем лицензии. Все свое.
0
BleSSeD #
У меня в Опере 9.25 глюки. Края и средина кнопки разорваны…
0
mihdan #
Это просто не описуемо, к чему такие страшные извращения?

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