VueCLI3でinline-blockの隙間が無くなってしまう場合の対処法

Facebook にシェア
Pocket

HTMLでinline-blockの要素を改行で連続して並べると、横並びで間に隙間ができますよね(参考:inline-blockを指定した要素に隙間が空く理由 | WEBデザインの教科書)。

今やってるプロジェクトでは、デザイン会社にHTMLを作ってもらい、それをこちらでVue.jsにあてはめて処理を追加するということをやっているのですが、デザイン会社から提供してくれたHTMLでは隙間が空いているのに、VueCLI3でビルドした結果では隙間が空いていないという現象が発生しました。

具体的にいうと、下記のようなHTMLがあるとき、

普通にHTMLで書くと下記のようにボタンとボタンの間に隙間があきます。

ですが、VueCLI3で結果を見てみると、隙間が空かなくなってしまいます。

原因を調べてみると、VueCLI3での結果ではinputタグ同士にスペースや改行がないHTMLとなってしまっていることが分かりました。

最初、iniline-blockの隙間に頼らないスタイル指定にしてほしいとお願いしようかと思ったのですが、調べてみると設定で切り替えることで解決できることが分かりました。
webpack – Spaces are gone in HTML after upgrading to vue-cli 3 – Stack Overflow

どうやら、vue.config.jsに下記のchainWebpackの記述を追加すればいいようです。

どうやらこれは、VueCLI3が利用しているVue LoaderというVue Componentをビルドするためのプラグインの設定を書き換える記述のようです。VueCLI3が隠喩しているので今まで気にしてなかったのですが、Vue Loaderも理解してないのでこういうところでハマってしまいますね。

上記のページによると、VueCLI2まではpreserveWhitespaceというHTMLタグ間にスペースをつけるかどうかの設定がtrueだったそうなのですが、VueCLI3ではfalseとなったそうです(ちなみに、Vue Loader自体はデフォルトはtrueだそうです:オプションリファレンス · vue-loader)。

というわけで上記設定をいれることにより、無事にHTMLタグ間にスペースが入り、ボタンの間にも隙間ができました。

めでたしめでたし。

かと思いきや、別の連続したボタンの箇所で、デザイン会社のHTMLでは親divタグにすっぽり収まっている箇所が、VueCLI3の生成結果ではうまく収まらず、何がおかしいんだと必死で元のHTMLとVueCLIの生成したHTMLをChromeの開発者ツールで見比べました。HTML構造は全く同じで、適用されているスタイルも全く同じ……。

しばらく悩んで理由が分かりました。デザイン会社に作成していただいたHTMLでは、スペースも改行もされずにボタンタグが横に並んであり、自分はそれじゃ見栄えが悪いからと改行してしまっていました……。その結果、VueCLI3の生成結果では隙間が空いてしまい、うまく収まらずに改行が発生してしまっていました……。

やっぱり、iniline-blockの隙間に頼らないスタイル指定にしてほしいとお願いしたほうがよかったかな……(というより、本当なんで、改行やスペースが間にある連続したinline-blockの要素は隙間ができる仕様にしたんだ……)。

:active疑似クラスは右クリックでも適用する?しない?

Facebook にシェア
Pocket

今やってるプロジェクトでは、ボタンやら画像やらがあるウェブアプリを作っているのですが、先日お客さんから右クリックしてもコンテキストメニューがでないようにしてほしいとお願いされました。

ようは、画像を簡単に保存できないようにしてほしいとのことなのですが、そんなの簡単に解除できるのだけどと思いながら、下記のスクリプトを追加して右クリックしてもコンテキストメニューがでないように修正しました(参考:JavaScriptによる右クリックの禁止・禁止を解除する方法 – Qiita)。

簡単な変更ですが、設定したからには簡単な動作確認はしないといけません。ブラウザを開いて画像の他、適当な箇所を右クリックしてコンテキストメニューがでないかどうかChromeで確認しました。その時に、「あれ?」と思った箇所が一つ。

上記のアプリは、「+1」というボタンをクリックすると丈夫の数字をカウントアップするようにしてあるのですが、この「+1」のボタンにはactive疑似クラスを付けてクリック時にスタイルを変えるようにしています。そうすると、カウントアップは左クリックでしか行わないのに、スタイル自体は右クリックをしたときもactive疑似クラスのスタイルが適用されてしまいました。IEでもEdgeでも試したのですが、同じように右クリックでも適用されました。

