Создание закругленных углов с помощью CSS

Как создать закругленные углы с помощью CSS?

Вот хорошее видео о том, как сделать закругленные углы, используя только CSS: sampsonvideos.com/video.php?video=12>

Stan 10.08.2008 12:16

200+ лайков говорят, что это конструктивно.

SteveCav 22.04.2015 09:53

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

DavidRR 18.05.2015 21:51

За исключением того, что эту информацию можно легко найти во многих-многих других местах в Интернете. SO нет необходимости дублировать существующие ресурсы.

Jim Garrison 04.06.2015 08:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
256
5
69 841
21
Перейти к ответу Данный вопрос помечен как решенный

Ответы 21

Ответ принят как подходящий

С момента появления CSS3 лучший способ добавить закругленные углы с помощью CSS - использовать свойство border-radius. Вы можете прочитать спецификацию в собственности или получить полезная информация о реализации на MDN:

Если вы используете браузер с невоплощать в жизньborder-radius (Chrome pre-v4, Firefox pre-v4, IE8, Opera pre-v10.5, Safari pre-v5), то ссылки ниже подробно описывают целый ряд различных подходов. Найдите тот, который подходит вашему сайту и стилю кодирования, и следуйте ему.

  1. CSS-дизайн: создание нестандартных углов & Границы
  2. CSS закругленные углы 'Roundup'
  3. 25 приемов закругленных углов с помощью CSS

Я считаю DD_roundies идеальным решением: dillerdesign.com/experiment/DD_roundies/#nogo

vsync 31.07.2009 23:00

@vsync, но он плохо поддерживается в IE8 dillerdesign.com/experiment/DD_roundies/#supported_browsers

Jitendra Vyas 26.12.2009 08:41

полезная ссылка, если вы решите использовать CSS3 (например, SO) border-radius.com (другой исх. css3.info/border-radius-apple-vs-mozilla)

mickthompson 18.06.2010 12:35

третья ссылка не работает cssjuice.com/25-ounded-corners-techniques-with-css

Krishna 01.09.2011 16:08

Я посмотрел на это на раннем этапе создания Stack Overflow и не смог найти метод любой для создания закругленных углов, который не оставлял мне ощущения, будто я только что прошел через канализацию.

CSS3 наконец-то определяет

border-radius:

Именно так вы и хотели бы, чтобы это работало. Хотя это нормально работает в последних версиях Safari и Firefox, но совсем не работает в IE7 (и я не думаю, что в IE8) или Opera.

А пока это хаки до конца. Мне интересно услышать, что другие люди считают самым чистым способом сделать это в IE7, FF2 / 3, Safari3 и Opera 9.5 на данный момент ..

"... прошел через канализацию?" Это немного сурово, Джефф. Ответ: «Это зависит от обстоятельств». Одноцветные, градиентные или падающие тени? Нужно ли им расширяться по вертикали, горизонтали или по обоим направлениям? Разные решения для разных требований. Чем красивее требование, тем более канализационное решение.

Carl Camera 19.09.2008 00:32

Я бы предпочел использовать этот метод. Если браузер не поддерживает это, кого это волнует?

Sam Murray-Sutton 26.09.2008 13:21

Twitter снижает функцию закругленных углов до заостренных углов на своем веб-сайте для пользователей IE. На самом деле ничего страшного.

Lance Fisher 09.12.2008 09:56

Я бы определенно использовал этот подход - давайте разбираться с вещами, как есть. Если кто-то не использует браузер (например, IE), он заслуживает того, чтобы закругленные углы считались угловатыми. :)

thSoft 22.04.2010 00:58

Я хочу проголосовать за этот ответ, потому что он не описывает то, что отвечающий (Джефф) считает лучшим способом.

allyourcode 08.06.2010 03:58

CSS3 подходит для большинства ситуаций, если вы не против возврата к квадратным углам в старых браузерах. Но иногда требования графического дизайна к тому, как должны выглядеть закругленные углы, выходят за рамки того, что вы можете сделать с border-radius. Для таких случаев я рекомендую такой подход: github.com/stubbornella/oocss/wiki/Module. Единственное, что мне не нравится в связанном примере, так это использование тега <b> ... Я думаю, что тег <span> был бы более подходящим.

