Documentation CSS

概要

CSSleftプロパティは、配置された要素の水平位置を制御するためのプロパティです。positionプロパティと組み合わせることで、要素を包含ブロックの左端からの距離で配置できます。leftプロパティの使い方を理解することで、より柔軟なレイアウトの調整が可能になります。

leftプロパティの仕組み

leftプロパティは、要素の左端が包含ブロックの左端からどれだけ離れているかを指定します。

視覚的な理解

包含ブロック
├─────────────────────────┐
│  left: 20px             │
│  ↓                      │
│  [要素]                 │
│                         │
└─────────────────────────┘

rightプロパティとの違い

プロパティ基準点方向
left包含ブロックの左端右方向に配置
right包含ブロックの右端左方向に配置
/* leftを使用 */
.box {
  position: absolute;
  left: 20px; /* 左端から20px */
}

/* rightを使用(同じ結果を得る別の方法) */
.box {
  position: absolute;
  right: calc(100% - 20px - 要素の幅);
}

leftプロパティの基本構文

selector {
  position: relative | absolute | fixed | sticky;
  left: <length> | <percentage> | auto;
}

適用条件

leftプロパティが機能するには、positionが以下のいずれかである必要があります。

/* ✅ leftが効く */
.element {
  position: relative; /* または absolute, fixed, sticky */
  left: 20px;
}

/* ❌ leftが効かない */
.element {
  position: static; /* デフォルト値 */
  left: 20px; /* 無視される */
}

値の種類

