Как сделать шестиугольник в css удлиненным

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

.socialIcon {
    width: 100px;
    height: 100px;
    color: black;
    transition: color 400ms ease-in;
}
.color {
    background-color: #1ae694;
    transition: background-color 500ms ease-in;
}
.hexagonWrapper {
    text-align: center;
    position: relative;
    display: inline-block;
    margin: 50px;
}
.iconContainer {
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}
.hexagon {
    height: 100%;
    width: calc(100% * 0.57735);
    display: inline-block;
}
.hexagon:before {
    position: absolute;
    top: 0;
    right: calc((100% / 2) - ((100% * 0.57735) / 2));
    background-color: inherit;
    height: inherit;
    width: inherit;
    content: "";
    transform: rotateZ(60deg);
}
.hexagon:after {
    position: absolute;
    top: 0;
    right: calc((100% / 2) - ((100% * 0.57735) / 2));
    background-color: inherit;
    height: inherit;
    width: inherit;
    content: "";
    transform: rotateZ(-60deg);
}
<a class = "socialIcon hexagonWrapper" href = "#" target = "_blank">
  <div class = "color hexagon"></div>
  <div class = "iconContainer">
    <span>H</span>
  </div>
</a>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
137
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Обновленный ответ

Предлагаю вам воспользоваться методом Темани из этого отвечать.
Он использует несколько linear-gradient для создания фона и требует меньше элементов в HTML:

.socialIcon {
  color: black;
  transition: color 400ms ease-in;
}

.color {
  --color: #1ae694;
  background-color: var(--color);
}

.hexagonWrapper {
  text-align: center;
  position: relative;
  display: inline-block;
}

.hexagon {
  padding: 10px 60px;
  display: inline-block;

  background:
   linear-gradient(to top right,    var(--color) 49.5%, transparent 50.5%) top right    / 20px 50%,
   linear-gradient(to bottom right, var(--color) 49.5%, transparent 50.5%) bottom right / 20px 50%,
   linear-gradient(to bottom left,  var(--color) 49.5%, transparent 50.5%) bottom left  / 20px 50%,
   linear-gradient(to top left,     var(--color) 49.5%, transparent 50.5%) top left     / 20px 50%,
   linear-gradient(var(--color), var(--color)) center / calc(100% - 40px) 100%;
  background-repeat:no-repeat;
}

/* Added after comment */
.hexagon:hover {
  --color: #aae;
}
<a class = "socialIcon hexagonWrapper" href = "#" target = "_blank">
  <div class = "color hexagon"><p>xxx</p></div>
</a>

⋅ ⋅ ⋅

Старый ответ

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

  • Переменные CSS для height и color,
  • borders на псевдоэлементах для создания «треугольных» форм.

Вот отрывок:

.socialIcon {
  --color: #1ae694; /* CSS Variable */
  --h: 100px; /* CSS Variable */
  width: 100px;
  height: var(--h); /* Using CSS var */
  color: black;
  transition: color 200ms ease-in;
}

.socialIcon:hover {
  --color: #aae;
}

.color {
  background-color: var(--color); /* Using CSS var */
  transition: background-color 500ms ease-in;
}

.hexagonWrapper {
  text-align: center;
  position: relative;
  display: inline-block;
  margin: 50px;
}

.iconContainer {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

.hexagon {
  height: 100%;
  width: 100%;
  display: inline-block;
}

/* TAKIT: I changed everything below */

.hexagon::before,
.hexagon::after {
  position: absolute;
  height: 0;
  width: 0;
  content: "";
  border: 0 solid transparent;
  /* border is full height but half width, to render a thin arrow shape
  This can be parameterized here: */
  border-width: calc(var(--h)/2) calc(var(--h)/4); /* Using CSS var */
  transition:
    border-left-color 500ms ease-in,
    border-right-color 500ms ease-in;
}

.hexagon::before {
  left: 0;
  transform: translate(-100%, 0);
  border-right-color: var(--color); /* Using CSS var */
}

.hexagon::after {
  right: 0;
  transform: translate(100%, 0);
  border-left-color: var(--color); /* Using CSS var */
}
<a class = "socialIcon hexagonWrapper" href = "#" target = "_blank">
  <div class = "color hexagon"></div>
  <div class = "iconContainer">
    <span>H</span>
  </div>
</a>

Используя это решение, единственное, что нужно настроить, это var: --h, чтобы получить настоящий шестиугольник или удлиненный ...

почему бы не какой-нибудь линейный градиент для этого;) stackoverflow.com/questions/50691853/…

