-
Notifications
You must be signed in to change notification settings - Fork 81
/
kimg.vue
353 lines (299 loc) · 11.4 KB
/
kimg.vue
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
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
<template>
<DocsPageTemplate apiDocs>
<DocsPageSection title="Overview" anchor="#overview">
<p><code>KImg</code> displays an image and provides functionality to manipulate it such as setting its dimensions, aspect ratio, scaling, letterboxing, and more.</p>
</DocsPageSection>
<DocsPageSection title="Usage" anchor="#usage">
<p>Unless you set fixed dimensions, <code>KImg</code> is responsive by default.</p>
<p>
<em>Note that the majority of settings are applied to the image container rather than the image itself.</em> If you need to apply dimensions, aspect ratio, etc. directly to the image, you can use <code>'fitXY'</code> <DocsInternalLink href="/kimg#prop:scaleType">
scale type
</DocsInternalLink>.
</p>
<p>
Depending on the scale type and other settings, the image may be letterboxed. When an image is letterboxed, <DocsInternalLink href="/kimg#prop:backgroundColor">
<code>backgroundColor</code>
</DocsInternalLink> (gray by default) fills the remaining space.
</p>
<p>This is in more detail illustrated in the examples below, where the original image dimensions are 200×114 px.</p>
<h3>Rendering within inline and block elements</h3>
<h4>Inline</h4>
<p>When rendered within an inline element, the image preserves its original dimensions by default.</p>
<DocsShowCode language="html">
<span>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</span>
</DocsShowCode>
<DocsShow>
<span>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
/>
</span>
</DocsShow>
<h4>Block</h4>
<p>
When rendered within a block element, the image container fills the parent block element and the image scales with the <code>'centerInside'</code> <DocsInternalLink href="/kimg#prop:scaleType">
scale type
</DocsInternalLink> by default.
</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
/>
</div>
</DocsShow>
<h3>Dimensions</h3>
<p>
You can apply the most common dimensions to the image container via props such as <DocsInternalLink href="/kimg#prop:width">
<code>width</code>
</DocsInternalLink>, <DocsInternalLink href="/kimg#prop:maxHeight">
<code>maxHeight</code>
</DocsInternalLink>, and others. Values may be either numbers or strings consisting of a numeral and a valid unit. The following units are supported: <code>%, cm, em, ex, ch, in, lh, mm, px, rem, rlh, vh, vw</code>. If you don't provide a unit, <code>px</code> will be used by default.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
height="250.2px"
width="100%"
maxWidth="10vw"
:minWidth="25"
/>
</DocsShowCode>
<h3>Alternative text</h3>
<p>
Unless an image is <DocsExternalLink text="decorative" href="https://www.w3.org/WAI/tutorials/images/decorative/" />, you need to provide alternative text via <DocsInternalLink href="/kimg#prop:altText">
<code>altText</code>
</DocsInternalLink>.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
/>
</DocsShowCode>
<p>
If it's meant to be decorative, indicate it by using <DocsInternalLink href="/kimg#prop:isDecorative">
<code>isDecorative</code>
</DocsInternalLink>. Alternative text won't be required in this case and the image will be hidden from assistive technologies.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
isDecorative
/>
</DocsShowCode>
<h3>Scaling</h3>
<p>
The <DocsInternalLink href="/kimg#prop:scaleType">
scale type
</DocsInternalLink> determines how an image scales within the image container.
</p>
<h4><code style="font-weight: bold">'centerInside'</code> scale type</h4>
<p>Scales an image uniformly and maintains its original aspect ratio. Both its width and height are equal to or less than the width and height of the image container. An image can be letterboxed. It's the safest mode as it <em>never distorts an image or impairs its quality.</em></p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="centerInside"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="centerInside"
/>
</div>
</DocsShow>
<h4><code style="font-weight: bold">'contain'</code> scale type</h4>
<p>Behaves similarly to <code>'centerInside'</code> except it ensures that at least one axis of an image fits the image container exactly. The original aspect ratio is maintained. An image can be letterboxed. This mode <em>may impair an image's quality by enlarging it above its original size</em>.</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="contain"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="contain"
/>
</div>
</DocsShow>
<h4><code style="font-weight: bold">'fitXY'</code> scale type</h4>
<p>Scales X and Y axis of an image independently, so that the image matches the container exactly. An image is never letterboxed. This mode <em>may impair an image's quality by enlarging it above its original size, or distort its aspect ratio.</em></p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="fitXY"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
height="200px"
width="100%"
maxWidth="500px"
scaleType="fitXY"
/>
</div>
</DocsShow>
<h3>Aspect ratio</h3>
<p>
You can set the aspect ratio of the image container with
<DocsInternalLink href="/kimg#prop:aspectRatio">
<code>aspectRatio</code>
</DocsInternalLink> and combine it with any of the scale types.
</p>
<p>Note that the ratio styles calculations need to have the width information, therefore it needs to be available in some way. For example, you can set the width directly on <code>KImg</code>. Alternatively, you could ensure that <code>KImg</code>'s parent element has width by setting it explicitly or by using a block element.</p>
<DocsShowCode language="html">
<div>
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
aspectRatio="4:3"
/>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
aspectRatio="4:3"
/>
</div>
</DocsShow>
<h3>Placeholder area</h3>
<p>
The placeholder area is displayed when an image is not available. The area respects the dimensions set on the image container and is gray by default. You can change the area color via <DocsInternalLink href="/kimg#prop:backgroundColor">
<code>backgroundColor</code>
</DocsInternalLink> and use the <DocsInternalLink href="/kimg#slot:placeholder">
<code>#placeholder</code>
</DocsInternalLink>
slot to place content in the area.
</p>
<DocsShowCode language="html">
<div>
<KImg
src=""
isDecorative
aspectRatio="16:9"
maxWidth="200"
>
<template #placeholder>
<span :style="{ display: 'flex', height: '100%', justifyContent: 'center', alignItems: 'center' }">
<KIcon icon="readSolid" />
</span>
</template>
</KImg>
</div>
</DocsShowCode>
<DocsShow block>
<div>
<KImg
src=""
isDecorative
aspectRatio="16:9"
maxWidth="200"
>
<template #placeholder>
<span :style="{ display: 'flex', height: '100%', justifyContent: 'center', alignItems: 'center' }">
<KIcon icon="readSolid" />
</span>
</template>
</KImg>
</div>
</DocsShow>
<h3>Displaying content on top of an image</h3>
<p>
Use <DocsInternalLink href="/kimg#slot:topLeft">
<code>#topLeft</code>
</DocsInternalLink>, <DocsInternalLink href="/kimg#slot:topRight">
<code>#topRight</code>
</DocsInternalLink>, <DocsInternalLink href="/kimg#slot:bottomLeft">
<code>#bottomLeft</code>
</DocsInternalLink>, or <DocsInternalLink href="/kimg#slot:bottomRight">
<code>#bottomRight</code>
</DocsInternalLink> slots to place content on top of the image container.
</p>
<DocsShowCode language="html">
<KImg
src="hummingbird.jpg"
altText="A sitting hummingbird"
>
<template #topLeft>
<span :style="{ display: 'inline-block', margin: '8px', padding: '2px', backgroundColor: 'white' }">
Top left
</span>
</template>
</KImg>
</DocsShowCode>
<DocsShow>
<KImg
:src="require('../assets/hummingbird CC BY-SA 4.0.jpg')"
altText="A sitting hummingbird"
>
<template #topLeft>
<span :style="{ display: 'inline-block', margin: '8px', padding: '2px', backgroundColor: 'white' }">
Top left
</span>
</template>
</KImg>
</DocsShow>
</DocsPageSection>
</DocsPageTemplate>
</template>
<script>
export default {};
</script>
<style lang="scss" scoped>
em {
font-style: normal;
font-weight: bold;
}
</style>