aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/css/transform-function/index.html
blob: 192ef4aa4c6807cea5bd274c3c4b206ae5619dbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
---
title: <transform-function>
slug: Web/CSS/transform-function
tags:
  - CSS
  - CSS Data Type
  - CSS Transforms
  - Data Type
  - Layout
  - Reference
translation_of: Web/CSS/transform-function
---
<div>{{CSSRef}}</div>

<p><a href="/ja/docs/Web/CSS">CSS</a><code>&lt;transform-function&gt;</code> <a href="/ja/docs/Web/CSS/CSS_Types">データ型</a>は、要素の外見の変形を表します。変換<a href="/ja/docs/Web/CSS/CSS_Functions">関数</a>は二次元または三次元空間で要素を回転、拡大縮小、歪曲、移動させることができます。これは {{cssxref("transform")}} プロパティの中で使用されます。</p>

<h2 id="Syntax" name="Syntax">構文</h2>

<p><code>&lt;transform-function&gt;</code> データ型は、以下に示した変換関数のうちの一つを使用して指定します。各関数は二次元または三次元の座標操作を適用します。</p>

<h3 id="Matrix_transformation" name="Matrix_transformation">行列変換</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/matrix">matrix()</a></code></dt>
 <dd>二次元の同次変換行列を記述します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/matrix3d">matrix3d()</a></code></dt>
 <dd>三次元の変換を4×4の同次行列で記述します。</dd>
</dl>

<h3 id="Perspective" name="Perspective">視点距離</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/perspective">perspective()</a></code></dt>
 <dd>ユーザーと z=0 平面との間の距離を設定します。</dd>
</dl>

<h3 id="Rotation" name="Rotation">回転</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/rotate">rotate()</a></code></dt>
 <dd>要素を二次元平面上で特定の点を中心に回転します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/rotate3d">rotate3d()</a></code></dt>
 <dd>要素を三次元空間で特定の軸を中心に回転します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/rotateX">rotateX()</a></code></dt>
 <dd>要素を水平軸を中心に回転します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/rotateY">rotateY()</a></code></dt>
 <dd>要素を垂直軸を中心に回転します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/rotateZ">rotateZ()</a></code></dt>
 <dd>要素を Z 軸を中心に回転します。</dd>
</dl>

<h3 id="Scaling_resizing" name="Scaling_resizing">拡大縮小</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/scale">scale()</a></code></dt>
 <dd>要素を二次元平面上で拡大または縮小します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/scale3d">scale3d()</a></code></dt>
 <dd>要素を三次元空間で拡大または縮小します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/scaleX">scaleX()</a></code></dt>
 <dd>要素を水平に拡大または縮小します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/scaleY">scaleY()</a></code></dt>
 <dd>要素を垂直に拡大または縮小します。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/scaleZ">scaleZ()</a></code></dt>
 <dd>要素を Z 軸方向に拡大または縮小します。</dd>
</dl>

<h3 id="Skewing_distortion" name="Skewing_distortion">歪め</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/skew">skew()</a></code></dt>
 <dd>要素を二次元平面上で歪ませます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/skewX">skewX()</a></code></dt>
 <dd>要素を水平方向に歪ませます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/skewY">skewY()</a></code></dt>
 <dd>要素を垂直方向に歪ませます。</dd>
</dl>

<h3 id="Translation_moving" name="Translation_moving">平行移動</h3>

<dl>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/translate">translate()</a></code></dt>
 <dd>要素を二次元平面上で平行移動させます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/translate3d">translate3d()</a></code></dt>
 <dd>要素を三次元空間で平行移動させます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/translateX">translateX()</a></code></dt>
 <dd>要素を水平方向に平行移動させます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/translateY">translateY()</a></code></dt>
 <dd>要素を垂直方向に平行移動させます。</dd>
 <dt><code><a href="/ja/docs/Web/CSS/transform-function/translateZ">translateZ()</a></code></dt>
 <dd>要素を Z 軸方向に平行移動させます。</dd>
</dl>

