все о веб-программировании и веб-дизайне
Закругленные углы jQuery

В сегодняшней заметке мы научимся закруглять углы у элементов с обычными углами по средствам jQuery. Пример очень простой, поэтому легко подойдет для начинающих.
Нам понадобится всего одна картинка (вы можете ее увидеть справа отсюда)
для всех четырех углов. Идея заключается в следующем. Мы создаем блок DIV с определенным классом, который и будем закруглять вставляя туда 4 пустых DIV’а с разными классами (углами), абсолютно позиционируя каждый. Картинка для всех углов, как я и сказал, будет одна и та же. Эту технику легко можно применять и без jQuery, просто добавляя 4 DIV’а в блок, который хотим закруглить, но динамичное закругление углов выглядит намного приятнее и проще. Работающий пример вы можете просмотреть, проядя по ссылке: закругленные углы jQuery В конце заметки вас ждет полностью рабочий архив с полностью рабочим исходником =).
Первым делом создадим файл стилей CSS style.css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | html, * { padding: 0; margin: 0; } div.rndblock { margin: 20px; width: 200px; height: auto; background:none repeat scroll 0 0 white; color:#6D6D6D; position:relative; border:1px solid #E5E2E2; float: left; } .rndblock h2 { margin: 20px; text-decoration: underline; } .tl { background-position: top left; left: -1px; top: -1px; } .tr { background-position: top right; right: -1px !important; top: -1px; } .br { background-position: bottom right; bottom: -1px !important; right: -1px !important; } .bl { background-position: bottom left; bottom: -1px !important; left: -1px; } .tl, .tr, .bl, .br { background-image: url("../images/rndcorn.png"); position: absolute; height: 10px; width: 10px; overflow: hidden; } button { background-color: lime; border: dashed 1ps yellow; padding: 3px; margin: 5px; } .rndblock p { padding: 10px; } |
Теперь немного пояснений:
- строки 6-15 декорируют этот самый закругляемый блок, в 8й строке можно задать относительные единицы измерения, тогда блок будет «тянуться», 10я и 13я строки соответственно задают фон и границу
- 22-44 мы задаем позиции фонового изображения для углов и позиционируем их относительно основного блока
- 46-52 задаем общие для всех углов параметры: ведь картинка для углов у нас одна и та же и позиционирование для всех углов происходит абсолютное.
- остальные строки лишь декор остальных элементов на странице
Теперь непосредственно разметка и jQuery код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Вредный и его заметки: закругленные углы с помощью jQuery</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript"> $('docuemnt').ready(function() { var roundElements = '<div class="tl"></div>'; roundElements += '<div class="tr"></div>'; roundElements += '<div class="br"></div>'; roundElements += '<div class="bl"></div>'; $('button').click(function() { $(this).css('background', 'white').parent().append(roundElements); }); }); </script> <link rel="stylesheet" type="text/css" href="styles/style.css" /> </head> <body> <div class="rndblock"> <h2>Блок номер 1</h2> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <button>Round this corners</button> </div> <div class="rndblock"> <h2>Блок номер 2</h2> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <button>Round this corners</button> </div> <div class="rndblock"> <h2>Блок номер 3</h2> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum nisl nec ipsum vehicula hendrerit. </p> <button>Round this corners</button> </div> </body> </html> |
- В 6 строке мы подключаем jQuery через Google
- строки 9-12 создают переменную с 4 DIV’ами, которые и являются углами, которые мы и будем добавлять к блоку, который хотим закруглить
- 13-15 добавляем углы к блоку после нажатия на кнопку, чтобы успеть заметить разницу.
- 21-26, как видите в этих строках нет ни одного упоминания о углах, просто блок с абзацем, заголовком и кнопкой
Работающий исходник: здесь
Если убрать закругление углов по нажатию на кнопку и делать это при загрузке на страницу, то будет очень легко закруглять углы, не усложняя код. Единственный минус этого метода: люди с отключенным JavaScript не увидят наших стараний, хоть их и немного, но их тоже надо учитывать.
| This entry was posted by Вредный on 05.03.2010 at 12:34, and is filed under CSS & HTML, jQuery, программирование. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |
2 месяца назад
Самое обидное, что некоторые браузеры уже поддерживают CSS-свойства border-radius (оно ту же задачу выполняет), а jQuery такие свойства просто игнорит. Самому в код библиотеки влезать не хочется, но было бы полезно сделать такой для него такой плагин, разпознающий браузер и выбирающий в зависимости от это этого требуемый способ.
Еще есть одна такая проблема: прозрачность. jQuery не дает использовать формат rgba( red, green, blue, opacity ). Некоторые браузеры его поддерживают. Некоторые не поддерживают, но поддерживают свойство opacity. IE поддерживает фильтр alpha. Если бы с этим плагином сделать так, чтобы при отсутствии поддержки rgba, делался такой трюк: в прозрачный контейнер встраивается непрозрачный подконтейнер, окружающий текст, который часто не должен быть прозрачным, для лучшего вида и читабельности (так же как и 4 элемента DIV встраиваются) или же применяя непрозрачность ко всем потомкам контейнера. Проблема только, что с alpha-фильтром это не прокатит.