Matt Browne 26.02.2013 07:22

Я бы рекомендовал использовать фоновые изображения. Остальные способы не так хороши: без сглаживания и бессмысленной разметки. Здесь не место для использования JavaScript.

javascript определенно имеет наибольшую вероятность сбоев и мерцает, по моему опыту. все плагины jquery, которые я пробовал, имеют какие-то неожиданные побочные эффекты

Simon_Weaver 09.07.2009 03:45

CurvyCorners (curvycorners.net) и ShadedBorder (ruzee.com/blog/shadedborder) делать могут поддерживать сглаживание. Существуют также способы использования этой разметки без дополнительной разметки, которые можно реализовать с помощью класса, а затем разметка динамически добавляется к классифицированным элементам. Тем не менее, чем больше я их использую, тем больше вы кажетесь правым ... они полезны для прототипирования, но добавляют много веса DOM. Теперь, когда мои настройки настроены так, как я хочу, я планирую преобразовать их в изображения.

Ben Regenspan 04.12.2009 16:59

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

allyourcode 08.06.2010 04:00

Всегда есть способ JavaScript (см. Другие ответы), но поскольку это чисто стилизация, я как бы против использования клиентских скриптов для достижения этого.

Я предпочитаю (хотя у него есть свои ограничения) использовать 4 изображения с закругленными углами, которые вы разместите в 4-х углах вашего поля с помощью CSS:

<div class = "Rounded">
  <!-- content -->
  <div class = "RoundedCorner RoundedCorner-TopLeft"></div>
  <div class = "RoundedCorner RoundedCorner-TopRight"></div>
  <div class = "RoundedCorner RoundedCorner-BottomRight"></div>
  <div class = "RoundedCorner RoundedCorner-BottomLeft"></div>
</div>

/********************************
* Rounded styling
********************************/

.Rounded {
  position: relative;
}

.Rounded .RoundedCorner {
  position: absolute;
  background-image: url('SpriteSheet.png');
  background-repeat: no-repeat;
  overflow: hidden;

  /* Size of the rounded corner images */
  height: 5px;
  width: 5px;
}

.Rounded .RoundedCorner-TopLeft {
  top: 0;
  left: 0;

  /* No background position change (or maybe depending on your sprite sheet) */
}

.Rounded .RoundedCorner-TopRight {
  top: 0;
  right: 0;

  /* Move the sprite sheet to show the appropriate image */
  background-position: -5px 0;
}

/* Hack for IE6 */
* html .Rounded .RoundedCorner-TopRight {
  right: -1px;
}

.Rounded .RoundedCorner-BottomLeft {
  bottom: 0;
  left: 0;

  /* Move the sprite sheet to show the appropriate image */
  background-position: 0 -5px;
}

/* Hack for IE6 */
* html .Rounded .RoundedCorner-BottomLeft {
  bottom: -20px;
}

.Rounded .RoundedCorner-BottomRight {
  bottom: 0;
  right: 0;

  /* Move the sprite sheet to show the appropriate image */
  background-position: -5px -5px;
}

/* Hack for IE6 */
* html .Rounded .RoundedCorner-BottomRight {
  bottom: -20px;
  right: -1px;
}

Как уже упоминалось, у него есть свои ограничения (фон за закругленным прямоугольником должен быть простым, иначе углы не будут совпадать с фоном), но он очень хорошо работает для всего остального.


Обновлено: Улучшена реализация с помощью листа спрайтов.

Все это можно упростить с помощью CSS-спрайтов, может, я обновлю свой ответ.

mbillard 11.08.2009 01:09

Там я обновил код, чтобы использовать лист спрайтов.

mbillard 12.08.2009 19:54