今まで長いことCSSを書いてきて、もちろんactive疑似クラスも何回も使ってきたのですが、右クリックでも適用されるということを今になって初めて気づきました……。

そんな仕様だったのかと思い、試しにMDNを見ると下記のような記述が。

複数ボタンのマウスを使うシステムでは、 CSS 3 は :active 擬似クラスは第1ボタン、つまり右手用のマウスではふつう一番左のボタンにのみ適用しなければならないと定義しています。

あれ? MDNには「一番左のボタンにのみ適用しなければならないと定義」と書いてあります(いやいや、そんなはずはない。右クリックしても適用されたぞ)。

いろいろ調べてみると、stackoverflowに下記の投稿が。
css “:active” with right click, inconsistencies with browser implementation – Stack Overflow

英語は苦手なのでGoogle翻訳して読んだのですが、やっぱりChromeやIEはCSS3の仕様に則っていないそうです。Firefoxは仕様にのっとっているらしく、確かにFirefoxで右クリックしてもactive疑似クラスのスタイルは適用されませんでした。ただし、CSS2.1の仕様では、左のボタンのみとは書かれてなかったので、右クリックでも適用されるのは間違ってなかったそうです。

ちなみに、今やってるプロジェクトでは、右クリックしてもスタイルが変更してしまうのはダメだろうということで、JavaScriptでクリックした時にクラスを追加してスタイルを変更するという処理を入れることになりました……(泣)。

CSSによる色のアニメーションはrgbとhslの指定で違いがあるか調べてみた

Facebook にシェア
Pocket

最近、ウェブサイトをいろいろ見ていて、このアニメーションの動きってどうしてるんだろうと思って調べてみると、CSSのtransisionの機能を使って実現しているというサイトが増えてきました(ちょっと前までアニメーションはjQueryで作っているところが多かった印象)。

自分も最近になってようやくその処理方法が分かってきたので、いつか実践で使ってみたいです。

ところで、このアニメーションですが、jQueryでは確か色の変更はアニメーションで実現できなかったと思うのですが、CSSのアニメーション機能はなんと色の変更まで実現できます。

そこで思ったのが、もしかしたら色をRGBで指定するのと、HSLで指定するのではアニメーションの変化が異なるのではないかと疑問。

例えば、RGBでの青の指定は『rgb(0,0,255)』、RGBでの黄色の指定は『rgb(255,255,0)』となりますが、HSLでの青の指定は『hsl(240, 100%, 50%)』、HSLでの黄色の指定は『hsl(60, 100%, 50%)』となるため。パット見、HSL指定だとHの色相部分だけの値を変えればいいだけなので、青から黄色に変化する場合は途中に緑色、つまり『hsl(150,100%,50%)』という値がでてくるのではないかと思いました。対してRGB指定だとrとgの値が増え、bの値が減るようになりそうなので途中に緑色『rgb(0,255,0)』はでてきそうにありません。

というわけで調べてみた。

HTML

CSS

JavaScript

青というラジオボタンをクリックしたら背景が青、黄色というラジオボタンをクリックしたら背景が黄色に5秒かけて変化するという処理をしています。アニメーションによる変化対象は背景色のみとしています(現在の処理だと、文字色はクリックと同時に変化しますが、CSSの『transition: background-color 5s;』を『transition: all 5s;』とすれば文字色もアニメーションで変化します)。色については左側の要素をRGB指定、右側の要素をHSL指定としています。

サンプル:CSS Color Animation

結果、全く同じように変化しました。RGB指定からHSL指定に変化することもできるわけだからそりゃそうか。

右矢印キーを押すと左にカーソルがうつる不可思議なテキストボックスについて

Facebook にシェア
Pocket

前の会社での話。

実は、前の会社を辞めてからも9月は特別に週一回行っていまして、自分がある程度関わったプログラムのバグ修正なんかをしていました(ほとんど、自分が関わったところではないところに時間を使いましたが)。

そんな中、昨年退職した上司が作成したあるウェブページのテキストボックスが変な挙動をしていました。

そのテキストボックスには、数値が入っていて、右寄せになっていました。その時は特別深く考えたわけではないのですが、CSSのtext-alignでrightを指定しているんだろうなとは思いました。

それはいいのですが、どうも入力するとおかしなことになります。

IEだと右矢印キーを押すと左にカーソルが移動し、左矢印キーを押すと右にカーソルが移動します。よくわからないけど、IEのバグかなと思って試しにChromeで見てみると、なんとChromeでは一番右にカーソルをうつして入力すると左側に文字が追加され、逆に一番左にカーソルをうつして入力すると右側に文字が追加されます。

