Figma Dev Modeの線は「外側」扱いでCSS表示される
要点
- Figmaにおける線の
位置のデフォルトは内側 - Dev ModeのCSS出力は、線の設定に関わらず要素の
外側-
外側以外を設定している場合、線の太さだけサイズが大きくなる
-
- これにより起こり得るデザインと実装のズレについて、チーム内で認識を合わせておくことが重要
Figmaにおける線のデフォルトは内側
Figmaでは、オブジェクトの線の位置を3種類から選択できます。
- 内側
- 外側
- 中央(本記事では取り上げません)
内側
デフォルトでは内側が指定されています。線がオブジェクトの幅・高さの内部に含まれます。
例として、100pxの正方形を作成し、1pxの線を設定したとします。
このとき、オブジェクトのサイズは指定通り100pxの正方形で、領域内で最も外側の1pxずつが線として表示されます。

外側
外側では、線がオブジェクトの幅・高さの外側に追加されます。
こちらの設定で100pxの正方形に1pxの線を設定すると、線を含めたサイズは102pxの正方形となります。
オブジェクトの上下左右の外側に1pxずつ線が表示されるためです。

Dev ModeのCSS生成における線は常に外側
Dev Modeは、フロントエンドエンジニアの実装を支援するFigmaの機能です。
機能のひとつとして、FigmaデザインをもとにCSSを生成してくれます。
このとき、線の位置に関係なく、HTML要素の外側に線を追加するCSSが生成されます。
問題点
内側の場合、線の太さ分サイズが大きい状態のCSSが生成されています。
100pxの正方形に1pxの線を設定した場合、線の2pxが外側に足された102pxの正方形を表示するCSSとなります。

外側の場合でもCSSは同一です。このため、外側のFigmaオブジェクトとCSSの整合性は取れています。

解決案
前提
デザイナーとエンジニア双方の視点をもとに、以下の点をチーム内で共通認識を持つことが重要だと考えます。
- 上記で記載したDev Modeの仕様
- Figma上は
内側のほうがオブジェクト間の距離を測定しやすい-
外側はオブジェクトのサイズに線が含まれず、距離の測定時に計算が必要
-
- CSSの線(
border)はデフォルトで外側に追加される
そのうえで、チーム内で取り得る解決案を記述します。
案1:誤差を許容する
最も調整が少なくて済む方法は、線の太さによる誤差を許容することです。
デザイナーは線を外側にする必要はなく、エンジニアはDev ModeのCSS生成どおりに実装します。
特定の箇所については誤差なく実装する必要がある場合、デザイナーからエンジニアに伝達をする必要があります。
案2:デザイナーが外側で作成する
デザイナーは、オブジェクトの線を全て外側で作成します。
エンジニアは、CSS生成どおりに実装します。
この場合、オブジェクト同士の間隔に影響が出てくる点に注意が必要です。
前述のとおり、外側はオブジェクトサイズに線が含まれません。このため、Figmaで表示される測定値から線の太さを除いて考える必要があります。
次の画像では、オブジェクト間の白い部分は4pxとして表示されています。ただし両方とも線が外側のため、測定上は線が間隔として含められて6pxと表示されています。

案3:エンジニアがボーダー揃えに沿って線を実装する
デザイナーは、内側または外側で線を作成します。
エンジニアは、Dev Modeでボーダー揃え(=位置)を確認し、内側と外側で実装方法を変更します。
位置の指定の確認方法
Dev Mode上でオブジェクトの線の位置を確認できるのは、次の箇所です。
- 右ペイン >
インスペクトタブ >レイヤープロパティ>リスト>ボーダー揃え

外側の場合、Dev Modeで表示されているとおりの実装となります。
width: 100px;
height: 100px;
border: 1px solid #000;

内側の実装は複数の方法があります。
width,heightによる調整
要素自体のサイズを線の太さだけ減らしています。
width: 98px;
height: 98px;
border: 1px solid #000;

box-sizingによる調整
widthやheightが指定されている場合は要素の内側に線が表示されます。指定されていない場合は線の太さだけ要素が大きくなるため、厳密に要素の内側とはなりません。
width: 100px;
height: 100px;
border: 1px solid #000;
box-sizing: border-box;

box-shadowによる調整
border(線プロパティ)ではなく、box-shadow(影プロパティ)を使っているため、標準的なCSSの使用方法と異なることは留意が必要です。
width: 100px;
height: 100px;
box-shadow: inset 0 0 0 1px #000;

NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion