Как сделать половину круга css
Перейти к содержимому

Как сделать половину круга css

  • автор:

Как нарисовать полукруг на CSS

Полукруг получается если у прямоугольника, у которого одна сторона в два раза больше другой, закруглить углы [см. генератор]. С помощью padding в процентах можно добиться пропорционального изменения высоты и ширины «резинового» блока.

Слово1 да слово2 да слово3 да слово4

  
текст

Слово1 да слово2 да слово3 да слово4

  
текст
  
  
  
  

clip-path : отсечь лишний фрагмент HTML-элемента

Свойство clip-path вырезает из элемента часть:

Слово1 да слово2 да слово3 да слово4

  
текст

Слово1 да слово2 да слово3 да слово4

  
текст

С помощью shape-inside

Свойство shape-inside позволяет вписать текст в окружность, даже без самой окружности, но пока не поддерживается браузерами.

текст текст текст текст текст текст текст текст текст текст

  
текст
  • Круг на CSS
  • Треугольник на CSS

Border css на половину круга

Ребят,как сделать чтобы было из этого:Эллипс Получить при наведении это:Эллипс:hover Не переворачивая объект типа: transform: rotate(45deg);

Отслеживать
задан 4 дек 2018 в 17:41
111 8 8 бронзовых знаков
Посмотрите здесь developer.mozilla.org/en-US/docs/Web/CSS/border-top-left-radius
4 дек 2018 в 18:01

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

.circle < width: 100px; height: 100px; border-radius: 50%; position: relative; background: #333; >.circle-out < width: 98px; height: 98px; left: 1px; top: 1px; border-radius: 50%; position: absolute; background: #fff; >.circle:hover

Отслеживать
ответ дан 4 дек 2018 в 18:04
1,585 7 7 серебряных знаков 10 10 бронзовых знаков
Хороший ответ (+) Просто и надёжно
4 дек 2018 в 20:55

  • html
  • css
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как создать полукруглую диаграмму с помощью CSS

Несмотря на то, что использование HTML 5 Canvas и SVG может оказаться более элегантным решением, в этом уроке мы узнаем, как создать полукруглую диаграмму на чистом CSS.

Чтобы понять, что мы собираемся создать, взгляните на готовое демо на CodePen:

HTML разметка

Начнем с простой разметки; чистый неупорядоченный список с элементом span в каждом из элементов списка:

 class="chart-skills"> 
 HTML 
 Python 

Добавляем стили списку

С готовой разметкой приступаем к приданию парочки простых стилей нашему списку:

.chart-skills  
position: relative; 
width: 350px; 
height: 175px; 

Затем, каждому из элементов списка мы дадим по ::after и ::before псевдо-элементу, а затем дадим им стили:

.chart-skills::before, 
.chart-skills::after  
position: absolute; 
.chart-skills::before  
content: ''; 
width: inherit; 
height: inherit; 
border: 45px solid rgba(211,211,211,.3); 
border-bottom: none; 
border-top-left-radius: 175px; 
border-top-right-radius: 175px; 
.chart-skills::after  
content: 'Top Skills'; 
left: 50%; 
bottom: 10px; 
transform: translateX(-50%); 
font-size: 1.1rem; 
font-weight: bold; 
color: cadetblue; 

Обратите внимание на стили для псевдо-элемента ::before . Это даст нам наш полукруг.

pseudo elements

Итак, вышеупомянутые правила дадут нам следующий результат:

Добавляем стили элементам списка

Давайте обсудим стили для элементов списка.

Позиционирование

Не забывая про позиционирование элементов списка, сделаем следующее:

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

Далее следует упомянуть еще пару вещей:

  • Элементы списка имеют position:absolute, так мы можем выставить их z-index правильным образом.
  • Мы изменим изначальное значение transform-origin (например, transform-origin: 50% 50% ) элементов списка. В особенности, установим transform-origin: 50% 0 . В этом случае, когда мы начнем поворачивать предметы, их центральный верхний угол окажется точкой, вокруг которой будет происходить вращение.

Вот необходимые стили CSS:

.chart-skills li  
position: absolute; 
top: 100%; 
left: 0; 
width: inherit; 
height: inherit; 
border: 45px solid; 
border-top: none; 
border-bottom-left-radius: 175px; 
border-bottom-right-radius: 175px; 
transform-origin: 50% 0; 
.chart-skills li:nth-child(1)  
z-index: 4; 
border-color: green; 
.chart-skills li:nth-child(2)  
z-index: 3; 
border-color: firebrick; 
.chart-skills li:nth-child(3)  
z-index: 2; 
border-color: steelblue; 
.chart-skills li:nth-child(4)  
z-index: 1; 
border-color: orange; 

Посмотрите, что мы сделали, на следующей визуализации:

Сейчас виден только зеленый элемент меню ( z-index которого равен 4). Остальные находятся под ним.

Анимации

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

Язык Проценты
CSS 12
HTML 32
PHP 34
Python 22

