Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all 8760 articles
Browse latest View live

marginとfloatの関係

$
0
0

marginとfloatは、密接な関係にある。floatを使いこなすには、marginの理解は必須である。

marginのかかっている要素に、floatを指定した場合

親、子に関わらずmarginを指定している要素に、floatを適用すると相殺をしなくなる。また前の記事の、widthとmargin:auto;の関係で記載したようにwidthとmarginを指定した場合のautoは、数値を自動算出する。ただし、floatが指定されると、marginのautoは、必ず数値が0になる。
margin:auto;とfloat;を指定した場合の例

image.png

・親か子のどちらかでもfloatを指定すると、親子での相殺が起こらない。
・floatが指定されると、margin:auto;は絶対的に0になる。
・兄弟同士にfloatが指定されていると、相殺が起こらない。

floatを使用すると、その要素のmarginはpaddingのような挙動を行う。

marginのかかっている要素に、floatが隣接している場合

floatが親、この要素にかかると相殺が発生しない。ただ、floatが隣接しているだけなら、marginとfloatで相殺が発生する。以下はその基本的な条件。

・floatに隣接
・隣接している要素に、marginが指定されている
・隣接されている要素に、floatが指定されていない

上の条件が全てではない。様々は影響により、相殺が発生する場合としない場合があるので割愛。
以下、marginとfloatと相殺の例。



floatとmarginの相殺

image.png

上のソースをまっさらはHTMLに貼った場合、図のようにはならない。理由は、bodyと.testで親子の相殺が発生し、.testのmargin-topを、親のbodyが引き継いでしまうため。

body {
border:1px solid #fff;
}

上のソースを追記してみる。親にborderが入ることによって、親子での相殺が発生しなくなり、図のような動きをするはず。

1つの要素にmarginとfloatが指定されていると、marginの相殺が起きない。
しかし、上の例のmarginとfloatが相殺する条件を満たしているので、図のようん動きをする。そして、この相殺はfloatを解除するclearプロパティにも関係してくる。

clearは、floatを解除するものではない。

「floatを解除する」とよく説明されるclearプロパティだが、floatに隣接してはならないかを指示するプロパティ。その挙動は、先ほどのサンプルによく似ている。
clearは、marginの相殺を抑制し、floatの底辺に要素がつくように、margin-topの値を自動調整するような振る舞いを行う。
clear: none; の場合は、通常通りに振る舞う。
以下、margin, float, clearの例である。

image.png
image.png
image.png

.clearにmargin-topに3000pxも指定している。本来なら、3000pxの間隔が空くはずだが、float:leftを指定したimgの底辺にくっついてしまっている。
これは、clearによる仕様である。clear:left;を指定したことによって、marginーtopが自動調節されて、float:left;の指定された要素の後ろにつく。さらに、float:right;を指定した.rightの底辺(marginを含む
)には、.clear-rightの上辺が重なっている。この場合、.rightの上辺から底辺までのmargin-topを調整しているわけではない。.clearから.rightまでの底辺までの距離で、margin-topを調整している。

なぜなら、隣接するfloatを指定した要素とmarginは、相殺関係になるが、.clearのように隣接する要素とmarginに相殺関係が発生しない場合は、そこからが出発点になる。clearとmargin-topを同時に適用すると、clearプロパティが優先されるので気をつける。

相殺の利点

ややこしい、marginだが、間隔をあけたい場合。相殺など利用することにより、クリーンなソースコードが書ける場合も多くある。レイアウトをmarginで書いたものと、paddingで書いた物を比較する。

完成するレイアウト
image.png

image.png
image.png
image.png

image.png
image.png
image.png

marginの相殺を利用した物と、paddingを使ってレイアウトを組んだ物の比較。paddingを使用すると、最後の要素は、padding-bottom:0;を指定したり、classを細かく割り切ったりする。
.my10.mt20などのクラスを用意している人は、paddingのような指定を行っていることが多い。それに対して、marginの相殺を利用すると、HTML,CSSともに、短く書くことができる。
さらに適切に間隔を保つことができるので、特にCSSを指定していないimg要素がイレギュラーに入ったとしても、ある程度は容易に対処することができる。
image.png
上記サンプルは、相殺をうまく利用した例。デザインによっては、親にborderやpaddingなどを入ることにより。、相殺が使えない場合もある。しかし、相殺を理解していることで、HTMLやCSSの書く効率が変わってくる。

ブラウザのデフォルトスタイルシート

ブラウザのデフォルトスタイルシートは、marginと関連がある。h1やpなどの要素には、ブラウザで、あらかじめCSSがついている。
h1 {
margin:0.67em 0;
font-size:2em
}
p {
margin:1em 0;
}
相殺を計算された上で、上下にmarginを指定されている。このスタイルしーとによって、”文章”を適切にマークアップすれば、適度な間隔を保つようになっている。
デフォルトスタイルシートを生かすように構築する場合は、相殺の考え方が大切になる。
marginは仕様とバグは、度々一緒にされることがある。
marginは、奥深く、経験もある程度必要になる。
marginのバグも回避策は多く存在するので、マスターすればCSS構築に役立ってくれるプロパティになるはず。

引用元(参考元):https://kojika17.com/2012/08/margin-of-css.html

今回も、勉強させていただき、ありがとうございました。


CSSだけでアコーディオン×ハンバーガーメニューを作る(コピペ可)

$
0
0

CSSだけでアコーディオン×ハンバーガーメニューを作る

スマホ画面はヘッダーが小さくなり
押しにくいボタンになることが多いです。

そこでハンバーガーメニュー×アコーディオンを
使用してユーザー操作をしやすくしてあげましょう

ちなみにハンバーガーメニューとは以下のようなものです。

Image from Gyazo

ハンバーガーのような見た目のアイコンを
押すと画面外からニュルッとメニューが出てきます。
JSなどを使用してリッチに作ることも可能ですが
ここではCSSのみで実装します。

アコーディオンは以下の動作です。
Image from Gyazo

ここでは+ボタンを押すことで親要素が広がって子要素が出てきます。

では実際のコードを見てみましょう

index.html
<divclass="humb-menu"><inputid="gnav-input"type="checkbox"><labelfor="gnav-input"id="gnav-btn"><diviclass="fas fa-bars"></div></label><divid="gnav-content"><!-- タイトルを記載ください --><divclass="humb-menu__title">title</div><labelfor="label1"><!-- 親要素の名前 --><p>label</p><p></p></label><inputtype="checkbox"id="label1"class="cssacc"/><divclass="accshow"><!-- 子要素の名前 --><p>content</p><p>content</p><p>content</p><p>content</p></div><labelfor="label2"><p>label</p><p></p></label><inputtype="checkbox"id="label2"class="cssacc"/><divclass="accshow"><p>content</p><p>content</p><p>content</p><p>content</p></div><labelfor="label3"><p>label</p><p></p></label><inputtype="checkbox"id="label3"class="cssacc"/><divclass="accshow"><p>content</p><p>content</p><p>content</p><p>content</p></div></div></div>

