Как сделать треугольник CSS с гладкими краями?

У меня есть треугольник (JSFiddle), использующий этот CSS:

.triangle {
    width: 0;
    height: 0;
    border-top: 0;
    border-bottom: 30px solid #666699;
    border-left: 20px solid transparent; 
    border-right: 20px solid transparent;
    }

И этот HTML:

<div class="triangle"></div>

Получается треугольник, но диагональные линии неровные и пиксельные. Как сделать их гладкими? (Я смог сгладить их в Safari и Chrome, сделав их пунктирными, но это сломало треугольники в Firefox и IE.)


person kirkaracha    schedule 12.09.2011    source источник
comment
В данный момент я использую FF6, и здесь все красиво и гладко (со сглаживанием). IE везде очень плохо отображает вещи, так что это меня не удивляет. Какую версию ФФ вы используете?   -  person Bojangles    schedule 13.09.2011
comment
Странно, FF6 и Chrome 13 отображают его с гладкими краями, а IE8 и Safari 5.1 отображают неровные края. ОС=Win XP SP3.   -  person fvu    schedule 13.09.2011
comment
Firefox 6.0.2 и Chrome 13 (OS X), IE8 (Windows XP) для меня неровны. (Эмуляция Windows в Parallels.)   -  person kirkaracha    schedule 13.09.2011
comment
Я думаю, что этот вопрос устарел - углы по умолчанию сглаживаются в webkit, а «точечный» исправляет это в Firefox jsbin.com/opusan/1/edit (и билет в Firefox bugzilla.mozilla.org/show_bug.cgi?id=805393)   -  person JaffaTheCake    schedule 25.10.2012


Ответы (8)


Даже в чистом CSS мы можем получить ровные диагонали.

.triangle {
    width: 0;
    height: 0;
    border-top: 0;
    border-bottom: 30px solid #666699;
    border-left: 20px solid rgba(255, 255, 255, 0); 
    border-right: 20px solid rgba(255, 255, 255, 0);
}

Вместо прозрачности вы можете использовать rgba (255, 255, 255, 0). Это снова дает прозрачность. Но альфа=0 делает диагонали гладкими.

Проверьте поддержку браузером rgba css-tricks.com/rgba-browser-support.

Спасибо

person iamjustcoder    schedule 03.02.2012
comment
rgba удалит эти надоедливые лишние границы, которые Firefox, кажется, тоже ставит в наши дни. - person Jason Lewis; 18.06.2012
comment
Сейчас Firefox 36, и у меня все еще есть пиксельные края, даже с этим кодом. Но это всегда неравносторонние треугольники, а не равные. - person TheCarver; 03.03.2015
comment
Я добавляю следующее, чтобы сгладить края неравных треугольников: -moz-transform: scale(.9999);. - person TheCarver; 03.03.2015
comment
Следует пометить ответ о -moz-transform: scale(.9999) как правильный ответ, вот что работает - person Joe's Ideas; 12.03.2015

Для Firefox вы можете добавить -moz-transform: scale(.9999); сделать ровные края. В твоем случае:

.triangle {
    width: 0;
    height: 0;
    border-top: 0;
    border-bottom: 30px solid #666699;
    border-left: 20px solid transparent; 
    border-right: 20px solid transparent;
    -moz-transform: scale(.9999);
}

Будет делать свое дело.

person Caner Şahin    schedule 10.01.2014
comment
Великолепно! Спас мой день! - person Nicolae Olariu; 01.08.2014
comment
Это работает, но на моем компьютере линии выглядят слишком гладкими, то есть немного размытыми по сравнению с методом rotate(0.01deg) - person Erin Drummond; 28.09.2014
comment
@ErinDrummond, какой браузер и версию вы пробовали? Мой ответ будет работать только с Firefox, хотя, как я и предполагал. Я проверил поворот (0.01) с помощью Firefox (32.0.3) для Mac, и это не дало мне плавной линии. - person Caner Şahin; 29.09.2014
comment
@CanerŞahin Я использовал Firefox 32.something в Linux (Fedora 20). Проблема зазубренных краев у меня вообще не возникает в Firefox для Mac (32.0.3), никаких обходных путей не требуется. - person Erin Drummond; 29.09.2014
comment
У Firefox нет проблем, у Chrome есть. - person vsync; 16.12.2014
comment
Что касается меня на FF36, я все еще получаю шероховатости. Использование -moz-transform: scale(.9999); действительно работает для меня. - person TheCarver; 03.03.2015
comment
Я копал это для Chrome (41.0.2272.118 m говорит about). Диагональные линии (от границ) были зубчатыми, масштабирование и поворот делают свое дело, но верно, что поворот дает лучший результат - четкие, не размытые и незубчатые линии. - person Max Yari; 12.04.2015