jQuery - это то, как я лично с этим справлюсь. Поддержка css минимальна, изображения слишком неудобны, чтобы иметь возможность выбирать элементы, которые вы хотите иметь закругленные углы в jQuery, для меня имеет смысл, хотя некоторые, без сомнения, будут утверждать обратное. Вот плагин, который я недавно использовал для проекта в работе: http://web.archive.org/web/20111120191231/http://plugins.jquery.com:80/project/jquery-roundcorners-canvas

@mcaulay - Поддерживает ли он также создание тени для коробки?

nickytonline 03.12.2009 17:23

jquery roundcorners не поддерживает IE 8.

evanmcd 30.12.2010 01:07

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

<div class = "item_with_border">
    <div class = "border_top_left"></div>
    <div class = "border_top_right"></div>
    <div class = "border_bottom_left"></div>
    <div class = "border_bottom_right"></div>
    This is the text that is displayed
</div>

<style>
    div.item_with_border
    {
        border: 1px solid #FFF;
        postion: relative;
    }
    div.item_with_border > div.border_top_left
    {
        background-image: url(topleft.png);
        position: absolute;
        top: -1px;
        left: -1px;     
        width: 30px;
        height: 30px;
        z-index: 2;
    }
    div.item_with_border > div.border_top_right
    {
        background-image: url(topright.png);
        position: absolute;
        top: -1px;
        right: -1px;        
        width: 30px;
        height: 30px;
        z-index: 2;
    }
    div.item_with_border > div.border_bottom_left
    {
        background-image: url(bottomleft.png);
        position: absolute;
        bottom: -1px;
        left: -1px;     
        width: 30px;
        height: 30px;
        z-index: 2;
    }
    div.item_with_border > div.border_bottom_right
    {
        background-image: url(bottomright.png);
        position: absolute;
        bottom: -1px;
        right: -1px;        
        width: 30px;
        height: 30px;
        z-index: 2;
    }   
</style>

Работает неплохо. Не нужен Javascript, только CSS и HTML. С минимальным вмешательством HTML в другие вещи. Это очень похоже на то, что опубликовал Mono, но не содержит каких-либо конкретных хаков для IE 6, и после проверки, похоже, вообще не работает. Еще одна хитрость - сделать прозрачной внутреннюю часть каждого углового изображения, чтобы не блокировать текст рядом с углом. Внешняя часть не должна быть прозрачной, чтобы закрывать границу незакругленного элемента div.

Кроме того, как только CSS3 получит широкую поддержку с помощью border-radius, это станет официальным лучшим способом создания закругленных углов.

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

Мое решение - диктовать дизайнеру, что если они хотят использовать закругленные углы (на данный момент), это должна быть фиксированная ширина. Дизайнеры любят закругленные углы (я тоже), поэтому я считаю это разумным компромиссом.

Ruzee Borders - единственное решение с закругленными углами на основе Javascript, которое я обнаружил, которое работает во всех основных браузерах (Firefox 2/3, Chrome, Safari 3, IE6 / 7/8), и ТАКЖЕ единственное, которое работает, когда оба закругленный элемент И родительский элемент содержат фоновое изображение. Он также делает границы, тени и свечение.

Новый вариант RUZEE.ShadedBorder - еще один вариант, но в нем отсутствует поддержка получения информации о стиле из CSS.

Вот решение HTML / js / css, которое я сделал недавно. При абсолютном позиционировании в IE существует ошибка округления в 1 пиксель, поэтому вы хотите, чтобы контейнер был четным числом пикселей в ширину, но он довольно чистый.

HTML:

<div class = "s">Content</div>

jQuery:

$("div.s")
.wrapInner("<div class='s-iwrap'><div class='s-iwrap2'>")
.prepend('<div class = "tr"/><div class = "tl"/><div class = "br"/><div class = "bl"/>');

CSS:

/*rounded corner orange box - no title*/
.s {
    position: relative;
    margin: 0 auto 15px;
    zoom: 1;
}

.s-iwrap {
    border: 1px solid #FF9933;
}

.s-iwrap2 {
    margin: 12px;
}

