代码之家  ›  专栏  ›  技术社区  ›  Ayan

如何使CSS中的六边形变长

  •  0
  • Ayan  · 技术社区  · 8 年前

    我读过了 this 回答,但我使用的代码来自 here 做六边形。而六边形是有反应的,但不能使它拉长。我不太喜欢使用border解决方案,我希望通过添加类来覆盖现有的样式。

    .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>
    2 回复  |  直到 8 年前
        1
  •  2
  •   Takit Isy Surendra    8 年前

    更新的答案

    我建议你用特玛尼的方法 answer .
    它使用多个 linear-gradient s创建背景,并且需要较少的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 ,请
    • border 在伪元素上创建“三角形”形状。

    下面是一个片段:

    .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 得到一个实际的六边形或拉长的六边形。

        2
  •  0
  •   jmcgriz    8 年前

    创建“可扩展”六边形的最简单方法是在容器的两端各放置一个六边形,使其中心颜色相同。这是一个执行,你可以给中心文本负的水平边缘,以收紧间距,如果必要的话。我还对Hexagon生成代码进行了一些清理,以使其更具动态性-如果您更改 .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>
     
    推荐文章