長さ(<length>

固定的な距離を指定します。

.element {
  position: absolute;
  left: 20px;   /* ピクセル */
  left: 2rem;   /* ルートフォントサイズ基準 */
  left: 1.5em;  /* 親フォントサイズ基準 */
  left: 5vw;    /* ビューポート幅の5% */
}

パーセンテージ(<percentage>

包含ブロックの幅に対する割合で指定します。

.element {
  position: absolute;
  left: 50%; /* 包含ブロック幅の50%の位置 */
}

注意:パーセンテージは包含ブロックのを基準にします(高さではありません)。

auto(初期値)

ブラウザが自動的に計算します。

.element {
  position: absolute;
  left: auto; /* デフォルト */
}

負の値

負の値を指定すると、左端の外側に配置されます。

.element {
  position: absolute;
  left: -20px; /* 左端から20px外側(画面外) */
}

calc()関数

複雑な計算を使用できます。

.element {
  position: absolute;
  left: calc(50% - 100px); /* 中央から左に100px */
  left: calc(100% - 200px); /* 右端から200px左 */
  left: calc(25% + 20px); /* 25%の位置から20px右 */
}

値の比較表

説明使用例
0包含ブロックの左端left: 0
20px左端から20pxleft: 20px
50%包含ブロック幅の50%left: 50%
-10px左端の外側10pxleft: -10px
auto自動計算left: auto
calc()計算式left: calc(50% - 25px)

positionごとの動作

position: relative

通常位置からの相対的な移動。元の位置のスペースは保持されます。

.relative-box {
  position: relative;
  left: 20px; /* 通常位置から右に20px移動 */
}

包含ブロック:要素自身の通常位置

視覚的なイメージ

[通常位置]──→ [20px移動した位置]
    └─────────┘
   (元のスペース保持)

position: absolute

包含ブロック(position指定された最も近い祖先)を基準に絶対配置。

.container {
  position: relative; /* 包含ブロックとして機能 */
}

.absolute-box {
  position: absolute;
  left: 0; /* コンテナの左端 */
}

包含ブロック

  1. position: relative|absolute|fixed|stickyが指定された最も近い祖先
  2. なければ初期包含ブロック(通常は<html>

position: fixed

ビューポート(画面)を基準に固定配置。スクロールしても動きません。

.fixed-nav {
  position: fixed;
  left: 0; /* 画面の左端 */
  top: 0;
  width: 200px;
  height: 100vh;
}

包含ブロック:ビューポート(画面全体)

使用例:固定ナビゲーション、フローティングボタン

position: sticky

スクロール位置に応じてrelativefixedの間で切り替わります。

.sticky-header {
  position: sticky;
  left: 0; /* 横スクロール時に左端に固定 */
  top: 0; /* 縦スクロール時に上端に固定 */
}

包含ブロック

  • スクロール前:通常の流れ
  • スクロール後:スクロールコンテナ

注意:親要素にoverflow: hiddenがあると機能しません。

positionごとの比較表

position基準スペース保持スクロール追従使用例
relative通常位置微調整、子要素の基準
absolute包含ブロックモーダル、ツールチップ
fixedビューポート固定ナビ、FAB
stickyスクロール✅→❌条件付きスティッキーヘッダー

実践的な使用例

例1:完全な中央揃え

.centered-modal {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 400px;
  background: white;
  padding: 30px;
  border-radius: 12px;
  box-shadow: 0 10px 40px rgba(0,0,0,0.3);
  z-index: 1000;
}

例2:固定サイドバー

.sidebar {
  position: fixed;
  top: 0;
  left: 0;
  width: 250px;
  height: 100vh;
  background-color: #2c3e50;
  color: white;
  padding: 20px;
  overflow-y: auto;
  box-shadow: 2px 0 10px rgba(0,0,0,0.1);
  z-index: 100;
}

/* メインコンテンツをサイドバー分ずらす */
.main-content {
  margin-left: 250px;
  padding: 20px;
}

例3:スライドインメニュー

.slide-menu {
  position: fixed;
  top: 0;
  left: -300px; /* 初期状態は画面外 */
  width: 300px;
  height: 100vh;
  background: white;
  box-shadow: 2px 0 10px rgba(0,0,0,0.2);
  transition: left 0.3s ease;
  z-index: 1000;
}

.slide-menu.active {
  left: 0; /* 画面内にスライド */
}

例4:ツールチップの配置

.tooltip-container {
  position: relative;
  display: inline-block;
}

.tooltip {
  position: absolute;
  bottom: calc(100% + 10px);
  left: 50%;
  transform: translateX(-50%);
  background-color: #333;
  color: white;
  padding: 8px 12px;
  border-radius: 4px;
  white-space: nowrap;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s;
}

.tooltip-container:hover .tooltip {
  opacity: 1;
  visibility: visible;
}

例5:バッジの配置

.icon-wrapper {
  position: relative;
  display: inline-block;
}

.notification-badge {
  position: absolute;
  top: -8px;
  left: calc(100% - 8px); /* アイコンの右上 */
  background-color: #e74c3c;
  color: white;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  font-weight: bold;
}

leftとrightの同時指定

leftrightを同時に指定すると、要素の幅が自動的に決定されます。

/* 左右から20pxずつ離れた幅 */
.stretched-box {
  position: absolute;
  left: 20px;
  right: 20px;
  /* 幅は自動計算される */
}

計算式:幅 = 包含ブロックの幅 - left - right

ブラウザサポート

leftプロパティは、すべてのモダンブラウザで完全にサポートされています。

ブラウザバージョン
Chrome1+
Firefox1+
Safari1+
Edge12+
Opera5+

ベストプラクティス

1. positionを必ず指定

/* ❌ 効果なし */
.element {
  left: 20px;
}

/* ✅ 正しい */
.element {
  position: relative;
  left: 20px;
}

2. 中央揃えにはtransformを併用

/* より確実な中央揃え */
.centered {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

3. アニメーションではtransformを優先

/* ❌ パフォーマンスが悪い */
.animated {
  transition: left 0.3s;
}

.animated:hover {
  left: 100px;
}

/* ✅ パフォーマンスが良い */
.animated {
  position: relative;
  transition: transform 0.3s;
}

.animated:hover {
  transform: translateX(100px);
}

4. z-indexで重なり順を制御

.overlay {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,0.5);
  z-index: 999; /* 重なり順を明示 */
}

トラブルシューティング

問題1:leftが効かない

原因position: static(デフォルト)

解決策

.element {
  position: relative; /* または absolute, fixed, sticky */
  left: 20px;
}

問題2:予期しない位置に配置される

原因:包含ブロックが意図したものと異なる

解決策

/* 親要素をposition指定して包含ブロックにする */
.parent {
  position: relative;
}

.child {
  position: absolute;
  left: 0; /* 親要素の左端 */
}

問題3:パーセンテージが意図通りに動作しない

原因:包含ブロックの幅が不明確

解決策

/* 包含ブロックに明示的な幅を指定 */
.container {
  position: relative;
  width: 600px; /* 明示的な幅 */
}

.item {
  position: absolute;
  left: 50%; /* 300px */
}

問題4:要素が画面外に出てしまう

原因:負の値または大きすぎる値

解決策

/* 範囲を制限 */
.element {
  position: absolute;
  left: max(0px, 50% - 200px); /* 最小0px */
  left: min(calc(100% - 100px), 50%); /* 最大100%-100px */
}

注意点

1. position指定が必須

leftposition: staticでは無視されます。

/* position指定を忘れずに */
.element {
  position: relative; /* 必須 */
  left: 20px;
}

2. 包含ブロックを理解する

パーセンテージは包含ブロックのを基準にします。

.container {
  width: 400px;
  position: relative;
}

.child {
  position: absolute;
  left: 50%; /* 200px(400pxの50%) */
}

3. transformとの併用に注意

transform: translateX()leftを同時に使用すると、両方が適用されます。

.element {
  position: absolute;
  left: 50px; /* 左から50px */
  transform: translateX(20px); /* さらに20px右 */
  /* 結果:左から70px */
}

4. RTL(右から左)言語への対応

RTL言語では論理プロパティの使用を検討してください。

/* 物理プロパティ */
.element {
  left: 20px; /* 常に左から */
}

/* 論理プロパティ(推奨) */
.element {
  inset-inline-start: 20px; /* 書字方向に適応 */
}

関連プロパティ

leftと一緒に使用されることが多いプロパティです。

配置関連

  • right:右端からの距離
  • top:上端からの距離
  • bottom:下端からの距離
  • inset:top, right, bottom, leftのショートハンド
/* 個別指定 */
.box {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

/* ショートハンド */
.box {
  position: absolute;
  inset: 0; /* すべての辺から0 */
}

position関連

  • position:配置方法を指定
  • z-index:重なり順を指定
  • transform:要素の変形・移動
.element {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%); /* 中央揃え */
  z-index: 10; /* 重なり順 */
}

論理プロパティ

  • inset-inline-start:インライン軸の始点からの距離(leftの論理版)
/* 物理プロパティ */
.element {
  left: 20px;
}

/* 論理プロパティ(多言語対応) */
.element {
  inset-inline-start: 20px;
}

まとめ

leftプロパティは、配置された要素の水平位置を制御するための基本的なCSSプロパティです。

主な特徴

  1. position必須position: static以外で機能
  2. 包含ブロック基準:positionに応じて基準が変わる
  3. 柔軟な値:px、%、calc()などに対応
  4. 負の値可能:画面外への配置も可能

positionごとの基準

position基準使用例
relative通常位置微調整
absolute包含ブロックモーダル、ツールチップ
fixedビューポート固定ナビゲーション
stickyスクロールコンテナスティッキーヘッダー

覚えておくべきポイント

  • positionとセットposition: staticでは効果なし
  • 包含ブロックを確認:意図した要素が基準になっているか
  • パーセンテージは幅基準:包含ブロックの幅に対する割合
  • transformと併用:中央揃えにはtransform: translateX(-50%)
  • アニメーションは transform:パフォーマンスのため
  • z-indexで重なり制御:必要に応じて指定

leftプロパティを正しく理解して使用することで、柔軟で正確なレイアウトを実現できます。

参考リンク

円