.s .br,.s .bl, .s .tl, .s .tr {
    background: url(css/images/orange_corners_sprite.png) no-repeat;
    line-height: 1px;
    font-size: 1px;
    width: 9px;
    height: 9px;
    position: absolute;
}

.s .br {
    bottom: 0;
    right: 0;
    background-position: bottom right;
}

.s .bl {
    bottom: 0;
    left: 0;
    background-position: bottom left;
}

.s .tl {
    top: 0;
    left: 0;
    background-position: top left;
}

.s .tr {
    top: 0;
    right: 0;
    background-position: top right;
}

Изображение имеет ширину всего 18 пикселей и все 4 угла упакованы вместе. Похоже на круг.

Примечание: вам не нужна вторая внутренняя оболочка, но мне нравится использовать маржу на внутренней оболочке, чтобы поля в абзацах и заголовках сохраняли сжатие полей. Вы также можете пропустить jquery и просто поместить внутреннюю оболочку в html.

Поскольку поддержка CSS3 реализована в новых версиях Firefox, Safari и Chrome, также будет полезно посмотреть на «Радиус границы».

-moz-border-radius: 10px;  
-webkit-border-radius: 10px;  
border-radius: 10px;

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

-moz-border-radius-topleft: 10px;  
-moz-border-radius-topright: 7px;  
-moz-border-radius-bottomleft: 5px;  
-moz-border-radius-bottomright: 3px;  
-webkit-border-top-right-radius: 10px;  
-webkit-border-top-left-radius: 7px;  
-webkit-border-bottom-left-radius: 5px;  
-webkit-border-bottom-right-radius: 3px;

Ваш синтаксис для -webkit-border-bottom-rightright-radius: 3px; и -webkit-border-top-rightright-radius: 10px; следует читать -webkit-border-bottom-right-radius: 3px и -webkit-border-top-right-radius: 10px;

Wolfr 03.05.2009 14:10

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

Если ваш дизайн может выжить без них, это самое простое решение.

Я хочу найти ту часть страницы YUI, о которой вы говорите, но ни один из пунктов, которые я просмотрел, не говорит о том, что пытаться скруглить углы - плохая идея. Можете быть более конкретными? Я нашел одну часть, в которой говорится о том, как по-разному устанавливать ширину при использовании закругленных углов, но это не мешает.

allyourcode 08.06.2010 06:03

@allyourcode - я его тоже больше не вижу. Я помню, как делал этот пост, но не совсем то, что они сказали. однако похоже, что во второй ссылке выше упоминается об удалении поддержки IE для закругленных углов размером 1 пиксель. но в любом случае этот пост был немного иронией, так как они говорят только об углах размером 1 пиксель, что я считаю огромной тратой времени! Я действительно помню, что в то время, когда я писал это, я был разочарован закругленными углами и остановился на угловых изображениях

Simon_Weaver 09.06.2010 06:22

Как сказал Браджешвар: Использование селектора border-radius css3. К настоящему времени вы можете применять -moz-border-radius и -webkit-border-radius для браузеров на основе Mozilla и Webkit соответственно.

Итак, что происходит с Internet Explorer ?. У Microsoft есть много способов сделать Internet Explorer дополнительными функциями и получить больше навыков.

Здесь: файл поведения .htc для получения round-corners из значения border-radius в вашем CSS. Например.

div.box {
    background-color: yellow; 
    border: 1px solid red; 
    border-radius: 5px; 
    behavior: url(corners.htc);
}

Конечно, селектор поведения не является допустимым селектором, но вы можете поместить его в другой файл css с условными комментариями (только для IE).

поведение файла HTC

никогда не понимал, почему так много людей озабочены проверкой CSS. это не имеет значения, имеет значение только проверка DOM.

vsync 31.07.2009 23:04

Похоже, это правильный путь.

Matthew Olenik 20.02.2010 09:33

Можете ли вы добавить краткое объяснение того, что такое файл поведения? Я думаю, что человек, ищущий ответ на этот вопрос, вероятно, не будет знаком с ними.

allyourcode 08.06.2010 04:03

Кажется, ссылка на файл поведения мертва