labelが親要素となりcontent部分が子要素となります。
必要に応じてpタグをaタグに変更してリンクなどにして使用ください。
ハンバーガーボタン部分はfontawsomeを使用しています。

index.css
#gnav-btn{color:gray;padding:10px;font-size:30px;position:fixed;top:10px;right:10px;z-index:100;background-color:white;border:solid1px#d1caca;border-radius:3px;}#gnav-input:checked~#gnav-content{top:0;}#gnav-content{position:fixed;top:-100%;left:0;z-index:10;transition:0.3s;width:100%;}.humb-menu__title{padding:1.5rem;}.humb-menulabel{display:flex;justify-content:space-between;padding:1.5rem;cursor:pointer;border-top:0.5pxsolid#c7c5c5;}.humb-menuinput{display:none;}.humb-menu.accshow{height:0;overflow:hidden;}.humb-menu.accshowp{padding:1.5rem;}.humb-menu.cssacc:checked+.accshow{height:auto;}}

コードの記述量をへらすため必要最小限の記載にしています。
必要に応じて装飾を加えてください。

動作としてはhtmlで非表示のチェックボックスを設置し
チェックの有無で動作するシンプルな内容です。

コピペすると以下の動作になります。
Image from Gyazo

LP模写によりLP製作の【超初心者】が学んだこと(随時更新)

$
0
0

ランサーズ案件の参考LPサイトから
調査をして学んだこと自分用メモ

今回はこのサイト
welcomeページのみ調査・模写しました

結果分かった頻出パターン

~配置の頻出パターンは以下の通り~

1.display系
display: flex;
     block;
         inline;

2.position系
position: relative;
          absolute;

3.text-align系
text-align: center;
            left;
            justify;

4.justify-content系
justify-content: center;
                 space-between;
5.transform系

(これは1,2回見たくらい)

transform: translate( , );   

~基本文法の頻出パターンは以下の通り~

1.ulとliにクラス名つけて修飾
<ul class="">
   <li class="">
   </li>
</ul>
2.border系
.class名(または#id名) {
  border: 色 solid 太さ; /*1本線で囲む*/
  border-radius: 4px; /*角丸くんの大きさ指定*/
  border-top: ・・・などなど
} 
3.margin と padding
4.hoverでリンクに触れた時の動き指定
5.background系

◆調査の足跡

①全体の構造分け(header,footer,main,div,section,class,id…articleなど)
image.png

このLPサイトを作った人は
1. 〇〇-wrap > 〇〇-block > 〇〇-box の順でclass分け
2. 大まかな枠組みの中身は class名 .inner で共通指定
3. class名 .sec-blockなどでmargin , padding を共通指定

② ulとliでdisplay指定をしているところがたくさん
(個人的に目から鱗だった)
CSS Flexboxチートシート

③ レスポンシブ対応

とりあえず、一画面のみ縦長で模写を終了…!
特殊の文字で部分的にスルーしている
ところと使用不可の画像以外は大体コピーできたかな…

かなり勉強になりました。

参考サイト

ちなみに、CSSの素敵なおまとめがあったのでメモ。

模写した様子↓

screencapture-127-0-0-1-5500-welcome-html-2020-04-24-11_12_02.jpg

CSSのサイズ指定 px,%,rem,emについて調べてみた【個人メモ】

HTML&CSS備忘録

$
0
0

はじめに

HTML&CSSの学習内容を備忘録としてまとめてみました。
間違い等ありましたら、ご指摘いただければ幸いです。

リストのマークをなくす

list-style: none;

文字の間隔を指定する

letter-spacing: 10px;

アイコンを使用したい

Font Awesomeを使う。リンクを読み込み、使いたいアイコンを組み込む。

ヘッダーなどで文字はそのままで背景色だけを透過させたい

rgbaを使用する。opacityだと全体を透過させてしまうので文字も透過してしまうので注意。

行間を指定したい

line-height: 30px;

影をつけたい

box-shadow: (水平方向)px (垂直方向)px (色);

ヘッダーを固定したい

position: fixed;
width: 100%;
widthを指定しないとヘッダーが消えてしまうので注意。

要素が回り込んでしまう

clear: both;

CSS : hover時に他の要素の操作をしたい時の注意点

$
0
0

cssのhover操作で、hoverする要素とは別の要素を動かしたいと思ったときに、色々調べたので、メモとして残します。

hoverで別の要素のスタイリングをする

hoverして、別の要素を動かしたい時

要素:hover +別要素

と書きます。 '+' は、他の要素を指定するときに書く。子要素の時は書かなくても良いです。

 

以下のコードを参照してください。


See the Pen
hover1
by rea-jin (@rea-jin)
on CodePen.



説明:
()内は、hover要素->スタイリングしたい要素 となっています。

以下、場合分けをして、ある要素をhoverしたときの、ある要素のスタイルを変えていきます。

1.通常のhover 親要素 (oya1->oya1)


oya1をhoverして、oya1の色を変えている。

 

2.通常のhover 子要素 (ko1->ko1)


oya1の中にある子要素ko1をhoverして、それ自体を操作したい。

これは可能だが、oya1まで変化している。

子要素をhoverした時、親要素もhover対象となる。


3.子要素の同階層への操作 (ko1->ko1-2)


ko1をhoverして、ko1-2を操作したいが、できない。

これは同階層にある子要素。

コードや2の結果からわかるように、

親要素の中に入っており、親要素をhoverしているので、子要素から子要素へはhover操作できない。

 

4.親要素をhoverして子要素を操作 (oya2->ko2)


oya2をhoverしたとき、ko2の色を変えている。

これは可能である。

さらに、ko2をhoverするということは、oya2もhover対象なので、これもko2の色が変わる。

 

次は、以下のコードを参照してください。


See the Pen
hover2
by rea-jin (@rea-jin)
on CodePen.



 

5. 親要素をhoverして同階層の親要素を操作 (oya3->oya4)


oya3をhoverして、oya4の色を変更。

これも可能である。2や3のように、親要素に囲われておらず、自身だけがhover対象となっている。

 

6. 親要素をhoverして、他の親の子要素を操作 (oya3->ko4)


もう気づいたかもしれないが、oya3をhoverした時に、ko4も色が変わっている。