初めての減少に思わずポカンとしてしまったのですが、多分、keydownでイベントを発生させていて何かやらかしているのだろうと思い調べてみました。すると、予想通り、数値のみしか入力させない記述がしてありました(参考:HTMLのテキストボックスを、できるかぎり半角数値のキー入力のみにする | while(isプログラマ))。

というわけでいろいろ変更してみたのですが、全く変化がありません。そして、試しにkeydownのイベントを無くしてみましたが、全く変化がありませんでした。正直、わけが分かりませんでした。

とりあえず、一から考え直そうと思って開発者ツールで対象のテキストボックスを選択し、右側のサイドバーを見たところ、あると思ったものが無いことに気づきました。そう、『text-align:right』の記述がありませんでした。スクロールバーを上から下まで移動させて見てみたのですが、その記述がみあたりません。「右寄せになってるのになぜ?」もはやパニックに近い状態の自分でしたが、ふと見られない記述がありました。

『direction:rtl』

なんじゃこりゃ? と思って調べてみると、文章の記述方向の設定をしている記述ということが分かりました(参考:direction – CSS | MDN)。rtl は右から左……。まさか……。

この記述を無くしたら、カーソルが想定通りに動きました(もちろん、これだと左寄せになってしまうので、『text-align:right』を追加しておきました)。

とりあえず、同じようなテキストボックスを下記においておきます。valueの値は12345としています。こうすれば、『54321』と表示されるような気がしなくもないんですが、『12345』と表示されています。

というわけで、もし、矢印キーを押したら逆方向にカーソルが移動する場合は、この記述がないか疑ってください。そんなこと、滅多にないと思いますが……。

なお、「テキストボックスに『direction:rtl』の指定があればカーソルの動きがおかしくなる。ということを言いたいだけだろうに、前置きが長すぎ! そんなんだからブログ続かないんだろ!」なんてツッコミは受け付けておりません。むしろ、こう書いたことがセルフツッコミです。

画像の比率を保ったまま枠内に収めて縦横中央表示するCSS(IE8対応)

Facebook にシェア
Pocket

divタグなどの枠内に画像を入れる時、縦横中央表示にして、かつ、枠のサイズより大きければ枠に収まるように画像の比率は変えずに小さくしたいということがあると思います。というより、先日自分はそういう事態に遭遇しました。

まず、サイズの比率を保ったまま、枠内に収める方法ですが、いろいろ試行錯誤した結果、下記のようにするとうまくいくことが分かりました。

widthとheightは普通、デフォルトがautoなので指定しなくていい場合が多いのですが、autoじゃないと動かないため指定しています。

上記の記述だと、枠(この場合、imgタグの親要素)のサイズより大きければ、max-widthとmax-heightの指定により、それ以上のサイズを超えないようになるので、枠に収まってくれます。最初はてっきり、どちらも100%のサイズになってしまうのではないかと思ったのですが、どうやら大きい方にあわせて縮小されるようです。

次に、縦横中央表示の方法ですが、横は簡単です。親要素に『text-align:center』を指定してやればいいだけです。問題は、縦の中央表示。いろいろ調べてみると、:before擬似要素を使って下記のように書くと、縦横中央表示する方法があることが分かりました。

before擬似要素をinline-blockとし、縦方向の揃えをmiddleとしています。同じく画像のほうもmiddleとすることにより、どちらも縦中央表示になります。ただ、inline-blockにすると余計なスペースができてしまうので、そのスペースを無くすために、枠の要素にfont-size:0の指定をしました(参考:display: inline-block の隙間を詰める方法 | Soraxism)。

ちなみに、IE8には対応していませんが、画像をCSSのbackground-imageで指定し、background-sizeをcontainとすると、枠に収まるようになりますが、この場合、枠のサイズより小さければ画像が拡大して枠のサイズに合わせて表示するようになります(もちろん、そのほうがいいということもあると思います)。

なお、IE8対応しなくていいのであれば、フレックスボックスやtransformを使って縦中央表示できます。

フレックスボックス利用

transform利用

下記にサンプルリンクを載せておきます。background-size:containを使った結果、フレックスボックスを使った結果、transformを使った結果も載せています
フレームサイズ:100×150、画像サイズ:175×200
フレームサイズ:100×150、画像サイズ:200×175
フレームサイズ:175×200、画像サイズ:100×150
フレームサイズ:175×200、画像サイズ:150×100
サイズランダム