Я только что наткнулся на ту же проблему и понял этот трюк (по крайней мере, он работает на Mac):

-webkit-transform: rotate(0.05deg);
-moz-transform: scale(1.1);
-o-transform: rotate(0.05deg); /* Didn't check Opera yet */
transform: rotate(0.05deg);
person unclenorton    schedule 30.03.2012
comment
Я добавил только -webkit-transform: rotate(0.01deg); в свой CSS, и это отлично работает как для Webkit на Windows, так и на Mac (Chrome на Win, Safari на OSX). Другие браузеры (по крайней мере, на Windows) показывают идеально сглаженный треугольник, кроме Opera. Этого еще не исправил... - person trizz; 01.08.2012
comment
Я бы предложил сделать поворот на 360 градусов, чтобы треугольник находился в том же положении transform: rotate(360deg); - person JohnC; 01.10.2012
comment
Выполнение поворота (360 градусов), предложенное @JohnC, не работает именно потому, что он помещает треугольник в то же положение - поворот на 0,01 градуса смещает его достаточно немного, чтобы применить сглаживание, но недостаточно, чтобы человек мог сказать, что он был повернут. - person Erin Drummond; 28.09.2014
comment
Моя проблема была с Chrome (40) Firefox был в порядке, это исправление помогло мне, и хорошее предложение использовать 360 градусов, спасибо всем - person Gurnard; 12.03.2015

Использование стиля границы inset для прозрачных границ дает гораздо лучшие результаты в Firefox:

border-top: 22px solid $pink;
border-right: 84px inset transparent;
border-left: 84px inset transparent;
person kcmr    schedule 29.05.2014

Что действительно помогло мне, когда я впервые наткнулся на это, так это масштабирование однородного треугольника на определенную величину. Firefox кажется особенно «резким» с разносторонними треугольниками. Интересно, что идеальные треугольники визуализируются без зазубренных краев. Если в вашем проекте возможны преобразования CSS, просто попробуйте:

.triangle {
  width: 0;
  height: 0;
  border-top: 0;
  border-bottom: 20px solid #666699;
  border-left: 20px solid transparent; 
  border-right: 20px solid transparent;
  -moz-transform: scaleY(1.5); // optional: replace with Sass/SCSS/LESS mixin
  -moz-transform-origin: top; // optional: replace with mixin, too
}

Это исправило алиасинг по краю для меня. JSFiddle здесь (сейчас только Mozilla). Надеюсь это поможет!

person Sascha Michael Trinkaus    schedule 29.07.2013

Очень хакерский способ - использовать повернутый div

Здесь я использовал два элемента div, чтобы показать треугольник:

<div class="triangle">
    <div class="rot"></div>
</div>

и повернул внутренний div для двух неправильных сторон треугольника:

.triangle{
    position:relative;
    width:100px;
    height:60px;
    border-bottom:1px solid black;
    border-radius:12px;
}
.rot{
    border-radius:10px;
    border-left: 1px solid black;
border-top: 1px solid black;
width:70px; height:70px;
    -webkit-transform:rotate(45deg);
    position:absolute;
    left:15px;
    top:23px;
}

Я не пытался найти связь между числами.

Вот скрипка кода:

http://jsfiddle.net/mohsen/HTMcF/

НО я настоятельно рекомендую вам использовать элемент canvas по этой причине.

person Mohsen    schedule 12.09.2011
comment
IE8 никогда не будет поддерживать canvas изначально, для этого вам придется использовать IE9. - person robertc; 13.09.2011

Для меня использование dashed для прозрачных границ работало для большинства браузеров, которые не сглаживали их автоматически, а поворот на 360 градусов работал для старого Webkit:

.triangle {
    width: 0;
    height: 0;
    border-top: 0;
    border-bottom: 30px solid #666699;
    border-left: 20px dashed transparent; 
    border-right: 20px dashed transparent;
    -webkit-transform: rotate(360deg);
}
person tobymackenzie    schedule 23.06.2015

Ни один из других не работал у меня, но я обнаружил следующее (случайно):

.triangle {
  border: 1.3rem dashed #666699;
  border-right: .5rem solid rgba(255, 255, 255, 0);
}

Сочетание пунктирного/сплошного и исправления rgba работало в FF31, IE11 и Chrome36.

person Don    schedule 20.08.2014