レスポンシブWebアプリケーションを開発していますが、次のように2つの個別のコンテンツ領域を作成する必要があります。
これまでのところ、私は試しました、
border-right: 30px solid transparent;
border-bottom: 30px solid #4c4c4c;
height: 100%;
width: 100%;
position: fixed;
しかし、残念ながら三角形を作成することはできませんでした。
borderプロパティを使用する以外に、CSSを使用してコンテンツをdiv内で完全にラップする可能性のある三角形を作成する他の方法はありますか?
どんな助けでも大歓迎です。
境界線があり、その間に透明なカットがある三角形(既存の回答では対処されていないようです)を探していると思います。そのため、ここに例を示します。で達成することは絶対に可能ですが、多くのハッキングが必要です。
CSS変換の使用:
以下のスニペットは、疑似要素と変換を使用して三角形の効果を生成します。出力は応答性がありますが、スキュー変換を使用すると、コンテナの形状が長方形になった場合、スキュー角度を変更し、配置属性などをさらに調整する必要があります。
.container {
position: relative;
overflow: hidden;
height: 200px;
width: 200px;
}
.div-1,
.div-2 {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
overflow: hidden;
}
.div-1 {
top: calc(-100% - 5px);
transform: skewY(45deg);
transform-origin: left top;
border-bottom: 2px solid;
}
.div-1:after {
position: absolute;
content: '';
height: calc(100% - 2px);
width: calc(100% - 2px);
top: calc(100% + 7px);
left: 0px;
transform: skewY(-45deg);
transform-origin: left top;
border: 1px solid;
}
.div-2 {
top: 5px;
transform: skewY(45deg);
transform-origin: left bottom;
border-top: 1px solid;
}
.div-2:after {
position: absolute;
content: '';
height: calc(100% - 7px);
width: calc(100% - 7px);
top: 0px;
left: 0px;
transform: skewY(-45deg);
transform-origin: left bottom;
border: 1px solid;
}
* {
box-sizing: border-box;
}
/* just for demo */
.container{
transition: all 1s;
}
.container:hover{
width: 400px;
height: 400px;
}
body{
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
<div class='div-1'></div>
<div class='div-2'></div>
</div>
グラデーションの使用:
別のアプローチは、以下のスニペットのように、背景画像としていくつかの線形グラデーションを使用することです。しかし、ここにも多くの欠点があります。(1)現在、グラデーションのブラウザサポートは非常に貧弱です。(2)角度のグラデーションは、スムージングが必要なギザギザの線を生成する傾向があります。(3)問題の画像で2つのdiv要素について具体的に言及しましたが、それらの中にコンテンツが必要だと思います。その場合、追加の作業が必要になります。
.container {
position: relative;
overflow: hidden;
height: 200px;
width: 300px;
background: linear-gradient(to top right, transparent calc(50% + 2px), black calc(50% + 2px), black calc(50% + 4px), transparent calc(50% + 4px)), linear-gradient(to bottom left, transparent calc(50% + 2px), black calc(50% + 2px), black calc(50% + 4px), transparent calc(50% + 4px)) ;
}
.container:before{
position: absolute;
content: '';
height: calc(100% - 6px);
width: calc(100% - 6px);
left: 4px;
border-top: 2px solid black;
border-right: 2px solid black;
}
.container:after{
position: absolute;
content: '';
height: calc(100% - 6px);
width: calc(100% - 6px);
top: 4px;
border-left: 2px solid black;
border-bottom: 2px solid black;
}
/* just for demo */
.container{
transition: all 1s;
}
.container:hover{
width: 700px;
height: 400px;
}
body{
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
</div>
SVGの使用:
これらすべてが私の提案につながります。それは、そのような形状を作成するためにSVGを使用することです。それらはpath
、要素だけを使用して簡単に作成でき、保守が容易で、本質的に応答性があります。
.container {
position: relative;
height: 300px;
width: 200px;
}
svg {
position: absolute;
top: 0px;
left: 0px;
height: 100%;
width: 100%;
}
svg path {
fill: transparent;
stroke: black;
}
/* just for demo */
.container {
transition: all 1s;
}
.container:hover {
height: 400px;
width: 700px;
}
body {
background: radial-gradient(circle at center, aliceblue, mediumslateblue);
min-height: 100vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class='container'>
<svg viewBox='0 0 100 100' preserveAspectRatio='none'>
<path d='M4,2 L98,2 98,96 4,2z M2,4 L2,98 96,98 2,4z' vector-effect='non-scaling-stroke' />
</svg>
</div>
注:上記のアプローチ(または他の回答で与えられたアプローチ)のいずれかを使用すると、コンテンツをこれらの三角形の境界内にとどめることはできません。それらの上にテキストを配置することはできますが、CSS Shapesモジュールの
shape-inside
プロパティが完全に実装されていない限り、テキストをこれらの境界内に含めることはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加