検索

ShapeDivider

このページは現在調整中です
Lism UI (@lism-css/ui) はまだ準備中です。

svgで境界線を描画するコンポーネントです。

Preview

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.

リサイズ可能

How to use

@lism-css/ui パッケージでShapeDivider(.c--shapeDivider)として提供しています。

Import

import { ShapeDivider } from '@lism-css/ui/react';

Props

プロパティ説明
viewBox出力するsvgのviewBox。
levelシェイプの高さレベルを正の数で指定できます。
offsetシェイプを水平方向にずらすための変数を出力します。
stretchシェイプを水平方向に引き伸ばして表示するための変数を出力します。
isEmptyシェイプを表示せず、Spacerのように使用することができます。

Source Code

/* Note: scale 反転は、__inner に対して行う。shapeDivider自身を反転させると、X方向に隙間ができてしまう。 */
@layer lism.modules {
	.c--shapeDivider {
		--level: 0;

		/* svg配置調整用 */
		--_inner-offset: 0px;
		--_inner-stretch: 1;

		/* flip がオンなら -1 にセット */
		--_flipX: 1;
		--_flipY: 1;

		/* 500px時点を最小値, 1200px時点を最大値にして、clampで高さを変動させる */
		height: clamp(calc(5px * var(--level)), calc(1cqw * var(--level)), calc(12px * var(--level)));
		overflow: visible;
	}

	.c--shapeDivider:where([data-flip^='X']) {
		--_flipX: -1;
	}

	.c--shapeDivider:where([data-flip$='Y']) {
		--_flipY: -1;
	}
	.c--shapeDivider_inner {
		/* 隙間ができるのを防ぐ */
		--offsetY: 0.5px;
		--offsetX: -0.5px;
		height: 100%;
		width: calc(100% + 1px);
		scale: calc(var(--_flipX) * var(--_inner-stretch)) var(--_flipY);
		translate: calc(var(--offsetX) + var(--_inner-offset)) calc(var(--offsetY) * var(--_flipY));
	}

	.c--shapeDivider_svg {
		/* 位置ずれ防止 */
		display: block;
	}

	/* 左右にスライドするアニメーション */
	:where([data-has-animation='true']) .c--shapeDivider_svg {
		/* ↓ X 100% にしてるのは translateXのcalc計算で * -1 をしなくていいように。*/
		transform-origin: 100% 0;
		animation: lism--slideShape 12s infinite alternate linear;
	}
}

@keyframes lism--slideShape {
	0% {
		transform: scaleX(4);
	}
	100% {
		transform: scaleX(4) translateX(calc(100% - 25%));
	}
}

Examples

シェイプをセクションの上下に配置する

flipを指定して反転させることで、同じsvgパスを使って上下に利用できます。(パス自体を上下用に分けて用意してももちろんOKです)

Preview

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.

リサイズ可能
<Wrapper hasGutter py='40'>
<Dummy />
</Wrapper>
<ShapeDivider viewBox='0 0 10 10' level='4'>
<path d='M10,10V0L0,9.5V10L10,10z'></path>
</ShapeDivider>
<Wrapper hasGutter bgc='text' c='base'>
<Box py='40'>
<Dummy length='l' />
</Box>
</Wrapper>
<ShapeDivider viewBox='0 0 10 10' level='4' flip='XY'>
<path d='M10,10V0L0,9.5V10L10,10z'></path>
</ShapeDivider>
<Wrapper hasGutter py='40'>
<Dummy />
</Wrapper>

空のShapeDividerをスペーサーとして利用する

pathを用意せず、空のisEmptyを指定してスペーサーとしても利用できます。

空の場合でも、levelで高さをコントロールできるので、上下片方にシェイプを配置した時の逆側の余白コントロールに便利です。

Preview

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

リサイズ可能
<Wrapper hasGutter bgc='base'>
<ShapeDivider isEmpty level='5' />
<Box py='20'>
<Dummy length='l' />
</Box>
<ShapeDivider viewBox='0 0 10 10' level='5' >
<path d='M10,10V0L0,9.5V10L10,10z'></path>
</ShapeDivider>
</Wrapper>
<Wrapper hasGutter bgc='text' c='base'>
<Box py='40'>
<Dummy length='l' />
</Box>
</Wrapper>

アニメーションをオンにする例

isAnimationでアニメーションをONにした時の例です。

Preview

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

リサイズ可能
<Container pos='rel'>
<ShapeDivider isEmpty level='7' />
<Frame isLayer z='-1' max-w='100%'>
<Media src='https://cdn.lism-css.com/img/a-1.jpg' alt='' width='960' height='640' />
<Layer bgc='black:50%' />
</Frame>
<Wrapper contentSize='s' hasGutter py='40' c='white'>
<Dummy length='xl' />
</Wrapper>
<ShapeDivider viewBox='0 0 100 10' isAnimation c='base' level='7'>
<path opacity='.3' d='M100,5.5C91.5,3,79.5,7.5,71.5,8C58,9,49,0.5,36,2c-9,1-13.5,3.5-20.5,3.5C8.5,6,0,2,0,2v8h100V5.5z'></path>
<path opacity='.3' d='M100,1.5C87.8,6.6,79.3,2.1,67.8,2.6S53,6.5,42.5,5.5S23,0,15,0S1,3,0,4v6h100V1.5z'></path>
<path d='M100,7.5C91.5,5,77.1,11.8,54,8C34.6,4.8,14.4,4.1,0,8.5V10h100V7.5z'></path>
</ShapeDivider>
</Container>
<Container isWrapper='s' hasGutter bgc='base' py='40'>
<Dummy length='l' />
</Container>

内部のSVGをずらして配置する例

上下に同じシェイプを使いまわす時、そのまま反転させると少し違和感がでてくるかもしれません。
そういう場合は、stretch,offsetでsvgをずらすことで、同じシェイプでも自然な表示にすることができます。

stretch,offsetの活用

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint. Occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis undeomnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.

Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.

リサイズ可能
<Container isWrapper='s' hasGutter bgc='base' py='40'>
<ShapeDivider isEmpty level='4' />
<Dummy length='l' />
</Container>
<Container pos='rel' hasGutter c='base' bgc='text'>
<ShapeDivider viewBox='0 0 100 10' c='base' flip='Y' level='8' stretch={1.1} offset='-5%'>
<path d='M100 6C89.3 3.3 82.7 9 70 9S48.4 3 38 3 24.5 6 17 6C7.4 6 0 0 0 0v10h100V6z'></path>
</ShapeDivider>
<Wrapper contentSize='s' py='40'>
<Dummy length='xl' />
</Wrapper>
<ShapeDivider viewBox='0 0 100 10' c='base' level='8' stretch={1.1}>
<path d='M100 6C89.3 3.3 82.7 9 70 9S48.4 3 38 3 24.5 6 17 6C7.4 6 0 0 0 0v10h100V6z'></path>
</ShapeDivider>
</Container>
<Container isWrapper='s' hasGutter bgc='base' py='40'>
<Dummy length='l' />
<ShapeDivider isEmpty level='4' />
</Container>

© Lism CSS. All rights reserved.