inline-block でレイアウトした結果、Webpack UglifyJsPlugin + Safari で臨死体験

inline-block でレイアウトした結果、Webpack UglifyJsPlugin + Safari で臨死体験

UglifyJsPlugin というか内部の minifier かなにか。

あらすじ

いくらやっても、2 つあわせて width: 100%inline-block カラムが Safari でだけ改行してしまう。

https://jsfiddle.net/yaruLLry/3/ (Safari でみよう。改行しない方もめりこんでるけど)

原因 on Safari

Safari では改行後スペースとタグ間スペースの扱いが違う?

<div> <element/> <element/> </div>

<div>
  <element/>
  <element/>
</div>

原因 on Webpack UglifyJsPlugin

そして Webpack UglifyJsPlugin でのデフォルト minify は <element/>\n <element/><element/> <element/> にします。

解決策

改行を保持する設定をいれること。

// minified
"<div>\n<element/>\n<element/>\n</div>"

設定とか詳細

Webpack 設定

普通だとこうです (たぶん)。

{
  minimize: {
    preserveLineBreaks: true
  }
}

vue-loader を使っていると、vue-html-loader に設定を渡す必要があるのでこうなります。

{
  vue: {
    html: {
      preserveLineBreaks: true
    }
  }
}

なぜ (推測)

inline-block を用いたカラムレイアウトでは、改行時のスペースを埋めるために、マイナスの letter-spacing を入れます。これのいいところは、文字を挾んでいるその分だけしか詰められず、ブロック要素同士がめりこまないところです。

Safari 以外のブラウザではスペースを文字列として扱うので letter-spacing が安全に効きます。

Safari はどうもタグ間の明示的なスペースをブロック要素として扱っているらしく、-10em にしようが改行されたままです。