これは、要素の指定の仕方が重要で、'+.ko4'だけでは変化しない。

'+.oya4 .ko4' というように、どの親か指定する。半角スペースも入れる。

わかりづらければ、5の操作をコメントアウトして見てください。

 

7. 子要素をhoverして、他の親や他の子要素を操作 (ko4->oya5 or ko5)


これはどちらもできない。

子要素をhoverすると親要素もhover対象といったが、きちんと親要素を指定して、hoverしないと他は操作できない。

 

8. 親要素をhoverして、他の親を操作 (下から上) (oya5->oya4)


できない。
 

これが、なぜこれができないのか結構調べました。

しかし、全然見つからず、自分で気づきました。

HTMLはドキュメントツリー構造で、上から下へ処理されるからなのでは? と。

これは、常識ですが、初学者は忘れがちなことかもしれません。

cssみたいに、順番気にせず書いてたら、できそうな気がするものです

処理された後に、操作しようといっても、cssじゃできないと言うことですかね。

参考

https://techacademy.jp/magazine/19418

初学者による、初学者向けの記事です。間違いがあれば、ご指摘いただけると幸いです。
コメントお待ちしております。

CSSのまとめ

$
0
0
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="hoge/style.css">
    <title>Document</title>
</head>
<body style="margin: 0">
    <!--ノーマルスタイル、ボックススタイルの説明用 

        <div class="normal">ノーマルスタイル</div>
    <div class="box">ボックススタイル</div>

    <div class="margin">マージン相殺の説明用ブロック</div> -->

    <div>私はブロックです</div>
    <div>私はブロックです</div>
    <div>私はブロックです</div>
    <div>私はブロックです</div>
    <hr>
    <span>私はインラインです</span>
    <span>私はインラインです</span>
    <span>私はインラインです</span>
    <span>私はインラインです</span>

    <div class="exmple">ブロックは改行して他の要素を邪魔しない!
        ブロック内の<span>インラインです</span>インラインの場合にはマージン、パディング、ボーダーがきたときに他の要素の事は虫します</div>

</body>
</html>

/* h1::after{
    content: "!!!!!!!!!";
}

h1::before{
    content: "!!!!!!!!!";
}



article h1~p{
color: springgreen
;}


p::first-letter{
    color: red;
} 

カスケードは優先順位 基本はあとがち
詳細度、タグ クラス ID 優先順位が左程高いが違う
*/




/* .a {
    color:palevioletred !important;
}

#title{
    color: chocolate;
}

h1{
    color: red;
}

h1{
    color: black;
} */


/* 継承
li{
    color: red;
} 

li [href*="yahoo2"]{
    color: inherit;
}

li [href*="yahoo3"]{
    color: initial;
}

li [href*="yahoo4"]{
    color: unset;
} */

/* div{
    background-color: orange;
    border: 3px solid black;
}

.fix{
    all: unset;
} */




 .box{
    background-color: blanchedalmond;
    /*content box*/
    width: 200px;
    height: 200px;
    /*padding box top L bottm R*/
    padding:8px 12px 16px 20px;

    /*margin box top L bottm R*/
    margin:8px 12px 16px 20px;
    /* margin-bottom: 20px; */

    /* ボーダーボックス */
    border-top:10px solid black;

    /*paddingとボーダーを抜いて、実際のwihit200を166にしている! 直観的(すべてに対して使うときもある*/
    box-sizing: border-box;
} 

/*
.normal{
    background-color: red;

}

*/

/*マージン相殺 .margin{
    background-color:black;
    margin-top: 40px;
} */


/* div, span{
    background-color: orange;
    width: 100px;
    height: 100px;
} */

.exmple{
    /* display:inline;  インラインをblockに変更することも出来る*/
    background-color: pink;
    padding: 20px;
}


.exmple span{
    display: inline-block;/* 改行されず他を邪魔しない、上書きしないで改行せずまわりをじゃましない*/
    margin: 20px;
    border: 1px solid black;
    padding: 20px;
    background-color: lightblue;
}

ポートフォリオ作成の段階で既に分からない事態に

$
0
0

文字の置き方が分からない...

画像をHTMLにて添付すると文字と被ってしまい、CSS側でposition: absoluteを用いて調整して配置した。
しかし次の< p >でも位置ずれを起こす。
仕方がないので全てをHTMLのbrやCSSのposition:absoluteやpadding-で調整した。

後に調べてみると良質なコードは修正しやすさが大事らしい。このままでは駄目なポートフォリオのままになってしまう。困った。


Vue.jsの始め方②(classのデータバインディング)

$
0
0

Vue.jsの始め方②(classのデータバインディング)

今回はclass属性のデータバインディングの基礎です

前回の記事はこちら
Vue.jsの始め方①(html/css/js/jQueryがある程度わかる方向け)

classのデータバインディング基礎

以下のhtml,js,CSSを記述してブラウザーで実行してください

index.html
<divid="app"><p>
   Hello<spanclass="bg-gray text-blue"v-bind:class="{large: isLarge, 'text-danger': hasError}"> vue.js</span></p></div><script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js
"></script><!--Vue.js 読み込み--><script src="js/script.js"></script><!--javascript 読み込み-->
index.js
varapp=newVue({el:'#app',data:{isLarge:true,hasError:true}})
index.css
.large{font-size:36px;}.text-danger{color:red;}.bg-gray{background-color:gray;}.text-blue{color:blue;}

実行結果
Image from Gyazo

今回はプレーンなCSSとして'bg-gray'と'text-blue'を設定しました
それに対してVue.jsのデータバインディングでクラス属性を追加しています。

isLarge: true → .large クラスを追加
hasError:true → .text-danger クラスを追加

クラス名にハイフンが入る場合はhtml内のV-bind記述部分は
''が必要になりますので注意してください

結果は .large .bg-gray .text-blueの3つが実行されています

処理が重なった場合は優先順位がCSSの読み込み順になります。
よって.text-dangerクラスは.text-blueクラスに上書きされている形です

このようにvue.jsを使用するとクラスのデータを複数動的に切り替えることが可能です。

オブジェクトデータの利用

classを複数渡すとコードの可読性が悪くなるため
以下のようにオブジェクトとすることも可能です。

index.html
<divid="app">  Hello <spanv-bind:class="classObject">Vue.js!</span></div><script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js
"></script><script src="js/script.js"></script>
index.js
varapp=newVue({el:'#app',data:{classObject:{large:true,'text-danger':true}}})
index.css
.large{font-size:36px;}.text-danger{color:red;}

ここではclassObjectというオブジェクトに
.large と .text-dangerの2つのクラスを格納して
V-bind:classによって追加をしています。

