web-dev-qa-db-ja.com

CSS3トランスフォームスキューワンサイド

「CSS3 Transform Skew One Side」を作成することは可能ですか

私は1つの解決策を見つけましたが、背景には画像を使用する必要があるため(色ではなく)、それは私にとって有用ではありません

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

これでも JsFiddle も役に立たない(スキュー領域は透明である必要がある)

26
Syed

これを試してください:

イメージをunskewするには、イメージにネストされたdivを使用し、反対のスキュー値を指定します。そのため、親に20度がある場合、ネストされた(画像)divに-20度のスキュー値を与えることができます。

.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>

例:

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

24
Diego

これは古いことはわかっていますが、マージンオフセットの代わりに線形グラデーションを使用して同じ効果を実現することをお勧めします。これにより、コンテンツが元の場所に保持されます。

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);
}
13
Jake

トランスフォームとトランスフォーム原点を使用して作成できます。

さまざまな変換を組み合わせても、同様の結果が得られます。お役に立てば幸いです。 :)より簡単な変換については、これらの例を参照してください。これにはポイントがあります:

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%;は、Originを要素の垂直中央および水平左に設定します。そのため、視点は画像の左側に表示されないため、平らに見えます。パースペクティブエフェクトは右側にあるため、斜めに見えます。

9
Max Payne

:beforeはかなり近かったので、変更する必要があるのは、実際に境界の代わりにスキューを使用することだけでした。 http://jsfiddle.net/Hfkk7/1101/

編集:あなたの境界線アプローチも機能します、あなたが間違っていた唯一のことは、divの上にbefore要素を持つことでしたので、透明な境界線は表示されませんでした。疑似要素をdivの左側に配置した場合、すべてが機能するはずです: http://jsfiddle.net/Hfkk7/1102/

6
darthmaim

たぶん、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>
2
OzgurG