Затем, мы посчитаем, на сколько градусов нам нужно будет анимировать (повернуть) каждый из наших элементов. Чтобы узнать точное число для каждого элемента, умножим его процентное число на 180° (не 360° потому что у нас полукруг):

Язык Проценты Градус
CSS 12 12/100 * 180 = 21.6
HTML 32 32/100 * 180 = 57.6
PHP 34 34/100 * 180 = 61.2
Python 22 22/100 * 180 = 39.6

Теперь мы готовы настраивать анимацию. Сначала, определяем стиль анимации, который будет одинаковым у всех элементов, добавляя несколько значений к .chart-skills li :

animation-fill-mode: forwards; 
animation-duration: .4s; 
animation-timing-function: linear; 

Затем задаем уникальные значения стиля анимации:

.chart-skills li:nth-child(1)  
z-index: 4; 
border-color: green; 
animation-name: rotate-one; 
.chart-skills li:nth-child(2)  
z-index: 3; 
border-color: firebrick; 
animation-name: rotate-two; 
animation-delay: .4s; 
.chart-skills li:nth-child(3)  
z-index: 2; 
border-color: steelblue; 
animation-name: rotate-three; 
animation-delay: .8s; 
.chart-skills li:nth-child(4)  
z-index: 1; 
border-color: orange; 
animation-name: rotate-four; 
animation-delay: 1.2s; 

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

Вторым шагом зададим конкретно анимации:

@keyframes rotate-one  
transform: rotate(21.6deg); 
 * 12% => 21.6deg 
@keyframes rotate-two  
transform: rotate(21.6deg); 
transform: rotate(79.2deg); 
 * 32% => 57.6deg 
 * 57.6 + 21.6 => 79.2deg 
@keyframes rotate-three  
transform: rotate(79.2deg); 
transform: rotate(140.4deg); 
 * 34% => 61.2deg 
 * 61.2 + 79.2 => 140.4deg 
@keyframes rotate-four  
transform: rotate(140.4deg); 
transform: rotate(180deg); 
 * 22% => 39.6deg 
 * 140.4 + 39.6 => 180deg 

Прежде, чем двигаться дальше, посмотрим, как работают анимации:

Первый элемент идет от transform: none к transform: rotate(21.6deg) .

Второй от transform: rotate(21.6deg) (начинается с последней позиции первого элемента) к transform: rotate(79.2deg) (57.6deg + 21.6deg).

Третий от transform: rotate(79.2deg) (начинается с последней точки второго элемента) к transform: rotate(140.4deg) (61.2deg + 79.2deg).

Четвертый от transform: rotate(140.4deg) (начинается с последней позиции третьего элемента) к transform: rotate(180deg) (140.4deg + 39.6deg).

Прячьте!

Последнее, но не менее важное, это спрятать вторую половину диаграммы снизу, для этого добавим следующее:

.chart-skills  
/* existing rules. */ 
overflow: hidden; 
.chart-skills li  
/* existing rules. */ 
transform-style: preserve-3d; 
backface-visibility: hidden; 

overflow: hidden показывает нам, что видна только первая половина круга (та, что с ::before псевдо-элементом) Не стесняйтесь удалить это свойство, если вам интересно посмотреть на начальные позиции элементов списка.

transform-style: preserve-3d и backface-visibility: hidden предотвращают нежелательные дерганья анимаций в различных браузерах. Если проблема не решилась, попробуйте эти решения.

Почти готово! Осталось только задать стили названиям секций, чем мы займемся в следующем разделе.

Вот CodePen демо, показывающее нашу текущую диаграмму:

Задаем стили названиям секций

В этом разделе мы зададим стили названиям секций нашей диаграммы.

Позиционирование

В зависимости от их положения, делаем следующее:

  • Даем им position: absolute и используем top и left , чтобы задать желаемое положение.
  • Используем негативные значения, чтобы повернуть их. Конечно, значения не с потолка. На деле, они взяты из последнего куска родительского элемента. Например, последний момент второго элемента списка это transform: rotate(79.2deg) , а значит мы используем transform: rotate(-79.2deg).

Ниже представлен соответсвующий код CSS:

.chart-skills span  
position: absolute; 
font-size: .85rem; 
.chart-skills li:nth-child(1) span  
top: 5px; 
left: 10px; 
transform: rotate(-21.6deg); 
.chart-skills li:nth-child(2) span  
top: 20px; 
left: 10px; 
transform: rotate(-79.2deg); 
.chart-skills li:nth-child(3) span  
top: 18px; 
left: 10px; 
transform: rotate(-140.4deg); 
.chart-skills li:nth-child(4) span  
top: 10px; 
left: 10px; 
transform: rotate(-180deg); 

Анимации

Теперь, когда мы разместили наши названия, самое время задать им анимации. Стоит упомянуть две вещи:

  • По умолчанию, все названия спрятаны и появляются только когда начинается анимация их родительского элемента.
  • Потому мы также, как и в случае с их родительскими элементами, используем animation-delay , чтобы сделать последовательную анимацию. Также добавляем backface-visibility: hidden , чтобы убедиться в отсутствии дерганий в различных браузерах.