Temani Afif 14.06.2018 23:35

Потому что я не хочу повторять то же самое, и я не смог закрыть как дубликат, поскольку в другом вопросе нет одобренного или принятого ответа;)

Temani Afif 15.06.2018 00:36

@TakitIsy С вашим исходным решением я обнаружил одну проблему: если я установлю одинаковую ширину и высоту, я не получу правильный шестиугольник. Это всегда вытянутый шестиугольник.

Ayan 15.06.2018 06:49

@Ayan Я имел в виду var(--h), извините. Правда, для правильного шестиугольника ... мы можем вычислить, чтобы ввести правильное значение.

Takit Isy 15.06.2018 06:58

@TakitIsy возможно ли за один раз получить как удлиненный, так и правильный шестиугольник? На самом деле в моем случае мне нужно иметь три правильных шестиугольных кнопки и одну удлиненную. Они также должны иметь некоторый эффект наведения, поскольку они являются кнопками.

Ayan 15.06.2018 07:08

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

Ayan 15.06.2018 08:36

@Ayan Проблема во втором фрагменте связана с вашей структурой DOM. Элемент iconContainer находится над hexagon, поэтому вы не можете навести указатель мыши на hexagon. Вместо этого я предлагаю вам использовать :hover в элементе socialIcon. Я обновляю свой фрагмент. ⋅⋅⋅ Обратите внимание, что в первом фрагменте все намного проще.

Takit Isy 15.06.2018 14:25

Я имел в виду, что :hover намного проще, но… к сожалению, мы не можем перейти на linear-gradient.

Takit Isy 15.06.2018 14:30

@TemaniAfif У вас нет удивительного обходного пути для перехода на градиент?

Takit Isy 15.06.2018 14:31

@TakitIsy конечно;) какого перехода вы хотите достичь?

Temani Afif 15.06.2018 14:32

@TemaniAfif В моем 1-м фрагменте OP хочет 500ms ease-in цвета на :hover. (В результате вы можете увидеть мой второй фрагмент)

Takit Isy 15.06.2018 14:34

Есть ли способ сделать что-то вроде transition: --color 500ms ease-in;? (Поскольку --color - это свойство, подобное переменной… Было бы замечательно).

Takit Isy 15.06.2018 14:40

для затухающей анимации единственный способ - продублировать слой и поиграть с непрозрачностью следующим образом: jsfiddle.net/mcuf2rnw/5

Temani Afif 15.06.2018 14:41

Спасибо большое, ребята. Действительно.. :)

Ayan 15.06.2018 17:56

Самый простой способ создать «расширяемый» шестиугольник - просто поставить по одному на каждый конец контейнера и сделать так, чтобы центр был окрашен одинаково. Вот пример этого: вы можете задать отрицательные горизонтальные поля для центрального текста, чтобы при необходимости уменьшить интервалы. Я также немного очистил код генерации шестиугольника, чтобы сделать его более динамичным - если вы измените ширину элемента .hexagon, все остальное изменится вместе с ним.

.color {
    background-color: #1ae694;
    transition: background-color 500ms ease-in;
}
.text-content {
  position: relative;
  z-index: 3;
  display: flex;
}
.text-content span {
  margin: auto;
  font-size: 18px;
}
.expandableHex {
  display: flex;
  flex-direction: row;
  justify-content: center;
  font-size: 0;
}
.hexagon {
  width: 80px;
}
.hexagon-inner {
    width: 100%;
    margin: auto;
    padding-bottom: 173%;
    display: inline-block;
    position: relative;
}
.hexagon-inner:before, .hexagon-inner:after {
    position: absolute;
    top: 0;
    left: 0;
    transform-origin: center center;
    background-color: inherit;
    height: 100%;
    width: 100%;
    content: "";
}
.hexagon-inner:before {
    transform: rotate(60deg);
}
.hexagon-inner:after {
    transform: rotate(-60deg);
}
<!--<a class = "socialIcon hexagonWrapper" href = "#" target = "_blank">
  <div class = "color hexagon"><div class = "hexagon-inner"></div></div>
  <div class = "color hexagon"><div class = "hexagon-inner"></div></div>
  <div class = "iconContainer">
    <span>H</span>
  </div>
</a>-->

<div class = "expandableHex">
 <div class = "hexagon"><div class = "color hexagon-inner"></div></div>
 <div class = "color text-content"><span>I'm content</span></div>
 <div class = "hexagon"><div class = "color hexagon-inner"></div></div>
</div>
 

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