CSS3变换歪斜一面

时间:2013-11-04 03:28:05

标签: css html5 css3 css-shapes

是否可以创建“CSS3 Transform Skew One Side”

我找到了一个解决方案,但它对我没用,因为我需要使用图像作为背景(而不是颜色)

#skewOneSide {
    border-bottom: 40px solid #FF0000;
    border-left: 50px solid rgba(0, 0, 0, 0);
    height: 0;
    line-height: 40px;
    width: 100px;
}

即使这个JsFiddle也没用(倾斜的区域应该是透明的)

5 个答案:

答案 0 :(得分:22)

试试这个:

unskew 图像使用嵌套div作为图像,并为其赋予相反的偏斜值。因此,如果您在父级上有20deg,那么您可以为嵌套(图像)div赋予-20deg的偏斜值。



.container {
  overflow: hidden;
}

#parallelogram {
  width: 150px;
  height: 100px;
  margin: 0 0 0 -20px;
  -webkit-transform: skew(20deg);
  -moz-transform: skew(20deg);
  -o-transform: skew(20deg);
  background: red;
  overflow: hidden;
  position: relative;
}

.image {
  background: url(http://placekitten.com/301/301);
  position: absolute;
  top: -30px;
  left: -30px;
  right: -30px;
  bottom: -30px;
  -webkit-transform: skew(-20deg);
  -moz-transform: skew(-20deg);
  -o-transform: skew(-20deg);
}

<div class="container">
  <div id="parallelogram">
    <div class="image"></div>
  </div>
</div>
&#13;
&#13;
&#13;

示例:

http://jsfiddle.net/diegoh/mXLgF/1154/

答案 1 :(得分:13)

我知道这是旧的,但我想建议使用线性渐变来实现相同的效果而不是边距偏移。这将保留其原始位置的任何内容。

http://jsfiddle.net/zwXaf/2/

<强> HTML

<ul>
    <li><a href="#">One</a></li>
    <li><a href="#">Two</a></li>
    <li><a href="#">Three</a></li>
</ul>

<强> CSS

/* reset */
ul, li, a {
    margin: 0; padding: 0;
}
/* nav stuff */
ul, li, a {
    display: inline-block;
    text-align: center;
}
/* appearance styling */
ul {
    /* hacks to make one side slant only */
    overflow: hidden;
    background: linear-gradient(to right, red, white, white, red);
}
li {
    background-color: red;
     transform:skewX(-20deg);
    -ms-transform:skewX(-20deg);
    -webkit-transform:skewX(-20deg);
}
li a {
    padding: 3px 6px 3px 6px;
    color: #ffffff;
    text-decoration: none;
    width: 80px;
     transform:skewX(20deg);
    -ms-transform:skewX(20deg);
    -webkit-transform:skewX(20deg);
}

答案 2 :(得分:8)

你可以使用转换和转换起源来制作它。

组合各种transfroms会得到类似的结果。我希望你觉得这对你有帮助。 :) 有关更简单的转换,请参阅这些示例。这留下了一点:

div {    
    width: 300px;
    height:200px;
    background-image: url('http://placecage.com/g/300/200');
    -webkit-transform: perspective(300px) rotateX(-30deg);
    -o-transform: perspective(300px) rotateX(-30deg);
    -moz-transform: perspective(300px) rotateX(-30deg);
    -webkit-transform-origin: 100% 50%;
    -moz-transform-origin: 100% 50%;
    -o-transform-origin: 100% 50%;
    transform-origin: 100% 50%;
    margin: 10px 90px;
}
<div></div>

这有正确的偏斜点:

div {    
    width: 300px;
    height:200px;
    background-image: url('http://placecage.com/g/300/200');
    -webkit-transform: perspective(300px) rotateX(-30deg);
    -o-transform: perspective(300px) rotateX(-30deg);
    -moz-transform: perspective(300px) rotateX(-30deg);
    -webkit-transform-origin: 0% 50%;
    -moz-transform-origin: 0% 50%;
    -o-transform-origin: 0% 50%;
    transform-origin: 0% 50%;
    margin: 10px 90px;
}
<div></div>

transform: 0% 50%;的作用是将原点设置为元素的垂直中间和左侧。因此,在图像的左侧部分看不到透视,因此它看起来很平坦。透视效果在右侧,因此看起来很倾斜。

答案 3 :(得分:5)

您尝试:before非常接近,您唯一需要改变的是实际使用偏斜而不是边框​​:http://jsfiddle.net/Hfkk7/1101/

编辑:您的边框方法也会起作用,您唯一错误的做法就是将div元素放在div的顶部,因此透明边框没有显示。如果您将伪元素放在div的左侧,那么一切都会有效:http://jsfiddle.net/Hfkk7/1102/

答案 4 :(得分:1)

也许您想使用CSS“剪切路径”(可以使用透明背景)

“剪切路径”参考:https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path

生成器:http://bennettfeely.com/clippy/

示例:

/* With percent */
.element-percent {
  background: red;
  width: 150px;
  height: 48px;
  display: inline-block;
  
  clip-path: polygon(0 0, 100% 0%, 75% 100%, 0% 100%);
}

/* With pixel */
.element-pixel {
  background: blue;
  width: 150px;
  height: 48px;
  display: inline-block;
  
  clip-path: polygon(0 0, 100% 0%, calc(100% - 32px) 100%, 0% 100%);
}

/* With background */
.element-background {
  background: url(https://images.pexels.com/photos/170811/pexels-photo-170811.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=750&w=1260) no-repeat center/cover;
  width: 150px;
  height: 48px;
  display: inline-block;
  
  clip-path: polygon(0 0, 100% 0%, calc(100% - 32px) 100%, 0% 100%);
}
<div class="element-percent"></div>

<br />

<div class="element-pixel"></div>

<br />

<div class="element-background"></div>