PCとSPでの画像の出しわけやwebpの対応でpugのmixinを作成する機会が度々あったので、作成方法をメモしておきます。
サンプルコード
まずはPCとSPで画像を出し分ける場合です。
_mixinディレクトリを作成して、その中に_picture.pugというファイル名で追加します。
//- options path: 'ファイルパス', pc: 'PCファイル名(拡張子あり)', sp: 'SPファイル名(拡張子あり)', alt: 'alt内容(オプション)', media: 切り替える画面サイズ(オプション) mixin picture(options) - options = options || {}; picture source( media="(min-width:" + (options.media || 768) + "px)" srcset=`${options.path}${options.pc}` ) img(src=`${options.path}${options.sp}` alt=(options.alt || ''))
基本的に767px以下がSP画像、768px以上がPC画像という場合が多いので、そのルールをベースにしています。
使用する際はmixinのファイルをインクルードした上で、必要なオプションを設定して使用すればOKです。
include /_mixin/_picture.pug +picture({ path: '/img/', pc: 'pc.png', sp: 'sp.png' })
以下のように出力されます。
<picture> <source media="(min-width:768px)" srcset="/img/pc.png"/> <img src="/img/sp.png" alt=""/> </picture>
オプションでaltとmediaの切り替え位置を設定できます。
+picture({ path: '/img/', pc: 'pc.png', sp: 'sp.png', alt: 'alt-text', media: 992 })
altとmediaを変更することができました。
<picture> <source media="(min-width:992px)" srcset="/img/pc.png"/> <img src="/img/sp.png" alt="alt-text"/> </picture>
次にwebpを使用する場合です。
先ほどの_picture.pugを変更します。
//- options path: 'ファイルパス', name: 'ファイル名(拡張子なし。PCと画像を出し分ける場合はSPのファイル名)', type: '元の拡張子', pc: 'PCのファイル名(拡張子なし。オプション)', alt: 'alt内容(オプション)' mixin picture(options) - options = options || {}; picture if(!options.pc) source(type="image/webp" srcset=`${options.path}${options.name}.webp`) else source( type="image/webp" media="(max-width:767px)" srcset=`${options.path}${options.name}.webp` ) source( type="image/webp" media="(min-width:768px)" srcset=`${options.path}${options.pc}.webp` ) source( media="(min-width:768px)" srcset=`${options.path}${options.pc}.${options.type}` ) img(src=`${options.path}${options.name}.${options.type}` alt=(options.alt || ''))
webpの出しわけのみ(PCとSPで同じ画像)の場合、画像パスとファイル名、元の拡張子を指定します。
+picture({ path: '/img/', name: 'filename', type: 'png' })
以下のように出力されました。
<picture> <source type="image/webp" srcset="/img/filename.webp"/> <img src="/img/filename.png" alt=""/> </picture>
PCとSPで画像の出しわけもする場合は、PCの画像ファイル名の指定を追加します。
この場合、元々指定していたnameのファイルはSPで使用する画像になります。
+picture({ path: '/img/', name: 'filename', type: 'png', pc: 'pc-filename', alt: 'alt-text' })
これでwebpとPC・SPの画像出しわけができました。
<picture> <source type="image/webp" media="(max-width:767px)" srcset="/img/filename.webp"/> <source type="image/webp" media="(min-width:768px)" srcset="/img/pc-filename.webp"/> <source media="(min-width:768px)" srcset="/img/pc-filename.png"/> <img src="/img/filename.png" alt="alt-text"/> </picture>
コメントが承認されるまで時間がかかります。