クラスの条件に3項演算子を使う

次にクラスの条件に3項演算子を利用します。
3項演算子とはjsのif構文を簡略記述したものです。

index.html
<divid="app">  <p>    Hello<spanv-bind:class="[isLarge ? largeClass : '',dangerClass]"> Vue.js</span>  </p></div><script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js
"></script><script src="js/script.js"></script>
index.js
varapp=newVue({el:'#app',data:{largeClass:{large:true,'bg-gray':true},dangerClass:{'text-danger':true},isLarge:true}})
index.css
.large{font-size:36px;}.text-danger{color:red;}.bg-gray{background-color:gray;}.text-blue{color:blue;}

実行結果
Image from Gyazo

v-vind:classの中身は配列となっており以下が3項演算子です

isLarge  ?  largeClass  :  ' '

isLargeがtrueならlargeClassを追加しfalseなら空白とするという意味です。
dangerClassについては常に設定されます。

HTML ファイル内に直接書いた Markdown を変換して GitHub のスタイルで表示させる話

$
0
0

概要

marked.js を用いて,HTML ファイル内に直接記述された Markdown を変換し,さらに github-markdown-css を用いて GitHub の Markdown スタイルで表示させる.

詳細

かつてこんなことを呟いていた:


上記ツイートにもある通り,こちらの記事を参考にして,HTML ファイル内に直接記述された Markdown を変換・表示させた.以下はそのサンプルコードである:

