Страницы

Поиск по вопросам

Показаны сообщения с ярлыком border-radius. Показать все сообщения
Показаны сообщения с ярлыком border-radius. Показать все сообщения

пятница, 15 марта 2019 г.

Как убрать видимость ободка у внешнего border-radius?

Заметил такую неприятную особенность у border-radius, когда при наложении фона вложенного элемента (в данном случае li) на внешний (ul) виден неприятный ободок. фидл
ul { background-color: #000; display: inline-block; height: 50px; line-height: 50px; padding: 0; border-radius: 4px 0 0 4px; } li { display: inline-block; list-style: none; } li.active { background-color: yellow; border-radius: 4px 0 0 4px; } a { text-decoration: none; }



Ответ

Вариант другой - псевдоэлементы. Но, если у вас глаз настолько алмаз, что различия ширины в 1px - это слишком, то он не для вас. Суть - у li.active нет border-radius, к первому и последнему элементу меню присваиваем дополнительный класс, который обеспечивает их соответствующими псевдоэлементами с абсолютным позиционированием. Сдвиаем их(псевдоэлементы) на 1px, скрывая все, что нужно скрыть. Профит, вы великолепны. http://codepen.io/malginovdesign/pen/KzXWQN?editors=1100
/* оформление */ * { box-sizing: border-box; } div { background: darkgrey; padding: 0 20px; width: 800px; margin: 0 auto; border-radius:4px; } a { text-decoration:none; color: #f9f9f9; } /* объект */ ul { display:inline-block; height:50px; line-height:50px; padding: 0; border-radius:4px; width: 100%; background: #333; } li { display:inline-block; list-style:none; width: calc(100% / 5); text-align:center; position: relative; } .active.first-link:before { content: ''; position: absolute; top: 0; left: -1px; height: 100%; width: 5px; background: darkorange; border-radius: 4px 0 0 4px; } .active.last-link:after { content: ''; position: absolute; top: 0; right: -2px; height: 100%; width: 5px; background: darkorange; border-radius: 0 4px 4px 0; } .active { background-color: darkorange; }


пятница, 26 октября 2018 г.

Как сделать единую границу у нескольких блоков с border-radius

Пытаюсь сделать единую границу у нескольких соседних блоков в виде змейки. Если бы углы были прямые, то всё было бы просто. Но углы должны быть скруглённые. Пробую делать так:
div { width: 190px; height: 200px; border: 2px dashed gray; border-top: none; } div:nth-of-type(1) { border-right: none; border-radius: 0 0 0 15px; } div:nth-of-type(2) { border-left: none; border-radius: 0 15px 15px 0; margin-left: 10px; } div:nth-of-type(3) { border-right: none; border-radius: 15px 0 0 15px; } div:nth-of-type(4) { border-left: none; border-radius: 0 15px 15px 0; margin-left: 10px; }


Но не некоторых углах стыки явно видны :( Можно ли как-то исправить это? Или, может быть, есть вообще другое решение для подобной задачи?


Ответ

UPD: overflow:hidden; идёт на помощь
Как выяснилось, непрозрачный фон не подходит по условиям задачи. Тогда завернём каждый блок в ещё один и дадим обёрткам свойство overflow:hidden;. Отрицательный верхний маржин уведёт верхнюю границу за пределы обёртки, и обёртка её спрячет.
.snake-border > div { overflow: hidden; } .snake-border > div > div { /* 6. */ width: 190px; height: 200px; border: 2px dashed gray; margin-top: -2px; /* 2. */ } .snake-border > div:nth-of-type(1) > div { border-right: none; border-top: none; /* 1. */ border-radius: 0 0 0 15px; } .snake-border > div:nth-of-type(2n+2) > div { border-left: none; border-radius: 0 15px 15px 0; margin-left: 15px; /* 4. */ } .snake-border > div:nth-of-type(2n+3) > div { border-right: none; border-radius: 15px 0 0 15px; } .snake-border > div:last-of-type > div { /* 5. */ border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; }


Белый фон делает чёрное дело
Верхнюю границу спрячем только у первого блока. У остальных этого делать не надо, иначе пропадёт часть скругления на углу блока. Приподнимем блоки на ширину границы, чтобы в каждой паре блоков верхняя граница нижнего соседа накладывалась на нижнюю границу верхнего. А чтобы одну из наложившихся границ всё-таки не было видно, назначим блокам непрозрачный фон. (По умолчанию background-clip имеет значение border-box, и фон заползает под границы.) Можно поиграть левым отступом, чтобы пунктир удачнее обрывался на переходах между блоками. Можно сделать, чтобы у последнего блока граница уходила вниз вертикально, — так же, как начинается у первого. И поместим всё внутрь блока с классом, а то даже сниппет добавляет к вёрстке служебные блоки.
.snake-border > div { /* 6. */ width: 190px; height: 200px; border: 2px dashed gray; margin-top: -2px; /* 2. */ background: white; /* 3. */ } .snake-border > div:nth-of-type(1) { border-right: none; border-top: none; /* 1. */ border-radius: 0 0 0 15px; } .snake-border > div:nth-of-type(2n+2) { border-left: none; border-radius: 0 15px 15px 0; margin-left: 15px; /* 4. */ } .snake-border > div:nth-of-type(2n+3) { border-right: none; border-radius: 15px 0 0 15px; } .snake-border > div:last-of-type { /* 5. */ border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; }