[CSS]CSSを正しく理解するためにまとめてみた

:::note
CSSについて曖昧な理解な進めていた点が多く、業務では毎回調べ直していました。
そこでちゃんと理解出来ていない箇所について、改めて勉強しまとめています。
:::

# 要約
- ブロックボックスとインラインボックスの違いを正しく理解する
- CSSが適用されない場合の、通常のWebページ上でのレイアウト方法を理解する
- CSSのレイアウト技術を正しく理解する
    - `position: absolute;`と`position: relative;`の違いは？
    - フレックスボックスの挙動を正しく理解したい
    - などなど

---

- [CSSのボックスの概念についてまとめ](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#css%E3%81%AE%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E6%A6%82%E5%BF%B5%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81)
- [CSSにおけるレイアウトの通常フローとは?](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#css%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AE%E9%80%9A%E5%B8%B8%E3%83%95%E3%83%AD%E3%83%BC%E3%81%A8%E3%81%AF)
- [CSSのレイアウト技術について](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#css%E3%81%AE%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E6%8A%80%E8%A1%93%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
    - [displayプロパティ](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#display%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)
    - [フレックスボックス](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E3%83%95%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)
    - [グリッド](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89)
    - [浮動ボックス](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E6%B5%AE%E5%8B%95%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)
    - [位置指定](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E4%BD%8D%E7%BD%AE%E6%8C%87%E5%AE%9A)
    - [レスポンシブデザインについて](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B7%E3%83%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
- [要素のオーバーフロー](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#%E8%A6%81%E7%B4%A0%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC)
- [CSSによるサイズ設定](https://qiita.com/yusuke2310/items/d60ac07c094d9aaa400e#css%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A)
---

# CSSのボックスの概念についてまとめ
:::note info
* ボックスの概念を理解できると、CSSでレイアウトする際の助けになる
* 一般的には、**ブロックボックス**と**インラインボックス**がある
* ボックスには**内側の表示型**と**外側の表示型**がある
* [display](https://developer.mozilla.org/ja/docs/Web/CSS/display)プロパティを使用して指定する
:::

## 外側の表示型について
### ボックスの外側の表示型による動作の違い
| 外側の表示型 | block | inline |
|:-|:-|:-|
| 配置  | 新しい行に分割 される | 新しい行に分割されない  |
| `width`と`height`  | 適用される  | 適用されない  |
| `padding`と`margin`と`border`  | 適用され、他の要素を遠ざけることができる  | 左右のみ適用される|
|`width`が指定されていない場合|ボックスはインライン方向に伸びる。コンテナで使用可能な方向を埋める。多くの場合、ボックスはコンテナと同じ幅になり、利用可能な空間の100%を占める||
|規定で設定されている要素の例|`<h1>` `<p>`|`<a>` `<span>` `<em>` `<strong>`|
|比較例|![スクリーンショット 2024-12-30 12.14.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/4617f175-45fc-5500-90f8-cfc1f440d38b.png)|![スクリーンショット 2024-12-30 12.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/4c451c46-8788-1036-70bf-409e92b6f080.png)|


## 内側の表示型について
- 内側の表示型は、ボックス内の要素をどのようにレイアウトするかを指定する
- 他に指示がない限り、ボックス内の要素は[通常フロー](https://developer.mozilla.org/ja/docs/conflicting/Learn_web_development/Core/CSS_layout/Introduction)でレイアウトされる（通常フローについては後続で説明しています）
- 例：`display: flex;`を設定した場合
    - 要素の外側の表示型は`block`を使用
    - 要素の内側の表示型は`flex`に変更される
        - 直接の子要素はフレックスアイテムになる

![スクリーンショット 2024-12-30 12.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/34bf322e-4348-7222-7ef0-1058b3047911.png)


## CSSボックスモデルについて
![box-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/994b9b40-eb24-b849-f43a-292b74289570.png)

* ボックスモデルは、ボックスの`マージン`、`境界`、`パディング`、`コンテンツ`がどのように連携して動作し、ページ上に表示されるボックスを生成するのかを定義する
* インラインボックスは、ボックスモデルで定義されている動作の一部だけを使用する
* マージンはボックスの実際のサイズにはカウントされない

### ブロックボックスの構成要素
| 構成要素 | 制御するプロパティ |
|:-|:-|
| コンテンツボックス  | `width`,`height`など  |
|  パディングボックス | `padding`など  |
| 境界ボックス  | `border`など  |
| マージンボックス  | `margin`など  |

### 標準ボックスモデルと代替ボックスモデル
| 比較 | 標準ボックスモデル | 代替ボックスモデル |
|:-|:-|:-|
|ボックスの合計サイズ|すべての`padding`と`border`がその幅と高さに追加される|コンテンツ領域の幅は、その幅から`padding`と`border`を引いたものになる|
|設定|ブラウザの規定|`box-sizing: border-box;`を設定|
|比較画像|![standard-box-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/fd85d806-2561-a0db-7606-067ccabfc075.png)|![alternate-box-model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/8f858ad9-db85-d38f-f893-954f2b6af44d.png)|

## マージン、パディング、境界
||マージン([margin](https://developer.mozilla.org/ja/docs/Web/CSS/margin))|パディング([padding](https://developer.mozilla.org/ja/docs/Web/CSS/padding))|境界([border](https://developer.mozilla.org/ja/docs/Web/CSS/border))|
|:-|:-|:-|:-|
|用途|他の要素をボックスから遠ざける|コンテンツを境界から離す|ボックスのマージンとパディングの間|
||マージンが接する2つの要素が存在する場合、マージンが正の値か負の値かによって表示結果が変わる（[マージンの相殺](https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Box_model#%E3%83%9E%E3%83%BC%E3%82%B8%E3%83%B3)）|要素に背景が適用されると、パディングの背後に表示される||

## ボックスモデルとインラインボックスの比較
||ボックスモデル|インラインボックス|
|:-|:-|:-|
|プロパティ|上記のすべてが適用される|`width`と`height`が適用されない|
|||![スクリーンショット 2024-12-30 12.35.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/9f9dc590-c773-5618-d3b8-f28193622d23.png)|
|||上下のマージン、パディング、境界は尊重されるが、他のコンテンツとインラインボックスとの位置関係は変わらない / 左右のパディング、マージン、境界は、他のコンテンツをボックスから遠ざける|
|||![スクリーンショット 2024-12-30 12.38.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/a4a4913b-c78d-1469-8a15-2f8b5747525c.png)|

### display: inline-blockについて
- アイテムを改行させたくないが、`width`と`height`を適用し上記のような重なりを避けたい場合に使用する
- `width`と`height`が適用される
- パディング、マージン、境界により、他の要素がボックスから遠ざけられる

|display: inline|display: inline-block|
|:-|:-|
|![スクリーンショット 2024-12-30 12.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/2ba4ea3f-8114-6fd9-7484-769a758a4caa.png)|![スクリーンショット 2024-12-30 12.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/ed36e983-0607-abb0-defb-ab2df6e50126.png)|

https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Box_model

# CSSにおけるレイアウトの通常フローとは？
:::note info
- CSSを適用しない限り、Webページ上の要素は通常フローでレイアウトされる
- 通常フローを理解した上で、要素の位置を調整したり、要素を完全に取り除くなどして、レイアウトを変更する
:::

### 通常フロー
1\. まず始めに、個々の要素ボックスは要素のコンテンツを取る
2\. コンテンツに対して、周りにパディング、境界、マージンを追加することで個々のボックスがレイアウトされる
3\. そして、要素間の相互作用の仕方は、要素がブロックレベルかインラインレベルかで振る舞いが変化する（以下の表参照）

### ブロックレベル要素とインラインレベル要素の振る舞い
||ブロックレベル要素|インラインレベル要素|
|:-|:-|:-|
|サイズ|包含する親要素の利用可能なインライン空間を満たし、そのコンテンツを収めるためにブロック方向に成長する|そのコンテンツのサイズに依存する|
|要素間の相互作用|ブロックのフロー方向にレイアウトされ、各要素は最後の行の下に新しい行として現れ、各要素は指定したマージンで区切られる|親ブロックレベル要素の内側に余白がある限り、互いに同じ行に配置され、隣接するテキストコンテンツに配置される|

![スクリーンショット 2024-12-30 13.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/8642e071-88a4-7647-34bb-fce3dba24dc8.png)

https://developer.mozilla.org/ja/docs/conflicting/Learn_web_development/Core/CSS_layout/Introduction

# CSSのレイアウト技術について
:::note info
- 制御を何もしない場合、ブラウザは通常フローに従ってHTMLをレイアウトする
- 上下に並んで表示される要素がブロック要素、横に並んで表示される要素がインライン要素
- CSSで何かレイアウトすると、その要素は通常フローから遠ざかることになる
:::

※主なページレイアウト技術
- 通常フロー
- [display](https://developer.mozilla.org/ja/docs/Web/CSS/display)プロパティ
- フレックスボックス
- グリッド
- 浮動要素
- 位置指定
- 表レイアウト
- 段組レイアウト

https://developer.mozilla.org/ja/docs/Learn_web_development/Core/CSS_layout

## `display`プロパティ
:::note
-  あるアイテムを`block`から`inline`に、または`inline`から`block`に切り替えて、規定の表示方法を変更できる
-  CSSグリッドやフレックスボックスのように、特定の`display`の値によって有効になる全体的なレイアウト方法も存在する
:::

## フレックスボックス
:::note
- 要素を行または列に並べる1次元のレイアウト方法
- フレックスボックスができること
    - コンテンツのブロックを、親コンテンツの中で上下中央に配置する
    - 利用できる幅や高さに関係なく、コンテナの全ての子が利用できる幅や高さを等しくする
    - コンテンツの量が異なっていても、全ての段の高さが同じになる
:::

|`display: block;`|`display: flex;`|
|:-|:-|
|![スクリーンショット 2024-12-30 14.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/db573d31-74dd-cdb0-f2d3-88ea6cae41e8.png)|![スクリーンショット 2024-12-30 14.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/dc4e70ec-9527-9e7c-fa79-20e0327c0015.png)|

- 呼び名
    - `display: flex;`が指定された要素を**フレックスコンテナー**と呼ぶ
    - その子を**フレックスアイテム**と呼ぶ
- **フレックスコンテナー**は、ブロックレベルのコンテンツとして表示される

### フレックスモデル
![flex_terms (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/1442b8d4-e6ab-d682-9a8f-4bafb6b3914c.png)

||フレックスモデルについて|
|:-|:-|
|列か行か|[flex-direction](https://developer.mozilla.org/ja/docs/Web/CSS/flex-direction)プロパティで指定し、規定では`row`が指定されている（つまり行）|
|折り返し|ブラウザの規定では、全てのフレックスアイテムを単一の行または列に配置しようとするため、コンテナをはみ出ることがある / 修正する場合は`flex-wrap: wrap;`を指定する|
|フレックスアイテムのサイズ変更|[flex](https://developer.mozilla.org/ja/docs/Web/CSS/flex)プロパティによってフレックスアイテムの占めるスペースの割合を制御できる|
|水平方向と垂直方向の配置|[align-items](https://developer.mozilla.org/ja/docs/Web/CSS/align-items)プロパティが交差軸上の配置の制御、[justify-content](https://developer.mozilla.org/ja/docs/Web/CSS/justify-content)プロパティが主軸上の配置を制御する|
|ネストしたフレックスボックス|フレックスアイテムをフレックスコンテナとしても設定して、その子も柔軟な箱のようにレイアウトすることが可能|

## グリッド
:::note
- Webブラウザの2次元レイアウトシステム
- `display: grid;`を指定することで、行と列に要素を配置できる
:::

![スクリーンショット 2024-12-31 13.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/e4ca44db-d79e-6052-60cc-a48112cede5e.png)


## 浮動ボックス
:::note
- [float](https://developer.mozilla.org/ja/docs/Web/CSS/float)プロパティは、ウェブ開発者がテキストの段の中に画像が浮動し、テキストがその左または右に回り込むようなレイアウトを実装するために導入された
:::

![スクリーンショット 2024-12-31 13.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/7843b1d7-a2aa-c4a6-d851-7ef581e3eb21.png)


- 浮動ボックスの挙動
    - 通常のレイアウトフローから除かれる
    - その親コンテナの特定の位置に固定される
    - 通常のレイアウトフローで浮動した要素の下にくるコンテンツは、浮動要素の周りを回り込み、浮動した要素の上まで空間を占める


## 位置指定
:::note
- 位置指定を使用することで、通常のレイアウトフローから要素を取り出して異なる振る舞いをさせることができる
- 互いに重なったり、常にブラウザのビューポート内の同じ場所に留まったりさせることができる
:::
- [position](https://developer.mozilla.org/ja/docs/Web/CSS/position)プロパティ
    - 位置指定を使用すると、通常フローのときに配置されていた場所から別の場所に移動できる
    - 5種類の位置指定
        - 静的位置指定 `static`
             ![スクリーンショット 2024-12-31 13.48.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/fa3b9bf5-c5fd-0f09-c04e-6e274a835b0b.png)

        - 相対位置指定 `relative`
            - `top: 30px; left: 30px;`
             ![スクリーンショット 2024-12-31 13.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/021d8dbc-fcf7-70d3-fc5d-309187a35c35.png)

        - 絶対位置指定 `absolute`
            - `top: 30px; left: 30px;`
             ![スクリーンショット 2024-12-31 13.51.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/b73b3c7c-c427-f3e3-027b-5f35241205e4.png)

        - 固定位置指定 `fixed`
            - `top: 30px; left: 30px;`
             ![スクリーンショット 2024-12-31 13.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191928/a274ca43-ed33-f467-9820-8140ac66e5e7.png)

        - 粘着位置指定 `sticky`

### 位置指定の比較
||定義|位置の指定方法|
|:-|:-|:-|
|`static`|要素を通常フロー内の通常の位置に配置する|通常フローに配置される|
|`relative`|要素を通常フローの位置からずらす|通常フローの位置から、`top`、`bottom`、`left`、`right`プロパティを使用して指定する|
|`absolute`|要素を通常フローから完全に外し、コンテナーからのオフセットを適用して配置する|包含要素に対する位置を`top`、`bottom`、`left`、`right`プロパティを使用して指定する|
|`fixed`|通常フローから要素を完全に外し、ビューポートからのオフセットを適用して配置する|ビューポートに対する位置を`top`、`bottom`、`left`、`right`プロパティを使用して指定する|
|`sticky`|要素が定義されたビューポートからのオフセットにぶつかるまで、要素は`static`のようにふるまい、その位置からは`fixed`のようにふるまう|ビューポートに対する位置を`top`、`bottom`、`left`、`right`プロパティを使用して指定する|

:::note
絶対位置指定要素の「包含要素」はどの要素?
-

包含ブロックを識別するプロセスは、要素の`position`プロパティの値に全面的に依存する

|`position`|包含ブロック|
|:-|:-|
|`static`|ブロックコンテナまたは整形コンテキスト要素である直近の祖先要素の**コンテンツボックス**の辺によって構成|
|`relative`|同上|
|`sticky`|同上|
|`absolute`|`position`の値が`static`以外の直近の祖先要素における**パディングボックス**の辺によって構成|
|`fixed`|ビューポート(連続的なメディアの場合)またはページ領域(ページメディアの場合)によって確立|
:::

https://developer.mozilla.org/ja/docs/Web/CSS/Containing_block#identifying_the_containing_block

## レスポンシブデザインについて
:::note info
レスポンシブデザイン(RWD)とは、ユーザビリティを確保しながら、全ての画面サイズと解像度でWebページをうまく描画するための手法
つまり複数の端末に対応したウェブをデザインする方法
:::

### レスポンシブデザインの前身：モバイルウェブデザイン
- 基本的にレスポンシブデザインと同じで、レイアウト、コンテンツ、パフォーマンスにおいて、物理的属性の異なる端末間でWebサイトがうまく動作するようにすることを目的としている
- 主な違い
    - 対象となる端末
        - 以前はデスクトップかモバイルかという話だったが、今では利用できる端末はデスクトップ、ラップトップ、タブレット、時計など多岐にわたる
    - 使用できる技術
        - 以前はサーバー側に頼る部分もあったが、現代の技術はレスポンシブな使い勝手を作成するのに非常に優れている

### レスポンシブデザインについて

- そもそもHTMLは基本的にレスポンシブ
- CSSを含まないHTMLだけのWebページを作成し、ウィンドウのサイズを変更すると、ブラウザはビューポートに合わせてテキストを自動的に再フローする
    - 問題点
        - 広いモニターに全画面表示された長い表のテキストは読みにくい場合もある
        - 逆にCSSで広い画面の行の長さを縮小すると、サイトが潰れて見えることもある
        - 固定幅を設定しても、画面が狭い端末ではスクロールバーが表示され、広い画面では余白が多くなってしまう
- レスポンシブデザインは単体の技術ではなく、**手法のひとつ**
- コンテンツを表示するあらゆる端末に応じることができるレイアウトを作成するを作成するベストプラクティス群を表す

### メディアクエリー
- メディアクエリーを使用すると、一連の検査を実行しCSSを選択的に適用して、ユーザーのニーズに合わせたページを適切にスタイル設定することができる
- メディアクエリーが導入されてレイアウトが変更されるポイントは**ブレークポイント**と呼ばれる
- **モバイルファーストデザイン**
    - まず狭い画面の端末用に単純な単一列レイアウトを作成
    - 次に大きな画面であるかをチェックして複数列レイアウトを処理するのに十分な画面幅がある場合は、複数列レイアウトを実装する
    - ブレークポイントを使用する場合のベストプラクティスとして、個々の端末の絶対サイズではなく、相対的な単位を使用する


https://developer.mozilla.org/ja/docs/Learn_web_development/Core/CSS_layout/Responsive_Design



# 要素のオーバーフロー
:::note info
### オーバーフローとは？
- オーバーフローはボックス内のコンテンツが多すぎる場合に発生する
- CSSはデータ損失を防止するために、可能な限りコンテンツを隠さない
:::

### overflowプロパティ
- はみ出したコンテンツをどのように処理するべきかブラウザに伝えることができる
- 規定値は`visible`

### オーバーフローとブロック整形コンテキスト
- [overflow](https://developer.mozilla.org/ja/docs/Web/CSS/overflow)の値に`scroll`または`auto`を使用すると、ブロック整形コンテキスト (BFC = Block Formatting Context) を生成する
- 外側にあるコンテンツはブロック整形コンテキストの中に入り込むことはできなくなる

https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Overflow

# CSSによるサイズ設定
### 自然なサイズまたは内在サイズ
- HTML要素には自然なサイズがあり、CSSの影響を受ける前に設定される
- 例えば、画像サイズにはページに埋め込む画像ファイルで定義された幅と高さがあり、このサイズを**内在サイズ**と呼ばれる
- 高さと幅を変更しない場合、その内在サイズを使用して表示される
- `<div>`にも独自のサイズがないため、そのサイズはコンテンツのサイズに由来する

### サイズの指定 外部サイズ
- デザインの要素に特定のサイズを与えることもできる
- 要素にサイズが指定されている場合、それを外部サイズと呼ばれる
- 要素の中に収まるスペースよりも多くのコンテンツがある場合、高さを設定するとコンテンツが**オーバーフロー**する可能性も
- オーバーフローのため、要素の高さを長さまたはパーセント値で固定することは、ウェブ上で注意する必要がある

### 比率指定
- コンテナ内のボックスの場合、子ボックスにパーセント値を与えると、親のコンテナーのパーセント値になる
- これはパーセント値がそれを包含するブロックのサイズに対して解決されるため

### 最小サイズ、最大サイズ
- 常に特定の高さ以上にしたい場合、ボックスに`min-height`を指定する
    - ボックスは常にその高さ以上になる
    - ボックスの最小の高さよりも多くのコンテンツがある場合、ボックスの高さが高くなる
    - これはオーバーフローを回避しながら、可変量のコンテンツを処理するのに役立つ
- `max-width`は、固有の幅で表示するための十分なスペースがない場合に画像を縮小し、その幅よりも大きくならないようにする
    - 例として、画像の`width: 100%`を設定する場合、その固有の幅がコンテナよりも小さいと、画像は強制的に引き伸ばされて大きくなってしまう
    - 固有の幅がコンテナーよりも大きい場合、オーバーフローする
    - 代わりに`max-width: 100%`を使用すると、画像は本来のサイズよりも小さくなりますが、サイズの`100％`で止まる 

### ビューポートに関する単位
- ビューポートに関連する単位を使用すると、ユーザーのビューポートを基準にしてサイズを変更できる

https://developer.mozilla.org/ja/docs/Learn_web_development/Core/Styling_basics/Sizing