<h2 id="Description" name="Description">解説</h2>

<p>HTML 要素の寸法や形状を記述するために様々な座標モデルが用いられることがあり、同様に変換にも適用されます。最も一般的なものは、<a href="https://ja.wikipedia.org/wiki/%E7%9B%B4%E4%BA%A4%E5%BA%A7%E6%A8%99%E7%B3%BB">直交座標系</a>ですが、<a href="https://en.wikipedia.org/wiki/Homogeneous_coordinates">同次座標系</a>が用いられることもあります。</p>

<h3 id="Cartesian_coordinates" name="Cartesian_coordinates">直交座標系</h3>

<p><a href="/@api/deki/files/5796/=coord_in_R2.png"><img src="/files/3438/coord_in_R2.png" style="float: right;"></a></p>

<p>直交座標系では、二次元の点は、 X 座標 (横座標) と Y 座標 (縦座標) の二つの値を使用して記述します。これは <code>(x, y)</code> のベクトル表記で表現されます。</p>

<p>CSS (および多くのコンピューターグラフィック) では、原点 <code>(0, 0)</code> が各要素の<em>左上</em>を表します。正の座標は原点から下および右に向かい、負の座標は上および左に向かいます。従って、右に2単位、下に5単位では <code>(2, 5)</code> となり、左に3単位、上に12単位では <code>(-3, -12)</code> となります。</p>

<h3 id="Transformation_functions" name="Transformation_functions">変換関数</h3>

<p>変換関数は、座標の値を操作することによって要素の外見を変更します。線形変換関数は、次のように2×2の行列で記述されます。</p>

<p style="text-align: center;"><math> <mfenced> <mtable> <mtr><mtd><mi>a</mi></mtd><mtd><mi>c</mi></mtd></mtr> <mtr><mtd><mi>b</mi></mtd><mtd><mi>d</mi></mtd></mtr> </mtable> </mfenced> </math></p>

<p>関数は行列の乗算によって要素に適用されます。つまり、それぞれの座標は行列の値に基づいて変化します。</p>

<p style="text-align: center;"><math> <mfenced> <mtable> <mtr><mtd><mi>a</mi></mtd><mtd><mi>c</mi></mtd></mtr> <mtr><mtd><mi>b</mi></mtd><mtd><mi>d</mi></mtd></mtr> </mtable> </mfenced> <mfenced> <mtable> <mtr><mtd><mi>x</mi></mtd></mtr><mtr><mtd><mi>y</mi></mtd></mtr> </mtable> </mfenced> <mo>=</mo> <mfenced> <mtable> <mtr> <mtd><mi>a</mi><mi>x</mi><mo>+</mo><mi>c</mi><mi>y</mi></mtd> </mtr> <mtr> <mtd><mi>b</mi><mi>x</mi><mo>+</mo><mi>d</mi><mi>y</mi></mtd> </mtr> </mtable> </mfenced> </math></p>

<p>一行の中に複数の変換を適用することもできます。</p>

<p style="text-align: center;"><math> <mfenced> <mtable> <mtr> <mtd><msub><mi>a</mi><mn>1</mn></msub></mtd> <mtd><msub><mi>c</mi><mn>1</mn></msub></mtd> </mtr> <mtr> <mtd><msub><mi>b</mi><mn>1</mn></msub></mtd> <mtd><msub><mi>d</mi><mn>1</mn></msub></mtd> </mtr> </mtable> </mfenced> <mfenced> <mtable> <mtr> <mtd><msub><mi>a</mi><mn>2</mn></msub></mtd> <mtd><msub><mi>c</mi><mn>2</mn></msub></mtd> </mtr> <mtr> <mtd><msub><mi>b</mi><mn>2</mn></msub></mtd> <mtd><msub><mi>d</mi><mn>2</mn></msub></mtd> </mtr> </mtable> </mfenced> <mo>=</mo> <mfenced> <mtable> <mtr> <mtd> <msub><mi>a</mi><mn>1</mn></msub> <msub><mi>a</mi><mn>2</mn></msub> <mo>+</mo> <msub><mi>c</mi><mn>1</mn></msub> <msub><mi>b</mi><mn>2</mn></msub> </mtd> <mtd> <msub><mi>a</mi><mn>1</mn></msub> <msub><mi>c</mi><mn>2</mn></msub> <mo>+</mo> <msub><mi>c</mi><mn>1</mn></msub> <msub><mi>d</mi><mn>2</mn></msub> </mtd> </mtr> <mtr> <mtd> <msub><mi>b</mi><mn>1</mn></msub> <msub><mi>a</mi><mn>2</mn></msub> <mo>+</mo> <msub><mi>d</mi><mn>1</mn></msub> <msub><mi>b</mi><mn>2</mn></msub> </mtd> <mtd> <msub><mi>b</mi><mn>1</mn></msub> <msub><mi>c</mi><mn>2</mn></msub> <mo>+</mo> <msub><mi>d</mi><mn>1</mn></msub> <msub><mi>d</mi><mn>2</mn></msub> </mtd> </mtr> </mtable> </mfenced> </math></p>

