如何在自定义布局中加入 CSS 六边形元素?

Posted

技术标签:

【中文标题】如何在自定义布局中加入 CSS 六边形元素?【英文标题】:How can you join CSS hexagon elements in a custom layout? 【发布时间】:2018-07-08 03:07:07 【问题描述】:

这是我想要实现的布局:

我用这个 css 创建了六边形:

.hexagon 
  width: 100px;
  height: 55px;
  background: red;
  position: relative;
  display:inline-block;
  margin:0.2em;

.hexagon:before 
    content: "";
    position: absolute;
    top: -25px;
    left: 0;
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-bottom: 25px solid red;

.hexagon:after 
    content: "";
    position: absolute;
    bottom: -25px;
    left: 0;
    width: 0;
    height: 0;
    border-left: 50px solid transparent;
    border-right: 50px solid transparent;
    border-top: 25px solid red;

但是,我正在寻找如何用图像填充它们。 这是一支笔:https://codepen.io/1istbesser/pen/ddypXK

如何将图像放在六边形内以使其覆盖所有内容?如果我在#hexagon1 上使用背景图像,图像只覆盖中间部分。

【问题讨论】:

请分享您的背景图片网址。在 codepen 中它没有显示 您可以使用例如 via.placeholder.com/350x150 来处理此类问题 ***.com/a/7437345/8047253 有不同的方法 CSS Image size, how to fill, not stretch?的可能重复 @JeremyThille 为什么你认为它是重复的?我没有看到任何关系 【参考方案1】:

我编写了这段代码

Codepen

我改变了你绘制元素的方式,而不是添加了红色的边框顶部,我添加了带有背景的边,但是你需要知道页面的背景颜色才能做到这一点,所以我把图片放在盒子上面,把前后放在图片上面

CSS

*
  background-color:black;

section
  margin-top:3em;
  display:flex;
  flex-flow: column;
  align-items: center;

.hexagon 
    width: 100px;
    height: 110px;
    background: red;
    position: relative;
  display:inline-block;
  margin:0.2em;
  overflow: hidden;

.hexagon img
  position: absolute;
  left: 50%;
  top: 50%;
  min-width: 100%;
  min-height: 100%;
  height: 100%;
  transform: translate(-50%, -50%);
  z-index: 1;

.hexagon:before 
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 0;
    height: 0;
    border-right: 50px solid black;
    border-left: 50px solid black;
    border-bottom: 25px solid transparent;
  z-index: 2;

.hexagon:after 
    content: "";
    position: absolute;
    bottom: 0;
    left: 0;
    width: 0;
    height: 0;
    border-right: 50px solid black;
    border-left: 50px solid black;
    border-top: 25px solid transparent;
  z-index: 2;

.row
margin-top:1.3em;

.hexagon#hexagon2
  background-color: purple;

.hexagon#hexagon2:before
  border-bottom-color: purple;

.hexagon#hexagon2:after
  border-top-color: purple;

.hexagon#hexagon3
  background-color: white;

.hexagon#hexagon3:before
  border-bottom-color: white;

.hexagon#hexagon3:after
  border-top-color: white;

.hexagon#hexagon4
  background-color: orange;

.hexagon#hexagon4:before
  border-bottom-color: orange;

.hexagon#hexagon4:after
  border-top-color: orange;

【讨论】:

你说得对,你可以将margin-top: -13px 放在.row 中,但不会那么接近 因为你使用了纯色,所以无法关闭它们【参考方案2】:

如果你想使用图片作为背景,你需要考虑另一种方式。您依赖于伪元素,因此您的六边形不是 one 元素,因此您不能使用背景图像覆盖整个区域。

这是一个使用clip-path的想法:

* 
  background-color: black;


section 
  margin-top: 3em;
  display: flex;
  flex-flow: column;
  align-items: center;


