最近、下記の理由から、WordPressの挿入した画像のimgタグにwidth/heightがあることに違和感を感じてました。
- レスポンシブにフルードイメージとして画像を取り扱う際に、imgタグ内のwidth/heightの値の意味が薄れる (画像本来のサイズを指定すればよいのだろうか?)。
- imgタグ内のwidth/heightは、alt属性のように必須ではない。
- width/height属性のせいで、微量ではあるがhtmlのコードサイズが肥大化してしまう。
- FTPなどで違うサイズの画像を差し替えた際に、該当のimgタグのwidth/height値を直してあげないといけない。
しかしながら、imgタグのwidth/heightを削除すると下記のようなデメリットもあるようです。
- 画像のレンダリング速度の低下(1割程度?)
- JavaScriptのwidth/height取得のタイミングがズレてうまく機能しないことがある
→ でも、これって「jQuery(document).ready(function(){」内でwidth/heightを取得してるからであって、「jQuery.event.add(window,”load”,function(){」内でwidth/heightを取得すればOK? - HTMLのローディングが途中で止まった際にレイアウトが崩れる可能性がある
→ 画像が飛んでしまって崩れるようなレイアウトって・・・
上記の1は痛いですが以上を踏まえて、imgタグのwidth/heightを削除したいと考えた場合、他のブログでも紹介されているとおり、下記のような方法になります。
/** * 画像挿入時にwidthとheightを削除する */ function remove_width_attribute( $html ) { $html = preg_replace( '/(width|height)="\d*"\s/', "", $html ); return $html; } add_filter( 'post_thumbnail_html', 'remove_width_attribute', 10 ); add_filter( 'image_send_to_editor', 'remove_width_attribute', 10 );
しかしながら、上記の方法では、画像挿入時にしかwidth/heightを削除しません。具体的には、WP3.9あたりからTinyMCEが4.0にアップされ画像変更のUIが改善されましたが、画像変更(右寄せ・左寄せ等)すると、width/height属性が復活してしまいます。そこで、更に下記のように行えば、width/height属性は復活せず消えたままにしておけます。
// 画像編集の際に勝手にwidth/heightが入るので削除 function my_tinymce_remove_width_attribute( $options ) { if ( $options['tinymce'] ) { wp_enqueue_script( 'tinymce_remove_width_attribute', get_template_directory_uri() . '/js/wp-admin-remove_width_attribute.js', array( 'jquery' ), '1.0.0', true); } } add_action( 'wp_enqueue_editor', 'my_tinymce_remove_width_attribute', 10, 1 );
(function( $, wp, _ ) { if ( ! wp.media.events ) { return; } wp.media.events.on( 'editor:image-update', function( options ) { var editor = options.editor, dom = editor.dom, image = options.image; dom.setAttribs( image, {'width': null, 'height': null}); } ); })( jQuery, wp, _ );
以上、何かのご参考になりましたら幸いです。
※上記の内容は全て自己責任のもとでご参考ください。