<p>この記法で、最もよく使われる回転、拡大縮小、傾斜の変換を記述し、合成することができます。 (実際、すべての変換が記述できる線形関数です。) 変換の合成は右から左の順に効果的に適用されます。</p>

<p>しかし、主要な変換のうち平行移動は線形ではなく、従ってこの記法を使用する場合は特例とする必要があります。平行移動のベクトル <code>(tx, ty)</code> は、二つの追加の引数で別に表現しなければなりません。</p>

<div class="note">
<p><strong>注:</strong> 直交座標よりも難解ですが、<a class="external" href="https://ja.wikipedia.org/wiki/%E5%B0%84%E5%BD%B1%E5%B9%BE%E4%BD%95%E5%AD%A6">射影幾何学</a><a class="external" href="https://en.wikipedia.org/wiki/Homogeneous_coordinates">同次座標</a>は3×3の変換行列を使用するので、線形関数として平行移動をより簡単に表現できます。</p>
</div>

<h2 id="Examples" name="Examples"></h2>

<h3 id="Transform_function_comparison" name="Transform_function_comparison">変換関数の比較</h3>

<p>次の例では、 DOM 要素と変換から作成された 3D 立方体と、立方体を変換するためのさまざまな変換関数を選択できる選択メニューを提供しています。</p>

<p>1 つを選択すると、立方体に変換が適用されます。 2 秒後に立方体は開始状態に戻ります。立方体の開始状態は、 <code>transform3d()</code> を使用してわずかに回転され、すべての変換の効果を見ることができます。</p>

<h4 id="HTML">HTML</h4>

<pre class="brush: html notranslate">&lt;main&gt;
  &lt;section id="example-element"&gt;
      &lt;div class="face front"&gt;1&lt;/div&gt;
      &lt;div class="face back"&gt;2&lt;/div&gt;
      &lt;div class="face right"&gt;3&lt;/div&gt;
      &lt;div class="face left"&gt;4&lt;/div&gt;
      &lt;div class="face top"&gt;5&lt;/div&gt;
      &lt;div class="face bottom"&gt;6&lt;/div&gt;
  &lt;/section&gt;

  &lt;div class="select-form"&gt;
    &lt;label&gt;Select a transform function&lt;/label&gt;
    &lt;select&gt;
      &lt;option selected&gt;Choose a function&lt;/option&gt;
      &lt;option&gt;rotate(360deg)&lt;/option&gt;
      &lt;option&gt;rotateX(360deg)&lt;/option&gt;
      &lt;option&gt;rotateY(360deg)&lt;/option&gt;
      &lt;option&gt;rotateZ(360deg)&lt;/option&gt;
      &lt;option&gt;rotate3d(1, 1, 1, 90deg)&lt;/option&gt;
      &lt;option&gt;scale(1.5)&lt;/option&gt;
      &lt;option&gt;scaleX(1.5)&lt;/option&gt;
      &lt;option&gt;scaleY(1.5)&lt;/option&gt;
      &lt;option&gt;scaleZ(1.5)&lt;/option&gt;
      &lt;option&gt;scale3d(1, 1.5, 1.5)&lt;/option&gt;
      &lt;option&gt;skew(17deg, 13deg)&lt;/option&gt;
      &lt;option&gt;skewX(17deg)&lt;/option&gt;
      &lt;option&gt;skewY(17deg)&lt;/option&gt;
      &lt;option&gt;translate(100px, 100px)&lt;/option&gt;
      &lt;option&gt;translateX(100px)&lt;/option&gt;
      &lt;option&gt;translateY(100px)&lt;/option&gt;
      &lt;option&gt;translateZ(100px)&lt;/option&gt;
      &lt;option&gt;translate3d(50px, 50px, 50px)&lt;/option&gt;
      &lt;option&gt;perspective(200px)&lt;/option&gt;
      &lt;option&gt;matrix(1, 2, -1, 1, 80, 80)&lt;/option&gt;
      &lt;option&gt;matrix3d(1,0,0,0,0,1,3,0,0,0,1,0,50,100,0,1.1)&lt;/option&gt;
    &lt;/select&gt;
  &lt;/div&gt;