.hexagon 
  width: 100px;
  height: 100px;
  background: url(https://lorempixel.com/100/100/) 0 0/cover no-repeat;
  position: relative;
  display: inline-block;
  margin: -10px 0.2em;
  -webkit-clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
<section>
  <div class="row">
    <div class="hexagon" id="hexagon1"></div>
    <div class="hexagon" id="hexagon2"></div>
    <div class="hexagon" id="hexagon3"></div>
    <div class="hexagon" id="hexagon4"></div>
  </div>
  <div class="row">
    <div class="hexagon" id="hexagon5"></div>
    <div class="hexagon" id="hexagon6"></div>
    <div class="hexagon" id="hexagon7"></div>
    <div class="hexagon" id="hexagon8"></div>
    <div class="hexagon" id="hexagon9"></div>
  </div>

</section>

【讨论】:

剪辑路径不错,但据我所知并非所有浏览器都支持? @NemanjaGrabovac 我会说它现在得到很好的支持caniuse.com/#search=clip-path 但我们仍然有 IE 问题 :) 所以我们可以将其视为现代浏览器的潜在解决方案 哦,上次我检查时,我认为 safari 也不支持它,但是呃,edge 和 IE ......没有什么好东西可以在那里工作:) @NemanjaGrabovac Safari 通过 -webkit- 部分支持它......我什至不关心微软的东西 :) 他们生活在另一个世界 微软的存在是为了让我们创建一个ie.css【参考方案3】:

您将遇到的问题是,使用 CSS 三角形创建六边形实际上会生成填充了一个或两个边框(其余透明)的方形框。这有两个效果:

    您不能轻易地将图像放入填充边框中以使其被剪裁。 您不能使六边形(只有六边形)可点击:整组矩形始终是可点击的,这会使您的布局在它们重叠的地方变得棘手。

您将需要能够产生实际六边形的东西。带有剪辑路径的内联 SVG 非常适合 - 与 CSS 中的 clip-path 不同,它几乎在任何 SVG 所在的地方都受支持。这是一个例子:

<svg class="svg-graphic"   viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" version="1.1">
    <defs>
       <clipPath id="hexagonal-mask">
          <polygon points="300,150 225,280 75,280 0,150 75,20 225,20" />
       </clipPath>
    </defs> 
    <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png" preserveAspectRatio="xMidYMin slice"/>
</svg>

这里有一个更详细的例子,展示了可点击的六边形,以及剪辑路径定义的重用:

.svg-template 
  position: absolute;


.honeycomb 
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
  width: 1200px;
  height: 1200px;
  border: 1px solid #DDD;


.honeycomb li 
 margin: 0;
 padding: 0;
 position: absolute;


.honeycomb li:nth-child(1) 
  top: 0;
  left: 0;


.honeycomb li:nth-child(2) 
  top: 0;
  left: 290px;


.honeycomb li:nth-child(3) 
  top: 0;
  left: 580px;


.honeycomb li:nth-child(4) 
  top: 240px;
  left: 145px;


.honeycomb li:nth-child(5) 
  top: 240px;
  left: 435px;


.honeycomb li:nth-child(6) 
  top: 240px;
  left: 725px;


.honeycomb li a 
  cursor: pointer;


.honeycomb li a:hover image
 opacity: 0.5;
<svg class="svg-template" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" version="1.1">
   <defs>
      <clipPath id="hexagonal-mask">
         <polygon points="50 0, 95 25, 95 75, 50 100, 5 75, 5 25" />
      </clipPath>
    </defs>
</svg>

<ul class="honeycomb">
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
  <li>
     <svg   viewBox="0 0 100 100" >
      <a href="#something">
        <image clip-path="url(#hexagonal-mask)"   xlink:href="https://i.imgur.com/grp9BU1.png"/>
       </a>
    </svg>
  </li>
</ul>

【讨论】:

【参考方案4】:

您可以做的是绘制一个 SVG,然后将图像作为 mask 放入 css 中

https://codepen.io/noahblon/post/coloring-svgs-in-css-background-images

*
  background-color:black;

section
  margin-top:3em;
  display:flex;
  flex-flow: column;
  align-items: center;

.hexagon 
	width: 100px;
	height: 110px;
	background: red;
	position: relative;
  display:inline-block;
  margin:0.2em;
  -webkit-mask:url(https://svgshare.com/i/5Fk.svg) no-repeat 50% 50%;
  mask:url(https://svgshare.com/i/5Fk.svg) no-repeat 50% 50%;
  background-image: url('https://img1.ibxk.com.br/2017/07/13/13160112901226.jpg?w=700');
  background-size: cover;
  background-position: center;

.row
  text-align: center;
  margin-top: -25px
<section>
      <div class="row">
      <div class="hexagon" id="hexagon1"></div>
      <div class="hexagon" id="hexagon2"></div>
      <div class="hexagon" id="hexagon3"></div>
      <div class="hexagon" id="hexagon4"></div>
      <div class="row">
      <div class="hexagon" id="hexagon5"></div>
      <div class="hexagon" id="hexagon6"></div>
      <div class="hexagon" id="hexagon7"></div>
      </div>
      <div class="row">
      <div class="hexagon" id="hexagon8"></div>
      <div class="hexagon" id="hexagon9"></div>
      </div>
 </section>

【讨论】:

这是我 POV 的一个干净选项。您可以使用另一个 svg 蒙版轻松切换并创建新设计。来自我的 +1

以上是关于如何在自定义布局中加入 CSS 六边形元素?的主要内容,如果未能解决你的问题,请参考以下文章

rem布局,js动态设置html的fontsize大小

在自定义 UITableViewCell 中忽略自动布局

rem布局,js动态设置html的fontsize大小

如何在Android中自定义动画

找不到有关如何在自定义小部件中使用 ListView 的正确布局选项

如何正确链接自定义 UITableViewCell 和访问元素