evanmcd 30.12.2010 01:04

В Safari, Chrome, Firefox> 2, IE> 8 и Konquerer (и, возможно, в других) вы можете сделать это в CSS, используя свойство border-radius. Поскольку это еще не официально часть спецификации, пожалуйста, используйте префикс производителя ...

Пример

#round-my-corners-please {
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    border-radius: 20px;
}

Решения JavaScript обычно добавляют кучу небольших div, чтобы он выглядел закругленным, или используют границы и отрицательные поля, чтобы сделать углы с надрезом в 1 пиксель. Некоторые также могут использовать SVG в IE.

IMO, способ CSS лучше, поскольку он прост и будет постепенно ухудшаться в браузерах, которые его не поддерживают. Это, конечно, только в том случае, когда клиент не применяет их в неподдерживаемых браузерах, таких как IE.

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

Если вы хотите использовать все углы с одинаковым радиусом, это простой способ:

.my_rounded_corners{
   -webkit-border-radius: 5px;
           border-radius: 5px;
}

но если вы хотите контролировать каждый угол, это хорошо:

.my_rounded_corners{
    border: 1px solid #ccc;

    /* each value for each corner clockwise starting from top left */
    -webkit-border-radius: 10px 3px 0 20px;
            border-radius: 10px 3px 0 20px;
}

Как вы видите, в каждом наборе у вас есть стили, специфичные для браузера, а в четвертых строках мы объявляем стандартным образом, поэтому мы предполагаем, что в будущем другие (надеюсь, IE тоже) решат реализовать эту функцию, чтобы наш стиль был готов и для них.

Как сказано в других ответах, это прекрасно работает в Firefox, Safari, Camino, Chrome.

Не используйте CSS, jQuery упоминался несколько раз. Если вам нужен полный контроль над фоном и рамкой ваших элементов, попробуйте theПлагин jQuery Background Canvas. Он помещает элемент холста HTML5 на задний план и позволяет рисовать любой фон или границу, которую вы хотите. Закругленные углы, градиенты и так далее.

Opera пока не поддерживает border-radius (видимо, будет в релизе после версии 10). А пока можно используйте CSS, чтобы установить фон SVG, чтобы создать аналогичный эффект.

Мне лично больше всего нравится это решение, это .htc, позволяющий IE отображать изогнутые границы.

http://www.htmlremix.com/css/curved-corner-border-radius-cross-browser

Не существует «лучшего» пути; есть способы, которые работают для вас, и способы, которые нет. Сказав это, я разместил здесь статью о создании техники плавного закругления углов на основе CSS + Image:

Коробка с круглыми углами с использованием CSS и изображений - Часть 2

Обзор этого трюка заключается в том, что он использует вложенные DIV и повторение и позиционирование фонового изображения. Для макетов с фиксированной шириной (фиксированной шириной и растягиваемой высотой) вам понадобятся три DIV и три изображения. Для макета с изменяемой шириной (растягиваемая ширина и высота) вам понадобятся девять DIV и девять изображений. Некоторые могут посчитать это слишком сложным, но ИМХО это лучшее решение на свете. Никаких хаков, никакого JavaScript.

Если вы хотите использовать решение border-radius, есть этот замечательный веб-сайт для создания CSS, который заставит его работать для safari / chrome / FF.

В любом случае, я думаю, что ваш дизайн не должен зависеть от закругленных углов, и если вы посмотрите на Twitter, они просто скажут F **** пользователям IE и Opera. Приятно иметь закругленные углы, и я лично могу оставить это для крутых пользователей, которые не используют IE :).

Конечно, это не мнение клиентов. Вот ссылка: http://border-radius.com/

Если вы заинтересованы в создании углов в IE, это может быть полезно - http://css3pie.com/

это полностью сработало для меня, наряду с определением углов -moz и т.д. и т.д. для других браузеров.

bharal 26.01.2012 19:34

В дополнение к упомянутым выше решениям htc, вот другие решения и примеры для достижения закругленные углы в IE.

Другие вопросы по теме