&lt;/main&gt;</pre>

<h4 id="CSS">CSS</h4>

<pre class="brush: css notranslate">main {
  width: 400px;
  height: 200px;
  padding: 50px;
  background-image: linear-gradient(135deg, white, cyan, white);
}

#example-element {
  width: 100px;
  height: 100px;
  transform-style: preserve-3d;
  transition: transform 1.5s;
  transform: rotate3d(1, 1, 1, 30deg);
}

.face {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  position: absolute;
  backface-visibility: inherit;
  font-size: 60px;
  color: #fff;
}

.front {
    background: rgba(90,90,90,.7);
    transform: translateZ(50px);
}

.back {
    background: rgba(0,210,0,.7);
    transform: rotateY(180deg) translateZ(50px);
}

.right {
  background: rgba(210,0,0,.7);
  transform: rotateY(90deg) translateZ(50px);
}

.left {
  background: rgba(0,0,210,.7);
  transform: rotateY(-90deg) translateZ(50px);
}

.top {
  background: rgba(210,210,0,.7);
  transform: rotateX(90deg) translateZ(50px);
}

.bottom {
  background: rgba(210,0,210,.7);
  transform: rotateX(-90deg) translateZ(50px);
}

.select-form {
  margin-top: 50px;
}</pre>

<h4 id="JavaScript">JavaScript</h4>

<pre class="brush: js notranslate">const selectElem = document.querySelector('select');
const example = document.querySelector('#example-element');

selectElem.addEventListener('change', () =&gt; {
  if(selectElem.value === 'Choose a function') {
    return;
  } else {
    example.style.transform = `rotate3d(1, 1, 1, 30deg) ${selectElem.value}`;
    setTimeout(function() {
      example.style.transform = 'rotate3d(1, 1, 1, 30deg)';
    }, 2000)
  }
})</pre>

<h4 id="Result" name="Result">結果</h4>

<p>{{EmbedLiveSample('Transform_function_comparison', '100%', 300)}}</p>

<h2 id="Specifications" name="Specifications">仕様書</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
   <th scope="col">状態</th>
   <th scope="col">備考</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('CSS Transforms 2', '#transform-functions', '&lt;transform-function&gt;')}}</td>
   <td>{{Spec2('CSS Transforms 2')}}</td>
   <td>三次元変換関数を追加。</td>
  </tr>
  <tr>
   <td>{{SpecName('CSS3 Transforms', '#transform-functions', '&lt;transform-function&gt;')}}</td>
   <td>{{Spec2('CSS3 Transforms')}}</td>
   <td>初回定義</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>

<div class="hidden">このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 <a class="external" href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> をチェックアウトしてプルリクエストを送信してください。</div>

<p>{{Compat("css.types.transform-function")}}</p>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li>CSS の {{cssxref("transform")}} プロパティ</li>
</ul>