markdown.html
<!DOCTYPE html><title>Markdown</title><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0"><script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script><divid="mdrender"></div><divid="mdraw"style="display:none;">
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
*italic*
**太字**
**bold and _italic_**
~~取り消し線~~
[リンク (GitHub)](https://github.com/)
1. 富士
2. 鷹
3. 茄子
- 箇条書き1
    - 箇条書き2
        - 箇条書き3

> 吾輩は猫である。
> 名前はまだ無い。
</div><script>document.getElementById("mdrender").innerHTML=marked(document.getElementById("mdraw").innerHTML.replace(/&gt;+/g,'>'));</script>

実際の表示は次のようになる:
markdown
これで呟きは実現されたわけだが,ちょっとページが味気ない.何か適当なスタイルシートを適用できれば良いなと思い探してみたら github-markdown-cssというのを見つけた.このスタイルシートを適用すると,GitHub 上で Markdown 形式の文書を閲覧したときと同様の表示にできる.以下はそのサンプルで,先ほどのサンプルコードに一部追記したものである:

github-markdown.html
<!DOCTYPE html><title>GitHub Markdown CSS</title><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0"><linkrel="stylesheet"href="https://sindresorhus.com/github-markdown-css/github-markdown.css"><script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script><divid="mdrender"class="markdown-body"></div><divid="mdraw"style="display:none;">
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
*italic*
**太字**
**bold and _italic_**
~~取り消し線~~
[リンク (GitHub)](https://github.com/)
1. 富士
2. 鷹
3. 茄子
- 箇条書き1
    - 箇条書き2
        - 箇条書き3

> 吾輩は猫である。
> 名前はまだ無い。
</div><script>document.getElementById("mdrender").innerHTML=marked(document.getElementById("mdraw").innerHTML.replace(/&gt;+/g,'>'));</script>

具体的な追加内容は次の通り:

  • 適用するスタイルシートを表記:
<linkrel="stylesheet"href="https://sindresorhus.com/github-markdown-css/github-markdown.css">
  • スタイルシートが適用されるクラス markdown-bodyを表記:
<divid="mdrender"class="markdown-body"></div>

実際の表示は次のようになる:
github-markdown
GitHub を使う人にはお馴染みの見た目である.

参考

ElectronでのWebフォントのキャッシュについて

$
0
0

モチベーション

Electronで作るアプリでも、Google FontのようなWebフォントが使いたい。この場合、どうやって指定するのが良いのか?例えば、指定の仕方として次の候補が考えられる

  • 方法1:Web fontをダウンロードしてアプリに同梱する。使用するときはCSSの@font-facesrc: url('./font/FONTNAME);などの様に同梱したファイルを相対パスで指定。
  • 方法2:レンダラープロセスのHTMLのheadにて<link href="https://fonts.googleapis.com/css2?family=FONTNAME&display=swap" rel="stylesheet">で読み込む
  • 方法3:CSSの先頭で、@import url('https://fonts.googleapis.com/css2?family=FONTNAME');で読み込む

この中で、Electronアプリとしてベターなものはどれだろう。

Electronアプリに求めるもの

上の「ベター」とは、そもそもElectronでアプリ化する時点で、次ことを要求しているのではないだろうか

  • ローカルPCでの起動を目的としている。
  • オフラインでの使用も視野に入れている

オフラインを想定した時、最初は方法1(ダウンロードして同梱)しか解が無いと思っていた。ただ、フォントの同梱は、次の問題もある

  • フォントの再配布に関するライセンスの問題(Google fontは再配布OK)
  • アプリのパッケージサイズが大きくなる
  • アプリの見た目(テーマ)をCSSでカスタマイズやユーザー定義できるようにしたい場合、未同梱のWebフォントを使うにはどうするか

ただでさえファイルサイズが大きいと揶揄されるElectronアプリがさらに大きくなるのは困る人も多そう。

また、リッチテキストエディタやビューアなどを作っている時は、三番目のテーマのCSSカスタマイズなどもやりたいでしょう(少なくとも私の開発しているエディタではやってみたい)。すると、フォントの同梱では必ずしも解決しない。さらに、このテーマのカスタマイズに関しては、方法2(linkタグで指定)を行うのは、カスタマイズに合わせてDOMを操作しないといけないので、あまり好ましくない。

となると、消去法で方法3が残る。

ElectronアプリでもWebフォントのキャッシュが効く?!

方法3(CSS中で@import)でWebフォントを指定する場合、初回起動時にオフラインだと確かにフォントが読み込めず、代替フォントでの表示になってしまいます。ただ、(初回に限らず)オンラインで一度でもWebフォントを読み込めた場合は、Electronアプリでもフォントのキャッシュが残るようで、以後の起動ではオフラインでもWebフォントが使えるようです。そして、OSの再起動をしてもこのキャッシュが有効のまま生きています。

とりあえず動作確認した環境

  • Windows10 (1909)
  • Mac OS 10.14.6

ただし、フォントをキャッシュしている仕組みは理解していません。OSのキャッシュなのか、Chromiumのキャッシュなのか、Chromeのキャッシュと共通なのか、アプリごとに独立したキャッシュになっているのか。OS再起動ではどうなるのか。詳しい人がいたら教えてほしいです。

結局

この時代、完全にオフラインではなく、オンラインの状態での起動もあり得る、と割り切れるなら、Electronアプリにおいて@importでWebフォントを読み込ませてしまっても大丈夫かもしれません。

皆さんがどうしているか、是非コメント欄にでも情報共有いただけると勉強になります。

新人が、ほぼ一人で、PC専用だったWebサービスをタブレット/スマホ対応した話

$
0
0

はじめに

  • 私について

    • プログラム初心者(半年くらい)
    • HTML、JS、CSSが、ググりながらある程度書けるくらい。
  • サービスについて

    • 法人向けのERPシステム
    • 人を検索や、人を参照などをするサービス(他にもありますがメインはコレ)
    • HTML、CSS、JS、Java、Tomcat、Nginx、OracleRDBで動いているらしい
    • PCブラウザでしか、動作も検証もしたことが無い
    • 一応マテリアルデザインを参考に作られている
  • したこと

    • 前述のサービスの主要画面をスマホ、タブレットで使用できるようにする
  • 条件

    • スマホは機能落ちは許容できる
    • タブレットの機能落ちはダメ
  • 開発期間

    • 4か月

タブレット/スマホ対応するうえで、検討したことと結論

対応するOS、ブラウザについて

まずはじめに決めたことが、対応するOSとブラウザをどうするのかです。
テストするための実機も必要になることから、会社での稟議~調達のタイムラグも見て、早めに決めた。

いろいろ検討した結果、2020年1月現在、下記が対応するうえで決めたサポート対象

端末OSバージョンブラウザ
スマホiOSiOS12,13Safari,Chrome
AndroidAndroid8,9Chrome
タブレットiOSiOS12,iPadOS13Safari,Chrome
AndroidAndroid8,9Chrome

決定するうえで決め手となったポイント(優先順)
1. 会社のポリシー上、最新から3バージョン前までサポート
2. そもそも販売され、シェアがあるか
3. ERPシステムのため法人として使用されているか

1について

これは会社に属している以上守るべきポリシーなので、その前提は守りました。
しかし、これを守ると、Android8~10,iOS11~13が必要になり、すべてテストすると、
(iOSの3バージョン * 2ブラウザ) + (Androidの3バージョン * 1ブラウザ) = 9パータンと、
テストだけでもかなりの工数が必要になることが分かったため、不要なものを除いてテストを削減するために2以降のシェアの調査を行いました。

2について

  • iOS11はすべての端末が12にバージョンアップでき、OSのシェアもほとんどないことから、除外
  • Android10に関しては、最新バージョンが出たばかりであり、対応する端末もほとんどないことから、除外

3について

一般的なシェアに比べて比べて、あまり公表されてないこともあり難航しましたが、
au,docomo,softbankの法人向けの販売ページから、販売されている製品一覧、導入の紹介ページを確認して、ある程度のシェアを確認しました。
それとは別にユーザー企業に、どのような端末を使用しているのかのヒアリングを行い、
Android10とiOS11を除いたもので問題ないと判断し、
(iOSの2バージョン * 2ブラウザ) + (Androidの2バージョン * 1ブラウザ) = 6パータン
の最低限のテストで対応すると決定しました。

※Android10に関しては、ゆくゆくシェアが伸びて端末が増えたタイミングでテストを実施することに。

デザインをどうするのか

今回対応するサービスは、幸いにもERPシステム独特の古いデザインではなく、
マテリアルデザインでの実装がされていたため、
そのデザインを踏襲し、スマホ・タブレット対応することに決定。

スマホ、タブレットにどう対応させるのか

そもそもタブレット対応や、スマホ対応させるためのノウハウがほとんど社内になかったため、
(先輩にも教えてもらいながら)一から調べ、下記の案が出てきました。

No.メリットデメリット
1新たに画面を一から作り、URLから分ける・一から実装できるため、スマホに最適な画面で作り直せる

・PC側で機能改善が入った場合にスマホ側は影響を受けない。
・実装コストが大
2UserAgentで判定させ、同一URLだが表示するHTML/CSSを分ける・実装コストは中

・余分なDOMをクライアント側で読み込まないので、速度が速くなることを見込める
・HTML/CSSから作る必要がある。
3RWD対応させ、CSSのメディアクエリで画面サイズに応じて表示を変える・実装コストは低・PCでの修正が、スマホ/タブレットに意図せず影響を与える可能性がある。

上記の案の中から

スマホ対応に関しては、
1については、明らかに工数が足りず、
スマホに関しては、使用想定される機能が限られてくることもあり、
余分なDOMを読み込まないや、速度が速くなることを見込み、2の案を採用しました。

タブレット対応に関しては、
当初は、スマホと同様に2の案で考えていましたが、iPadOS13をSafariをしようすると、
UserAgentでiPadであることを判定できなくなることが判明・・・

参考:iOS13とiPadOSに備える(フロントエンド)

確かに、私物のiPadPro(iPadOS13)で確認すると、UserAgent上からiPadの記載が無い・・・
iPadOS13.png

上記の事があり、他にもどうにか方法が無いものかと調べましたが、
他にも皆さん調べつくしているようで、UserAgentでの分岐は諦め、
PCから機能落ちもせず、CSSのメディアクエリだけで対応できる 3のレスポンシブデザイン対応で実施することに。
(無理やりJSで判定させ、その情報で分岐させることも考えたが、シンプルに画面サイズだけで対応させたほうがコストが安く、今後の実装メリットが高いと判断した。)

実装方針

スマホはUserAgentによりHTML,CSSを切り替える

Java側でUserAgentの判定をかませ、iPhone,Androidのスマホであれば、
スマホ対応した、html/CSSをControllerで返すようにした。

タブレットはPCと同一のHTMLを使用し、現状のCSSにレスポンシブ対応したCSSを追加で読み込ませる

追加で読み込ませたCSSの中に、画面サイズに応じて、スタイルを記載した。

@mediascreenand(max-width:1279px)and(min-width:960px){/*タブレット画面が横向きの時*/}@mediascreenand(max-width:959px){/*タブレット画面が縦向きの時*/}

参考:【新定番】レスポンシブデザインのブレイクポイントの正解はこれだった[2019最新版]

実装で当たった問題点と、どう解決したか

方針が決まったので、各画面を実装していくのみになりました。
実装途中で、いろいろな問題にぶち当たりました。その一例と、解決した方法を記載します。

躓いた点①:PCのサイズを基本に作られているため、文字が大きく見える。

PCの画面を前提に作られているため、font-sizeが基本14pxとなっていた。
そのため、下記の3つのサイズに統一し、大きすぎる、小さすぎるをなくした。

基本は 12px
強調14px
補足10px

躓いた点②:マウス操作前提に作られているため、操作しずらい

マウス操作を前提に作られた画面のため、複数の問題点を抱えていた。

  • はみ出る文字をマウスホバーで出現するツールチップで表現していたため、タッチ操作だとうまく動かない(表現)できない。
.hoge{overflow:hidden;white-space:no-wrap;text-overflow:ellipsis;}

を使うのではなく、下を使い、折り返してすべて表示する。

.hoge{overflow:visible;white-space:normal;text-overflow:clip;}
  • アイコンのみで表現していたボタンが、何のボタンかわからない。

PCでも起こりうるUI的な問題だが、PCではボタンにホバーした際にツールチップでボタンの名前を説明していた。
そのため、あまり問題にはならない状態だったが、タッチ操作だとツールチップが出せないためボタンの判別がつきにくい。
結局これの最適な解決策は見つかっていない・・・

  • ボタンが小さいため、指でのタッチで押せないときがある。

ボタンのサイズが比較的小さく、そのままタッチ画面に表示して操作すると、
隣のボタンを押してしまうなど、操作性が悪い状態だった。

/*修正前
*marginが多用されていた
*/.hoge{margin:8px;}
/*修正後
*paddingに変更して、さらに倍のサイズに変更
*/.hoge{padding:16px}

躓いた点③:iOS12で滑らかにスクロールできない。

iOS13,iPadOS13の場合には問題ないが、
iOS12の場合に、スクロールがカクカクして、操作性が非常に悪い状態になっていた。

.hoge{overflow:scroll;/*下記のスタイルをつけることで、慣性スクロール(滑らかなスクロール)となる。*/-webkit-overflow-scrolling:touch;}

躓いた点④:PDFの埋め込みがうまく表示されない

embedを使用してページの一部にPdfファイルを埋め込むと、
iOSではPDFファイルの1ページのみが表示されて、残りのページを見ることが出来ない事象が起きた。
(Androidでは表示ができず、ページ真ん中にダウンロードボタンが表示される。)

<!-- うまく表示されない --><divid="pdf-preview-body"><embedsrc="/documents/hoge.pdf"></div>

下記を参考に、PDF.jsのライブラリを使用すれば、埋め込み形式のPDFをプレビューすることが出来る
参考:PDF.jsを設置する

<!-- これでPDFファイルの埋め込みプレビューできる --><divid="pdf-preview-body"><iframesrc = "/folder/viewer.html?file = /documents/hoge.pdf"id="pdfjs"></iframe></div>

PDF.jsのダウンロードボタンを消す必要があるのであれば下記を使用する。
iframeを使用しているため、外で使っているCSSに書いても動作せず、ライブラリ内のCSSに直接記載すれば消すことが出来たが、
ライブラリ内直接記載するのは気持ち悪いため、JSで無理くり非表示にした。

$('#pdfjs').on("load",function(){// PDF.JS側のダウンロードを非表示にする。$(this).contents().find('#download,#secondaryDownload').hide();});

躓いた点⑤:ソフトウェアキーボードが消えてくれない

入力完了した際や、検索実行の際に、ソフトウェアキーボードが消えてくれないことが多々あった。

//ボタンを押したタイミングなどで下記を実行さるようにすればソフトウェアキーボードが非表示となる。$('.taget').blur();

躓いた点⑥:BootstrapのDropdownが動作しない

マウスだと動作するが、タッチ操作だと、動作しなかったものがあった。
その時は、 aタグに href="#target"を追加すれば動作するようになった

<divclass="dropdown"><aclass="hogehoge"data-toggle="dropdown"href="#target">ドロップダウン</a><ul><li>ドロップダウンメニュー</li></ul></div>

参考:iOSのSafariでdata-toggleが動かない場合

躓いた点⑦:ブラウザのアドレスバーが消えてくれない

通常のよく使用するサイトだと、下にスクロールすると、アドレスバーや下のツールバーが縮小されて、
ウェブサイトが最大化されて表示されるが、今回実装している画面でそれができなかった。

<body><divid="header"><!-- ヘッダー部分 --></div><divid="contents"><!-- コンテンツ部分 --></div></body>
/*原因となるCSS*/#header{height:40px;position:fixed;}#contents{/*コンテンツ要素に対してだけスクロールしていた*/height:calc(100%-40px);overflow:auto;}
/*下記のように画面全体の要素に対して、スクロールをつけることで、アドレスバーを縮小できるようにできる。*/body{overflow:auto;}#header{height:40px;position:relative;}

この修正は、影響が大きすぎるので、今回では諦めたが・・・

教訓

  • 最初はPC*Chromeのエミュレート機能を使用して開発をしていたが、実機のJSなどの動作差異などがネックになった。(特にiOS*Safariの組み合わせ)
    →早めに実機で検証をしたほうが良い。

  • PCに比べて、スマホやタブレットは少しの動作違和感がストレスを感じやすい
    →コンシューマーアプリなどで快適な動作に慣れている可能性があるので、少しでも違和感があれば、こだわったほうが良い。

CSSの適応優先順位について

$
0
0

本記事のゴール

この記事を読んでいただくことによって、

  • CSSの適応優先順位について知る
  • 実装の例を見て、使い分けが前よりできるようになる
  • 結果、CSSが前よりちょっと好きになる:heart:

というハッピーな状態になれます!
では早速やってきましょ〜〜〜〜

CSSとは?

「もうそんなの耳にタコが、目にイカが出来るぐらい見聞きしたわ!」と思うかもしれませんが、一応書いときます。

CSSは、 HTML と組み合わせて使用する言語です。 (~ 中略 ~)
例えば、ウェブページがスクリーンに表示される際の色・サイズ・レイアウトなどの表示スタイルや、 プリンタなどの機器で印刷・出力される際の出力スタイル、 音声で読み上げられる際の再生スタイルなど、 ウェブページをどのようなスタイルで表示・出力・再生するかについて指定することができます。

by.HTMLクイックリファレンス(今回も登場:v:)
いい感じに要約すると、『HTMLとズブズブの関係で、文字の色とか大きさとか配置とかの見た目を変えてくれたりする最高にいい奴』です。
※セレクタとかプロパティとか値とかの説明は全部省きます!

逆にCSSを使わないと、テキストや画像がぜーんぶ左寄せで表示されるだけの味気ない見た目になってしまいます。
それはもう、全然面白くないですね:tired_face:

CSSの優先順位

そんなCSS、記述した順番やセレクタによって適応される優先順位が変わるという性質を持っています!
本日は、その適応優先順位について深堀りしていきたいと思います。

HTMLは共通してこちらを利用します↓

index.html
<!DOCTYPE html><htmllang="ja"><head><metacharset="UTF-8"><title>最近毎日そうめん生活なんだが</title><linkrel="stylesheet"href="style.css"type="text/css"></head><body><articleid="momokuro"class="mononohu"><h1>ももクロちゃん</h1></article></body></html>

セレクタが同じ場合

:heartbeat:一番最後に記述した設定が優先されます。

style.css
h1{background-color:red;}h1{background-color:yellow;}h1{background-color:purple;}h1{background-color:pink;}

表示はこんな感じです。

スクリーンショット 2020-04-17 0.12.36.png

◎どうしてこうなるのかな:thinking:
コードが上から読まれていくので、当然っちゃ当然ですね!
言わずともがなご理解いただけると思うので、次行きます。

条件を追加したセレクタの場合

:purple_heart:セレクタの数が多ければ多いほど優先順位が高くなります。

style.css
h1{background-color:red;}articleh1{background-color:yellow;}bodyarticleh1{background-color:purple;}bodyh1{background-color:pink;}

表示はこんな感じです。

スクリーンショット 2020-04-17 0.13.38.png

◎どうしてこうなるのかな:thinking:
background-color: purple;はセレクタが3つ、その他はセレクタが2つ以下で設定されています。
条件が多ければ多いほど優先順位が高くなるというルールなので、purpleの背景色が反映されました!

クラスセレクタの場合

:yellow_heart:要素名で指定するセレクタよりも優先順位が高くなります。

style.css
h1{background-color:red;}body.mononofuh1{background-color:yellow;}bodyarticleh1{background-color:purple;}bodyh1{background-color:pink;}

表示はこんな感じです。

スクリーンショット 2020-04-17 0.36.17.png

◎どうしてこうなるのかな:thinking:
今回はbackground-color: yellow;background-color: purple;に3つずつセレクタを設定しました。
セレクタが同じ場合は一番最後に記述したセレクタが優先され、条件が多ければ多いほど優先順位が高くなると今までいっておりましたが、この結果からわかるように『セレクタ数が同じ場合は、クラスを利用しているものの方が優先される』と言う結果になりました。

IDセレクタの場合

:heart:クラスセレクタよりも優先順位が高くなります。

style.css
#momokuroh1{background-color:red;}body.mononofuh1{background-color:yellow;}bodyarticleh1{background-color:purple;}bodyh1{background-color:pink;}

表示はこんな感じです。

スクリーンショット 2020-04-17 0.45.54.png

◎どうしてこうなるのかな:thinking:
みなさん見てください。IDセレクタの効力がめちゃめちゃ強い事が判明しました!!!!!
私の予想だとbackground-color: yellow;にクラスセレクタを含めてセレクタを3つ設定したので、背景色は黄色になるはずだったのですが、IDセレクタが圧勝でした。
セレクタ数を何個に増やしても、IDセレクタには勝てませんでした。
おそるべしIDセレクタ。

まとめ

優先順位の効力順で並べます!!!

第一位 : IDセレクタ
    →IDセレクタ1つだけで最強になる。クラスセレクタとか何個設定しても勝てぬ。

第二位 : クラスセレクタ
    →セレクタ数が同じ場合は、クラスを利用しているものの方が強い(※IDセレクタを除く)

第三位 : セレクト数の多さ
    →セレクタの数が多ければ多いほど強い(※IDセレクタを除く)

第四位 : 一番最後のセレクタ
    →一番最後に記述したセレクタが強い(※IDセレクタを除く)

初心者によるプログラミング学習ログ 299日目

$
0
0

100日チャレンジの299日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
299日目は、

CSSのposition: stickyでテーブルのヘッダー行・列を固定してborderもいい感じに

$
0
0

これは何

CSSのposition: sticky;だけででテーブルヘッダを固定できると聞いて感激し
border-collapse: collapse;だと枠線が変になることに絶望して
collapseぽく使えるようにした

ブツ

table.sticky-header{border-collapse:separate;border-spacing:0;/* ここ */}table.sticky-header:not(.not-vertical-sticky)>thead>tr>th{position:sticky;top:0;z-index:2;}table.sticky-header:not(.not-horizontal-sticky)>thead>tr>th:first-child{position:sticky;left:0;z-index:3;}table.sticky-header:not(.not-horizontal-sticky)>tbody>tr>th:first-child{position:sticky;left:0;z-index:1;}/* ここ */table.sticky-header>thead+tbody>tr>th,table.sticky-header>thead+tbody>tr>td{border-top:none;}table.sticky-header>thead>tr:not(:first-child)>th,table.sticky-header>thead>tr:not(:first-child)>td,table.sticky-header>tbody>tr:not(:first-child)>th,table.sticky-header>tbody>tr:not(:first-child)>td{border-top:none;}table.sticky-header>thead>tr>th:not(:first-child),table.sticky-header>thead>tr>td:not(:first-child),table.sticky-header>tbody>tr>th:not(:first-child),table.sticky-header>tbody>tr>td:not(:first-child){border-left:none;}tabletheadtrth,tabletheadtrtd,tabletbodytrth,tabletbodytrtd{border:10pxsolidred;/* あとは好みで普通にボーダーを適用させるだけ */}

SCSS版はここに置きました
https://github.com/umenosuke/tslib/blob/master/src/html/table/_stickyHeader.scss

説明

border-collapse: separate;のまま
border-spacing: 0;で隙間をなくし
重複してしまうborderをnoneにして対応

theadがあってもいいし無くてもいいように
上側のborderをnoneにするところはゴニョゴニョ

classのつけ外しで水平&垂直のstickyをそれぞれ有効/無効にできるようにしてます

参考

CSSのposition: stickyでテーブルのヘッダー行・列を固定する
https://qiita.com/orangain/items/6268b6528ab33b27f8f2


【Rails】kaminari + Bootstrapで見た目を整え、ページネーションを中央にする

$
0
0

kaminariとは

  • ページネーションを簡単に実装できるrailsのgemです

GitHub/kaminari

導入方法

gemfile
gem'kaminari'

gemを追加し

terminal
$bundle install

インストール

導入はこれで完了

表示されたページネーションを中央に

やり方非常に簡単です

まずはテンプレートファイルを作成

terminal
$rails g kaminari:views default

もしもBootstrapを導入しているなら

terminarl
$rails g kaminari:views bootstrap

defaultではなくbootstrapを選択する事で勝手に綺麗に整えてくれます

  • Bootstrap4を導入しているならbootstrap4にしてください

作成されたファイルをみてみると

views/kaminari/_pagenator.html.erb
<%=paginator.renderdo%><nav><ulclass="pagination"><%=first_page_tagunlesscurrent_page.first?%><%=prev_page_tagunlesscurrent_page.first?%><%each_pagedo|page|%><%ifpage.left_outer?||page.right_outer?||page.inside_window?%><%=page_tagpage%><%elsif!page.was_truncated?-%><%=gap_tag%><%end%><%end%><%=next_page_tagunlesscurrent_page.last?%><%=last_page_tagunlesscurrent_page.last?%></ul></nav><%end%>

ulclass="pagination"が当てられているので

application.scss
.pagination{justify-content:center;}

これでページネーションが中央に表示されました!

Railsチュートリアル備忘録 -HTML/CSS編-

$
0
0

HTML

複数のクラスの設定

class="クラス1 クラス2"

リンクの作り方

パターン1 : <%= link_to "名前", "リンク先",class:"クラス名" %>
パターン2 : <a href="リンク先" class="クラス名"> 名前 </a>

箇条書き

<ul class="クラス名">
    <li>内容1</li>
    <li>内容2</li>
    <li>内容3</li>
    ...
  </ul>

画像の挿入

<%= link_to image_tag("画像ファイル名", alt:"名前"),'リンク先' %>

CSS

基本的な文法

クラスの指定

.クラス名{
   内容;
}

例
.center {
  text-align: center;
}

idの指定

#id名{
   内容;
}

例
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
}

Bootstrap

Bootstrapを使うと、洗練されたWebデザインとユーザーインターフェイス要素を簡単にHTML5アプリケーションに追加することができる。最も大きな利点はレスポンシブデザインにできること。

bootstrap-sassのインストール

gem 'bootstrap-sass', '3.3.7'
$ bundle install

scssファイルの作成

$ touch app/assets/stylesheets/custom.scss

Bootstrap CSSの追加

app/assets/stylesheets/custom.scss
@import"bootstrap-sprockets";@import"bootstrap";

追加中...

floatの解除: clearfixとoverflow: hiddenの詳細

$
0
0

clearfix

https://web-manabu.com/html-css39/

clearfixとはCSSのテクニックの一つです。クリアフィックスと呼びます。clearfixは親要素で指定します。clearfixには様々な手法がありますが、どれもfloat問題を回避するためのテクニックです。

clearfixは親要素内の最後の子要素をCSSで擬似的に作り出し、それにclear: both;を指定してfloatを解除しています。

擬似要素にheight:0;を指定しているため見た目には存在しないようになっています

overflow: hidden

https://creive.me/archives/19309/

応用的役割
ただし、これは時々本来の目的から外れた使い方もされます。例えば、floatを解除するために使われることもあります。clearfixやclearbothと同じ効果が出せるのです。そのため、overflowはfloat解除の手段として理解される方もいますが、これは本来の使い方とは違うという点は理解しおいてください。

マルチブラウザ対策について

$
0
0

マルチブラウザとは

アプリケーションが様々なブラウザ上でも同じ動作をすること。
クロスブラウザともほぼ同義であり、マルチブラウザはアプリケーションの製作者が推奨するブラウザで動作することを保証しクロスブラウザは全てのブラウザで動作することを保証することを意味する。

マルチブラウザ対策の5つの方法

 1. cssハック

cssハックとは
ブラウザごとに適応させるcssを変えること

css
/* IE11のみ適応 */@mediaalland(-ms-high-contrast:none){*::-ms-backdrop,.selector{/* 適用したいスタイル */}}/* FireFoxのみ適用 */@-moz-documenturl-prefix(){/* 適用したいスタイル */}/* Chrome、Safari、Operaのみ適用 */@mediascreenand(-webkit-min-device-pixel-ratio:0){/* 適用したいスタイル(Chrome、Safari、Operaのみ適用) */}

 2. リセットcssの使用

リセットcssとは

ブラウザでは、デフォルトの余白やフォントの大きさを定義しているため、各ブラウザによってデザインの表示が変わってしまうことがある。
この差異を無くすためにデフォルトで適応されているcssをリセットするためのもの

リセットCSSの読み込み方は、下記の記述をhead内に記述する

html
<!DOCTYPE html><htmllang="jp"><head><metacharset="UTF-8"><linkrel="stylesheet"href="パス/reset.css"><title>Document</title></head>

 3. cssの記述法

padding, margin, borderなど要素ごとのレンダリングは、全てのブラウザで異なる。
なのでcssの記述に工夫が必要

css
/* 横幅が100pxもしくは150pxとブラウザによって表示が変わってしまう */div{width:100px;padding-left:50px;}/* widthとpaddingを分けて記述すればどのブラウザでも同じ幅で表示される */div{width:100px;}divp{padding-left:50px;}

 4. jQueryの使用

javascriptでは、ブラウザ毎に記述することを意識しなければならないが、jQueryはクロスブラウザに対応しているのでブラウザの違いを特に意識する必要はない

 5. ブラウザ対応状況をチェック

HTML5、CSS3はブラウザによっては使えない場合があるので、プロパティーをブラウザ対応状況を簡単にチェックできるサービスCan I useを使う

スクリーンショット 2020-01-31 0.40.24.png

使い方は 「Can I use ______ ?」の部分に調べたい要素を入力するだけでどのブラウザで対応しているのかを調べることができる。

Bootstrapのボタンの色を増やす方法

$
0
0

CDNを使っている方npmまたはyarnを利用してください。

インストール

Bootstrapをインストールしてご利用ください。

$ npm install bootstrap

Scss作成

/scss/style.scss
$qiita:#55c500;$theme-colors:("qiita":$qiita,);@import"../node_modules/bootstrap/scss/bootstrap.scss";

コードはこれだけです。
Gulpなどでコンパイルしてください。

確認

index.html
<!DOCTYPE html><htmllang="ja"><head><metacharset="utf-8"><title>Bootstrap Qiita</title><linkrel="stylesheet"href="./css/style.css"></head><body><buttontype="button"class="btn btn-primary">Primary</button><buttontype="button"class="btn btn-qiita">Qiita</button></body></html>

これで新たにbtn-qiitaが追加されていることが確認できます。
badge-qiitaも追加されてたりします。

注意点として、btn-qiita分コードが増えるので、容量も増えます。
ほどほどでどうぞ。
逆に削ることも出来るので開発、実行環境とご相談ください。

以上

npm等でインストールすると、CDNでBootstrapを利用することがなくなるぐらい便利になります。
よっぽどの理由がない限りCDNの利用は避けたほうが吉です。

Viewing all 8760 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>