css - 剪贴蒙版到 SVG

标签 css svg mask clip

我正在尝试创建一个菜单,当您将鼠标悬停在其中一个链接上时,它会在背景中显示一个切片图像。我能够使用 CSS3 剪切蒙版创建仅在 Chrome 中可用的东西。

Clipping Mask

生成这些形状的代码随浏览器宽度缩放(百分比为 +1!),除了两件事外效果非常好:一是 mask 不会剪裁我需要的形状(请参阅彩色图像以查看shape) 并且不能与 Firefox 和 IE 一起使用。

#music_hover {
    z-index: 5;
    width: 100%;
    height: 100%;
    background: red;
    -webkit-clip-path: polygon(50% 50%, 100% 50%, 100% 100%, 70% 100%);
    clip-path: polygon(50% 50%, 100% 50%, 100% 100%, 70% 100%);
    float: right;
    position: absolute;
    background: url(../music.jpg) bottom right no-repeat;
    display: none;
}

现在,为了找到更多浏览器支持的东西,我已经切换到 SVG 图像。我在 [CodePen] 中完成了此操作.我当前解决方案的问题是,当浏览器不是 1920x1080 时,切片不会“保持在一起”。第一行中的 3 个切片粘在顶部,而第二行粘在底部,在页面中间形成一条白色 strip 。切片也不会缩放,因为它们有精确的点来绘制形状(与剪贴蒙版的百分比相反)。

Mask Shapes

HTML:

<svg version="1.1" id="novel_Position" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 773.685 540.94">
    <defs>
      <pattern id="novel_BG" patternUnits="userSpaceOnUse" width="100%" height="100%">
          <image xlink:href="http://loiseau-noir.com/seb/novel.jpg" x="0" y="0" width="100%" height="100%" />
      </pattern>
    </defs>
    <path d="M420,1.058H0v539.569l696.512,0.313c0.031-72.714,29.516-138.541,77.173-186.197L420,1.058z" fill="red"/>
</svg>

CSS:

#novel_Position {
    z-index: 5;
    width: 40.5%;
    top: 0;
    left: 0;
    position: fixed;
}

现在如果还不清楚,页面应该像这样运行:

GIF of menu functionality

最佳答案

你可以在没有剪切蒙版的情况下做到这一点,只需要使用变换和溢出:隐藏。和一些html结构

html, body {height: 100%;}

.base {
  height: 100%;
  width: 100%;
  border: 1px solid black;
  position: relative;
  overflow: hidden;
}

.part {
  position: absolute;
  width: 50%;
  height: 50%;
  overflow: hidden;
}
.part:after {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  background-size: cover;
  transform-origin: inherit;

}

.NW {
  left: 0px;
  top: 0px;
  transform: skewX(30deg);
  transform-origin: bottom right;
}

.NW:after {
  transform: skewX(-30deg);
  background-image: url("http://placekitten.com/g/200/300");
}

.N {
  top: 0px;
  right: 0px;
  transform: rotate(-60deg) skewX(-30deg);
  transform-origin: bottom left;
  overflow: hidden;
}

.N:after {
  transform: skewX(30deg) rotate(60deg) translateX(-50%) ;
  background-image: url("http://placekitten.com/g/600/400");
}  


.NE {
  right: 0px;
  top: 0px;
  transform: skewX(-30deg);
  transform-origin: bottom left;
}

.NE:after {
  transform: skewX(30deg);
  background-image: url("http://placekitten.com/g/200/300");
}  


.SW {
  left: 0px;
  bottom: 0px;
  transform: skewX(-30deg);
  transform-origin: top right;
}

.SW:after {
  transform: skewX(30deg);
  background-image: url("http://placekitten.com/g/200/300");
}

.S {
  bottom: 0px;
  right: 0px;
  transform: rotate(60deg) skewX(30deg);
  transform-origin: top left;
}

.S:after {
  transform: skewX(-30deg) rotate(-60deg) translateX(-50%) ;
  background-image: url("http://placekitten.com/g/200/300");
}  


.SE {
  right: 0px;
  bottom: 0px;
  transform: skewX(30deg);
  transform-origin: top left;
}

.SE:after {
  transform: skewX(-30deg);
  background-image: url("http://placekitten.com/g/200/300");
}  

.center {
    position: absolute;
    width: 20%;
    height: 0%;
    left: 40%;
    top: 50%;
    z-index: 10;
}

.roundcenter {
    width: 100%;
    padding: 50% 0;
    border-radius: 50%;
    background-color: lightgreen;
    margin-top: -50%;
}
<div class="base">
<div class="part NW"></div>
<div class="part N"></div>
<div class="part NE"></div>
<div class="part SW"></div>
<div class="part S"></div>
<div class="part SE"></div>
<div class="center">
<div class="roundcenter">
</div>
</div>
</div>

关于css - 剪贴蒙版到 SVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27727747/

相关文章:

javascript - 使用 jquery 动态添加的 css 打印 html 表

image - 如何在与行高相关的 <h1> 标签内调整 SVG 图像的大小?

javascript - d3 防止拖拽特定元素

SVG:掩码无法按预期工作

javascript - Accordion 菜单想知道

html - 使用 css 和 html 调整浏览器窗口大小时,如何使 div 元素 "float"向上?

javascript - 访问框架内的框架

user-interface - 使用 Raphael.js 绘制 ui 元素

wpf - 精确的不透明蒙版

c# - 如何在 Unity 中屏蔽自定义 UI 图形?