CSS код анимаций представлен ниже:

.chart-skills span  
backface-visibility: hidden; 
animation: fade-in .4s linear forwards; 
.chart-skills li:nth-child(2) span  
animation-delay: .4s; 
.chart-skills li:nth-child(3) span  
animation-delay: .8s; 
.chart-skills li:nth-child(4) span  
animation-delay: 1.2s; 
@keyframes fade-in  
opacity: 0; 
opacity: 1; 

Вот наш конечный результат:

Поддержка браузеров и возможные проблемы

В целом, демо отлично работает во всех браузерах. Хочу лишь обсудить две небольшие проблемы, связанные с border-radius .

Во-первых, если бы мы задали разные цвета нашим элементам, диаграмма могла бы выглядеть так:

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

Во-вторых, в Safari диаграмма появляется следующим образом:

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

Заключение

В этом уроке мы создали полукруглую диаграмму на чистом CSS. Вновь, как упоминалось во вступлении, есть более мощные решения (HTML5 Canvas и SVG) для создания вещей подобного рода. Однако, если вам нужно что-то простое и легкое, при этом с вызовом, тогда CSS идеально подойдет!

Круги в CSS

От автора: я постоянный эксперт Cloud Four по кругам. Я не планировал им быть. Некоторое время назад мы работали над проектом, в котором было много кругов: круглые контейнеры, круглые миниатюры, круглые кнопки. И сначала я стал парнем, с которым можно поговорить, если у вас возникли проблемы с кругами и CSS.

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

Создание кругов

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

border-radius

Самая распространенная техника — это скруглить все углы на 50%. Это самый простой способ, и он широко поддерживается. Свойство border-radius также будет влиять на обводки, тени и целевой размер касания / клика элемента.

Если вы хотите, чтобы круг растягивался до формы таблетки, установите для border-radius половину высоты элемента вместо 50%. Если высота неизвестна, выберите произвольно большое значение (например, 99em).

SVG

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

clip-path

Это новая техника. Ее поддержка вполне достойная, но менее последовательная. clip-path не влияет на макет элемента, что означает, что оно влияет на обводку и, скорее всего, будет скрывать внешние тени. Это может быть хорошо или плохо в зависимости от того, чего вы пытаетесь достичь.

Радиальный градиент

Мы можем использовать background-image и radial-gradient, чтобы визуально заполнить элемент кругом. Любой контент будет располагаться поверх этой фигуры, но его расположение (включая целевой размер касания / клика) не будет затронуто. Это мой наименее любимый метод, потому что края круга могут казаться неровными или нечеткими в зависимости от браузера, но это может хорошо подходить для тонких фоновых деталей.

Центрирование контента

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

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

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

По моему опыту, самый гибкий метод для центрирования — использовать комбинацию абсолютного позиционирования (чтобы установить центральную точку на основе расположения родительского элемента) и преобразования (чтобы поместить дочерний элемент с помощью относительных вычислений):

Обрезка содержимого

Центрирование это хорошо, но что, если мы хотим заполнить круг изображением?

С помощью HTML / CSS

Мы можем обрезать элемент img до круга, используя border-radius:

Это имеет некоторые ограничения:

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

Мы не можем применить какие-либо внутренние тени, чтобы как-то отделить изображение от фона (кроме как в самом изображении).

Мы используем object-fit: cover для предотвращения искажения неквадратных изображений, но это не поддерживается в IE11.

Вот более сложный пример. В нем используется элемент-оболочка, чтобы установить соотношения сторон блока для поддержания квадратных пропорций, в нем улучшается обработка неквадратных изображений с помощью @supports и применяется прозрачная внутренняя тень, чтобы отделить изображение от фона:

С помощью SVG

Мы можем сделать то же самое, используя SVG:

Но поскольку элементы SVG image не поддерживают srcset или sizes, это, вероятно, плохой выбор для шаблона эскизов изображений общего назначения.

Субпиксельные промежутки

Если вы наложите внутренние тени, границы или другие причудливые элементы поверх круглого содержимого, вы можете в конечном итоге заметить, что появляются некоторые субпиксельные артефакты:

Круги в CSS

Светлые пиксели вдоль края, где фон выходит за внутреннюю границу.

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

Обтекание текстом

Текст! Это основа Интернета. Он заполняет прямоугольники и разбивается на строки. Что мы можем сделать с этим?

Внешний текст

Вы можете задать обтекание текстом вокруг круглой фигуры, используя свойство shape-outside:

Внутренний текст

Стоп! Это, наверное, плохая идея! Сделать его адаптивным практически невозможно! Просто подождите, пока у нас не будет свойства shape-inside!

Точно? Хорошо, хорошо, у Джонатана Скита есть интеллектуальный хак. Он использует псевдо-элементы для установки shape-outside по обе стороны от текста:

Вдоль контура

Мы можем установить текст по изогнутому контуру с помощью SVG и :

К сожалению, поддерживается для не во всех браузерах, но преобразование в не слишком сложное.

Заключение!

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

Автор: Tyler Sticka

Редакция: Команда webformyself.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *