<div class="articleContent"> <p class="redLetter">Большенству веб-разработчиков, более или менее тесно общавшихся с разметкой известно, что выпадающие списки – <strong><select></strong> – как таковые невозможно отстилить. «Веб-разработчик – технарь, у него нет эстетического воображения» – подумает дизайнер и нарисует «красивые» селекты. Мало того, бизнес (заказчики или менеджеры) посмотрят и решат, что красиво – правильно. И вот стоишь ты один в поле и кручинишься, куда же тебя судьбинушка завела.</p> <p>Сами селекты отстилить нельзя, зато можно сделать для них красивую обертку можно. Что нам для этого нужно:</p> <ol> <li>Не самые глубокие познания в <strong>HTML</strong></li> <li>Advanced скилы в <strong>CSS</strong></li> <li>Немного <strong>JavaScript</strong></li> <li>Холодную голову</li> <li>Крепкие нервы</li> <li>Пол-литра пива</li> </ol> <p>Есть, к примеру, дизайн страницы и в нем вот такое чудо, которое должно исполнять роль селекта:</p> <div style="text-align: center;"><img width="221" height="45" title="select_01" alt="" src="http://frontendblog.info/post-images/2010/08/select_01.png"></div> <p>Ну и предположим, что дизайна на саму выпадающую часть у нас нет – значит подойдет и стандартная. Дальше буду рассказывать про то как минимизировать труды с максимумом пользы.</p> <p>Делаем красивую <strong>HTML</strong>ку, как нас просит дизайн, абсолютно-позицыонируем над ней селект и прячим селект. Ну хорошо, скажите Вы, и как же заставить всю эту громадину работать, если всем известно, что <strong>JavaScript</strong>‘ом селект не откроешь? Дочитай до конца и не лезь вперед батьки, отвечу я. Вот Вам селект, попробуйте в него покликать, в любое место, в любом браузере:</p> <div style="text-align: center;"> <select> <option>————</option> <option>11111111</option> <option>22222222</option> <option>22222222</option> <option>22222222</option> </select> </div> <p>Удивительно, не правда ли? Он открывается куда бы в него ни кликнули. Вот на этом и построим весь принцып работы нашего красивого селекта. При этом все-таки можно задать ему размеры:</p> <pre><code class="html"><span class="html__tag_start"><select</span> <span class="html__attr_name">style</span>=<span class="html__attr_value">"width: 200px; height: 30px;"</span><span class="html__tag_start">></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>------------<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>11111111<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br><span class="html__tag_end"></select></span> <br></code></pre> <div style="text-align: center;"> <select style="width: 200px; height: 30px;"> <option>————</option> <option>11111111</option> <option>22222222</option> <option>22222222</option> <option>22222222</option> </select> </div> <p>Как всегда, первым делом <strong>HTML</strong>:</p> <pre><code class="html"><span class="html__tag_start"><span</span> <span class="html__attr_name">class</span>=<span class="html__attr_value">"select"</span><span class="html__tag_start">></span> <br> <span class="html__tag_start"><span</span> <span class="html__attr_name">class</span>=<span class="html__attr_value">"left"</span><span class="html__tag_start">></span> <br> <span class="html__tag_start"><span</span> <span class="html__attr_name">class</span>=<span class="html__attr_value">"button"</span><span class="html__tag_start">></span> <br> <span class="html__tag_start"><span</span> <span class="html__attr_name">class</span>=<span class="html__attr_value">"center"</span><span class="html__tag_start">></span><span class="html__tag_end"></span></span> <br> <span class="html__tag_end"></span></span> <br> <span class="html__tag_end"></span></span> <br> <span class="html__tag_start"><select</span><span class="html__tag_start">></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>------------<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>11111111<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br> <span class="html__tag_start"><option</span><span class="html__tag_start">></span>22222222<span class="html__tag_end"></option></span> <br> <span class="html__tag_end"></select></span> <br><span class="html__tag_end"></span></span> <br></code></pre> <p>Здесь будет использоваться тот же принцип, что и в посте про <a class="mylink" href="/styles/prettiness/pretty-buttons/">кнопки</a>, и, самое главное, очень похожий спрайт:</p> <div style="text-align: center;"><img width="100" height="110" title="select_bg" alt="" src="http://frontendblog.info/post-images/2010/08/select_bg.png"></div> <p>Вы, наверное, заметили, что вместо излюбленных всеми дивов, я использовал здесь спаны. А сделал я это из простой лени. Как известно, великий и неповторимый IE7 не очень любит, когда нативно-блочные элементы принуждают быть инлайн-блочными, и игнорирует такое обращение с ними. Так что выхода остается 2 – либо некрасивый хак, либо красивый спан <img class="wp-smiley" alt=":)" src="http://frontendblog.info/wp-includes/images/smilies/icon_smile.gif"> Я за второе.</p> <p>Давайте пока забьем на сам селект и по-быстрому набросаем его обложку. Стили там тоже не сложные, как и у кнопок:</p> <pre><code class="css"><span class="css__class">.select</span> { <br> <span class="css__property">display:</span> <span class="css__value">inline</span>-<span class="css__value">block</span>; <br> <span class="css__property">position:</span> <span class="css__value">relative</span>; <span class="css__comment">/* основа для <br> позиционирования селекта */</span> <br>} <br><span class="css__class">.select</span> <span class="css__element">span</span> { <br> <span class="css__property">background-image:</span> <span class="css__url">url(</span>/* здесь путь к спрайту */<span class="css__url">)</span>; <br> <span class="css__property">display:</span> <span class="css__value">block</span>; <span class="css__comment">/* применение бокс-модели */</span> <br> <span class="css__property">cursor:</span> <span class="css__value">pointer</span>; <br> <span class="css__property">height:</span> <span class="css__number">30px</span>; <span class="css__comment">/* высота части спрайта */</span> <br> <span class="css__property">line-height:</span> <span class="css__number">30px</span>; <span class="css__comment">/* выравниваем текст по высоте */</span> <br>} <br><span class="css__class">.select</span> <span class="css__class">.left</span> { <br> <span class="css__property">background-position:</span> <span class="css__number">0px</span> <span class="css__number">0px</span>; <span class="css__comment">/* позиционируем спрайт */</span> <br> <span class="css__property">padding-left:</span> <span class="css__number">10px</span>; <span class="css__comment">/* ширина соотв. части в спрайте */</span> <br> <span class="css__property">background-repeat:</span> <span class="css__value">no-repeat</span>; <br>} <br><span class="css__class">.select</span> <span class="css__class">.button</span> { <br> <span class="css__property">background-position:</span> <span class="css__value">right</span> -<span class="css__number">80px</span>; <span class="css__comment">/* позиционируем спрайт */</span> <br> <span class="css__property">padding-right:</span> <span class="css__number">30px</span>; <span class="css__comment">/* ширина кнопки в спрайте */</span> <br> <span class="css__property">background-repeat:</span> <span class="css__value">no-repeat</span>; <br>} <br><span class="css__class">.select</span> <span class="css__class">.center</span>{ <br> <span class="css__property">background-position:</span> <span class="css__value">left</span> -<span class="css__number">40px</span>; <span class="css__comment">/* позиционируем спрайт */</span> <br> <span class="css__property">background-repeat:</span> <span class="css__value">repeat-x</span>; <br> <span class="css__property">width:</span> <span class="css__number">150px</span>; <br>} <br></code></pre> <p> На этом этапе мы имеем вполне красивую и соответствующую дизайну непонятную штуку и селект:</p> <div style="text-align: center;"><img width="250" height="78" title="select_02" alt="" src="http://frontendblog.info/post-images/2010/08/select_02.png"></div> <p>Теперь надо расположить селект поверх нашего непойми чего и выровнять его размеры:</p> <pre><code class="css"><span class="css__class">.select</span> <span class="css__element">select</span> { <br> <span class="css__property">position:</span> <span class="css__value">absolute</span>; <br> <span class="css__property">width:</span> <span class="css__number">190px</span>; <br> <span class="css__property">height:</span> <span class="css__number">30px</span>; <br> <span class="css__property">left:</span> <span class="css__number">0px</span>; <br> <span class="css__property">top:</span> <span class="css__number">0px</span>; <br>}</code></pre> <p>А чтобы было проще с размерами определяться, сделаем селект маленько прозрачным:</p> <pre><code class="css"><span class="css__class">.select</span> <span class="css__element">select</span> { <br> <span class="css__property">position:</span> <span class="css__value">absolute</span>; <br> <span class="css__property">width:</span> <span class="css__number">190px</span>; <br> <span class="css__property">height:</span> <span class="css__number">30px</span>; <br> <span class="css__property">left:</span> <span class="css__number">0px</span>; <br> <span class="css__property">top:</span> <span class="css__number">0px</span>; <br> opacity: .<span class="css__number">2</span>; <br> <span class="css__property">filter:</span> alpha(opacity=<span class="css__number">20</span>); <br>}</code></pre> <p>Получившийся результат посмотрим, пощелкаем покликаем……:</p> <style type="text/css"> .select select { position: absolute; width: 190px; height: 30px; left: 0px; top: 0px; opacity: .4; filter: alpha(opacity=40); } .select select.transparent { opacity: 0; filter: alpha(opacity=0); } .select { display: inline-block; position: relative; /* основа для позиционирования селекта */ } .select span { background-image: url(/post-images/2010/08/select_bg.png); display: block; /* применение бокс-модели */ cursor: pointer; height: 30px; /* высота части спрайта */ line-height: 30px; /* выравниваем текст по высоте */ text-align: left; } .select .left { background-position: 0px 0px; /* позиционируем спрайт */ padding-left: 10px; /* ширина соотв. части в спрайте */ background-repeat: no-repeat; } .select .button { background-position: right -80px; /* позиционируем спрайт */ padding-right: 30px; /* ширина кнопки в спрайте */ background-repeat: no-repeat; } .select .center{ background-position: left -40px; /* позиционируем спрайт */ background-repeat: repeat-x; width: 150px; } </style> <div style="text-align: center;"> <span class="select"><span class="left"><span class="button"><span class="center"></span></span></span><br> <select> <option>————</option> <option>11111111</option> <option>22222222</option> <option>33333333</option> <option>44444444</option> </select> <p> </p></span></div> <p>Заметили? Именно!!! Вот так же я однажды сидел и выравнивал размеры селекта и обратил внимание, что даже если сам селект полупрозрачный его выпадающая част будет видна, а сам он остается кликабельным и активным в форме. И остается только сделать селект полностью прозрачным и прикрутить обработчик небольшой на клик и изменение у селекта:</p> <pre><code class="css"><<span class="css__element">select</span> <br> <span class="css__element">onclick</span>="$(<span class="css__element">this</span>)<span class="css__class">.parent</span>()<span class="css__class">.find</span>('<span class="css__class">.center</span>') <br> <span class="css__class">.html</span>(<span class="css__element">this</span><span class="css__class">.options</span>[<span class="css__element">this</span><span class="css__class">.selectedIndex</span>]<span class="css__class">.text</span>)" <br> <span class="css__element">onchange</span>="$(<span class="css__element">this</span>)<span class="css__class">.parent</span>()<span class="css__class">.find</span>('<span class="css__class">.center</span>') <br> <span class="css__class">.html</span>(<span class="css__element">this</span><span class="css__class">.options</span>[<span class="css__element">this</span><span class="css__class">.selectedIndex</span>]<span class="css__class">.text</span>)" <br>></code></pre> <div style="text-align: center;"> <span class="select"><span class="left"><span class="button"><span class="center">————</span></span></span><br> <select onclick="$(this).parent().find('.center').html(this.options[this.selectedIndex].text)" onchange="$(this).parent().find('.center').html(this.options[this.selectedIndex].text)" class="transparent"> <option>————</option> <option>11111111</option> <option>22222222</option> <option>333333333</option> <option>44444444</option> </select> <p> </p></span></div> <p>Собственно, все.</p> </div>
Несмотря на экзотичность такого фильтра, он мне понадобился уже на двух проектах. Это, ясное дело, из-за того что у меня мак, и мне не все равно. Короткий грязный(невалидный и не future proof) но работающий здесь и сейчас хак для Safari 2-3. Зачем это надо?
Ситуаций, в которых я он мне понадобился оказалось пока 2.
Шаг 1. Пишем разметку. 01 <div id="container"> 02 <div id="header"> 03 <h1>Лайтбокс на XHTML & CSS (без использования JavaScript)</h1> 04 <p> 05 <strong> 06 Разработчик: <a href="http://twitter.com/jjenzz" target="_blank">Jenna Smith</a> / 07 Исправления для OPERA: <a href="http://www.3d4x.ch/" target="_blank">Tobias Wiersch</a> / 08 Перевод на русский язык: команда <a href="http://www.ruseller.com/" target="_blank">сайта RUSELLER.COM</a> 09 </strong> 10 </p> 11 </div> 12 <div id="content"> 13 <h2>Нажмите на ссылки в тексте ниже, чтобы увидеть лайтбокс в действии</h2> 14 <p>Lorem ipsum dolor sit amet, <a href="#">consectetur</a> adipiscing elit. 15 Donec massa lorem, elementum et mollis non, viverra a est.Aliquam eget tellus risus.</p> 16 <p>Proin <a href="#">sollicitudin</a>elementum sem id pulvinar. 17 Duis nec est at mi condimentum consequat sed vitae metus. Lorem ipsum dolor sit amet, consectetur 18 adipiscing elit.</p> 19 </div> 20 <div id="footer"> 21 <p>Copyright <a href="http://twitter.com/jjenzz" target="_blank">Jenna Smith</a></p> 22 <p>Перевод на русский язык: команда <a href="http://www.ruseller.com/" target="_blank">сайта RUSELLER.COM</a></p> 23 </div> 24 </div>
Тема закруглённых углов и их реализации многим уже наверняка набила оскомину :) Всё-таки я предложу свои четыре кроссбраузерных способа создания закруглённых углов, которые тянутся по ширине и длине, с использованием минимального количества пустых тегов и изображений. HTML (общий для всех четырёх примеров):
Иногда когда делаем блоки с float:left, приходится сталкиваться с блоками разной высоты, и они при переходе на новую строчку, начинают строится после самого высокого, что ужастно… И приходится или ставить после определённого количества br clear=’all’ или указывать фиксированую высоту, что не всегда приемлемо.
Этот вопрос можно решить всего-лишь сэмулировав display:inline-block для старых ИЕ и для старых фоксов, ниже 3
Есть Хтмл, в нём Див.dynamic с контентом изменяемого размера и контейнер.middle плавающий, что должне быть по центру. <div id="container"> <div id="dynamic"> любая текстовая рыба </div> <div id="middle"> <div id="ie_helper"> <p>ТекстЪ по центру. </p> </div> </div> </div> Есть простенький цсс, который просто делает с наших дивов ячейку, и потому работает вертикал-алигн.
SEO-колонка спросите вы? Ничего тут страшного нет. Это просто колонка которая идёт за контентом. По сути контент поисковик видит сразу, и сайт более СЕО-дружен ;)
Разработка сайтов это та сфера, в которой необходимо постоянно следить за новинками. Необходимо всегда быть на гребне волны. Смена технологий происходит очень быстро и то, что популярно сейчас будет устаревшим через несколько лет.
Одна из таких новейших технологий - это HTML5 - новая версия базового языка для создания сайтов.
Сегодня мы создадим HTML5 шаблон для сайта используя новые возможности CSS3 и jQuery. Также при создании мы используем плагин scrollTo.
От начала и до конца. В этой заметке я объясню как кроссбраузерно сделать position:fixed с помощью CSS и избавится от подергивания блока при прокрутке в ИЕ.
Сразу скажу - за все время, проведенное в сети, я заметил, что блоки с фиксированным положением на странице (не зависящим от скролла), довольно мало используются. Нет, разумное использование таких элементов на сайте не осуждается общественностью. Скорее дело в другом - фиксированные блоки неизбежно привлекают внимание посетителя при прокрутке страницы. Он отвлекается от своей цели - и, как правило, немного раздражается.
Ситуация усугубляется тем, что блоки с фиксированным позиционированием часто используются для рекламы - по определению яркой и бросающейся в глаза. Ну и если посмотреть in general, если я двигаю скролл - по законам природы, всё на странице должно скроллиться.
Ясно, что описываемую возможность нужно использовать ненавязчиво, и более того, три раза подумав. Ну да ладно - хватит о короле, давай о тебе: