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

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

$
0
0

100日チャレンジの206日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

206日目は


本日のアウトプット

$
0
0

HTMLとCSSについて

divでブロック要素を作る時に、何も指定をしなければブロックは縦に並ぶが、
floatを使用することで横並びにすることが出来る。

横並びにした時にブロックの位置指定をしたい時には絶対を表すabsoluteを用いる。
bottom要素にabsolute,0pxを指定すれば、bottomは画面の一番下に配置が出来る。

以上、本日学んだHTML,CSSについてのまとめでした。
今日も頑張ります:smiley::computer:
白石麻衣ちゃん可愛い、、、癒しです。わら
白石麻衣.jpg

Sharepointカスタマイズポイントメモ

$
0
0

導入

Sharepointの基本機能だけで業務サポートサイトを構築するので、ポイントや忘れがちな点を一覧化しておく。
目的別の見出しで並べていく。

ページのタイトル書き換え

Javascript
$(function(){varheaderTitleElement=$("#DeltaPlaceHolderPageTitleInTitleArea>span>span>a");headerTitleElement[0].innerHTML="書換え後のタイトル名";});
css

なし

JavaScriptでのGetパラメータ取得

Javascript
vararg=newObject;url=location.search.substring(1).split('&');for(i=0;url[i];i++){vark=url[i].split('=');arg[k[0]]=k[1];}varid=arg.user_id;
css

なし

文字列リンクを画像リンクに差し替える

Javascript
$(function(){varele=$("#scriptWPQ3 tbody td:nth-of-type(6)");ele[0].innerHTML='<img src="/sites/jphgt4743/SiteAssets/document_download.png">';ele[1].innerHTML='<img src="/sites/jphgt4743/SiteAssets/document_download.png">';});
css
#scriptWPQ3tbodytd:nth-of-type(6)img{width:23px;}

リンクのクリック範囲を広げたい #CSS

$
0
0

やりたいこと

 スマホサイズでもクリックしやすいように、リンクのクリック範囲をもう少し広げたい。
 例えば下の例だと、そのまま記述した場合 aタグの「詳細はこちら」の文字の範囲のみ、リンクに飛べるようになっている。これを、親要素である divタグ全体までクリック範囲を広げ、 h1タグimgタグでもリンクに飛べるようにしたい。

sample.html
<divclass="div"><imgsrc="img.png"><h1>タイトル</h1><ahref="#">詳細はこちら</a><!-- 普通はリンクに飛べるのはこの箇所だけ --></div>

解決方法

CSSの、positionプロパティで解決する。
positionプロパティを忘れた時はこちら、をいつか追加します。きっと。

基本的な考え方

aタグの範囲を、divタグの左上を基準とし(①〜④)、そこから幅100%(⑤)、高さ100%(⑥)とすることで、 divタグ全体までクリック範囲を広げる。

こうすることで、aタグの範囲 = divタグの範囲となる。
イメージとしては、divタグの上に、 aタグがぴったり重なっている感じ。

sample.css
.div{position:relative;/* ① */}.parenta{position:absolute;/* ② */top:0;/* ③ */left:0;/* ④ */width:100%;/* ⑤ */height:100%;/* ⑥ */}


あれ、でも思うてたのとちょっと違う

 確かに h1タグや imgタグもクリックできるようになってるけど、aタグの「詳細はこちら」という文字が画像の上に表示されてる!なんで??

イメージとしては、divタグの範囲の上に、 aタグの範囲がぴったり重なっている感じ。

 そう、「詳細はこちら」というテキストを”含む” aタグが、divタグの上に重なっているから。
 解決するには、まず「詳細はこちら」という文字列を削除しちゃう。そのあとで、aタグ以外のタグで文字列を書く。aタグっぽくしたいなら、CSSでcolorやtext-decolationなどのstyleを追加すると○。

sample_2.html
<divclass="div"><imgsrc="img.png"><h1>タイトル</h1><span>詳細はこちら</span><!-- 適当なタグを追加する --><ahref="#"></a><!-- この中の文字列を削除 --></div>

補足(見ても見なくてもどっちでもいいもの)

  • 今回は親要素がdivタグだったが、ulやliなどでもできる!
    ただしブロック要素。Float要素の場合は重なり順で注意が必要。
  • 広げたリンク範囲の中にさらに別のリンクを追加したい場合も基本は一緒!
    別のリンクに飛ぶaタグをクラス名をつけて追加し <a href="#2" class="inline">、そのpositionをrelativeにすればOK! .div a.inilnk{position:relative; z-index:3}

paddingのある親要素と同じwidth100%の要素を入れる

$
0
0

よくある作り

See the Pen paddingのある親要素と同じwidth100%の要素を入れる by nozomi (@key055) on CodePen.

#mainContent{width:600px;min-height:100vh;background-color:#fff;margin:0auto;padding:40px;box-sizing:border-box;}.haba100{background-color:#29292e;color:#fff;width:600px;margin-left:-40px;box-sizing:border-box;padding:10px40px;font-size:14px;}

widthを親と同じにして、親のpaddingの分だけmarginでマイナスに良い。

簡単だった。
今まで頭硬かったなぁ。

【 Visual Studio Code 】痛ターミナル化計画 そのに!

$
0
0

はじめに

前に書いた奴はこちら
※すでにVSCode側の構造が変わっており、前に書いた奴は対応していないので注意!
要素の調べ方とかが知りたい人は前のを見てね

今回やること

ターミナルの背景をターミナルごとに変える

いざ実装内容にまいる

とりあえず完成物(ソースコード)

対応している範囲がそれぞれ違う3種類を用意しました。

terminalのtabのみ対応版

/*
terminalのtabごとに画像が変わります。
split機能を使用しても背景画像はtabに設定されたもののままです。
*//*地味にここのクラス指定が他の二つと違うので注意*/.terminal-outer-container.terminal-tab::after{content:'';background-size:cover;width:100%;height:100%;position:absolute;top:0px;right:0px;background-position:top;opacity:0.15;pointer-events:none;}.terminal-tab:nth-of-type(3n+1)::after{background-image:url(痛画像のpath);}.terminal-tab:nth-of-type(3n+2)::after{background-image:url(痛画像のpath);}.terminal-tab:nth-of-type(3n+3)::after{background-image:url(痛画像のpath);}

terminalのsplit機能のみ対応版

/*
split Terminal機能で分割されたターミナルそれぞれに画像が設定されます。
タブを増やしても表示される画像は変わりません。
*/.terminal-outer-container.split-view-view::after{content:'';background-size:cover;width:100%;height:100%;position:absolute;top:0px;right:0px;background-position:top;opacity:0.15;pointer-events:none;}.terminal-tab.split-view-view:nth-of-type(3n+1)::after{background-image:url(画像のパス);}.terminal-tab.split-view-view:nth-of-type(3n+2)::after{background-image:url(画像のパス);}.terminal-tab.split-view-view:nth-of-type(3n+3)::after{background-image:url(画像のパス);}

terminalのtab,split両方対応版

/*
tabとsplit、両方の画像をそれぞれ指定しています。
細かく指定できます。
*/.terminal-outer-container.split-view-view::after{content:'';background-size:cover;width:100%;height:100%;position:absolute;top:0px;right:0px;background-position:top;opacity:0.15;pointer-events:none;}.terminal-tab:nth-of-type(3n+1).split-view-view:nth-of-type(2n+1)::after{background-image:url(画像のパス);}.terminal-tab:nth-of-type(3n+1).split-view-view:nth-of-type(2n+2)::after{background-image:url(画像のパス);}.terminal-tab:nth-of-type(3n+2).split-view-view:nth-of-type(2n+1)::after{background-image:url(画像のパス);}.terminal-tab:nth-of-type(3n+2).split-view-view:nth-of-type(2n+2)::after{background-image:url(画像のパス);}.terminal-tab:nth-of-type(3n+3).split-view-view:nth-of-type(2n+1)::after{background-image:url(画像のパス);}.terminal-tab:nth-of-type(3n+3).split-view-view:nth-of-type(2n+2)::after{background-image:url(画像のパス);}

解説

原理

:nth-of-type(n)を使用して一番目の要素、二番目の要素をそれぞれ指定して画像を切り替えるようにしただけです。
(3n+1)とかになっているのは4ページ目を開いた際に画像がループしてまた一番目の画像が表示されるようにするためです。設定する画像の枚数に合わせて個別に変変更してください。

また、背景画像によっては基準位置を上にしたり、左にしたりしたいと思います。
その時はbackground-position: 基準にしたい場所;を指定してあげてください。
画像のパスを指定しているセレクタ部分に一緒に書けば、画像ごとに基準を変えることもできます。

各クラスについて

  • .terminal-tabクラス
    new Terminalボタンを押した際に追加されるターミナルのタブのクラス

  • .split-view-viewクラス
    .terminal-tabの子孫クラスであり、split Terminalボタンを押した際に分割された各ターミナルのクラス

split機能を使用した場合の各画面イメージ

terminal-tabのみ対応版
terminal-tab_only.png

split機能対応版
split-view-view.png

どっちもいい感じで悩んじゃう…

最後に

少し工夫をするだけで簡単に見た目が華やかになるので、みんなもいろいろいじってみよう!!!
あと、もし何か間違っている部分があったり、気になることがあったらコメントください!

だれかこれをVSCodeの拡張で作ってくれないかな…
自分でやるのはめんどk...

関連ページ

【 Visual Studio Code 】のターミナルの背景を痛く出来ないか試してみた
自分が前に書いたやつ
VSCodeの開発者コンソールの開き方とか書いてある

Visual Studio Code 痛ターミナル化
自分の書いた前の奴が対応しなくなったときに、対応版を書いてくれた記事
今回のソースはこれをもとに手を加えたもの
サイドバーの画像変更も書いてる

workbench.colorCustomizationsを用いた痛Visual Studio Code化計画
自分がVSCodeのターミナルの背景画像をいじるきっかけになったやつ

画像プレビューをCSSのtransformで実装しようとしたけど諦めた話

$
0
0

書きながらいろいろ情報が整理され、ただ変な方向に向かっていって苦しんでいただけだったことがわかっただけのポエムになってしまった気がする。

つくろうと思ったもの

  • Vue.jsで実装
  • よくある、画像プレビュー
  • 拡大、縮小、回転、ドラッグができる
  • ドラッグしたとき、プレビュー画像が見切れないように制御する

これを、transform: scale(1) rotate(0deg) translate(0,0);みたいな感じで制御しようとした。

なぜ諦めたか

rotateすると、translateの方向も回転する

transform: scale(1) rotate(0deg) translate(0,0);だけで完結したかったが、、
rotateで回転している時に、translateで移動させようとすると、思った方向に移動しなかった。
例えば、180度回転させた状態でドラッグすると、思った方向と真逆に移動する・・・
これは、厳密に言うと、解決できないことはない。と思う。。
ただ、解決方法は、ドラッグの移動先を回転に合わせて全て調整するということ。
今回つくろうとしていた回転の仕様は90度刻みの4パターンだったので、まだ可能な範囲だったが、コードが増えるだけだと思い、泣く泣く違う方法(position: absolute;で制御)で対応することにした。

また、ドラッグがない場合は特に問題なくtransformで完結できる。

最終的につくったもの

  • scaleとrotateはtransformで制御
  • ドラッグはpositionで制御
<template><divref="drag_area"class="drag_area"@mousedown="dragStart($event)"@mousemove="dragMove($event)"@mouseup="dragEnd($event)"@mouseleave="dragEnd($event)"><imgref="preview_image"class="preview_image"src="image.png":style="{transform: 'scale('+scale+') rotate('+rotate+'deg)',top: new_pos.y+'px',left: new_pos.x+'px'}">
    <divclass="control_btn"><button@click="zoomIn"></button><button@click="zoomOut"></button><button@click="rotateLeft"></button><button@click="rotateRight"></button><button@click="resetStyle"></button></div></div></template><script>exportdefault{data(){return{scale:0.8,rotate:0,new_pos:{x:0,y:0,},prev_pos:{x:0,y:0,},isDrag:false,}},mounted(){this.resetStyle();},methods:{zoomIn(){this.scale*=1.2;if(this.scale>10){this.scale=10;}},zoomOut(){this.scale/=1.2;if(this.scale<0.1){this.scale=0.1;}},rotateLeft(){this.rotate-=90;},rotateRight(){this.rotate+=90;},resetStyle(){this.scale=0.8;this.rotate=0;this.new_pos.x=(this.$refs.drag_area.offsetWidth-this.$refs.preview_image.offsetWidth)/2;this.new_pos.y=(this.$refs.drag_area.offsetHeight-this.$refs.preview_image.offsetHeight)/2;this.prev_pos={x:0,y:0,};},dragStart(e){e.preventDefault();this.isDrag=true;this.prev_pos.x=e.pageX;this.prev_pos.y=e.pageY;},dragMove(e){if(this.isDrag){// マウス座標の差分letmoved_x=e.pageX-this.prev_pos.x;letmoved_y=e.pageY-this.prev_pos.y;// ドラッグで移動できる範囲を制御leta_w=this.$refs.drag_area.offsetWidth;leta_h=this.$refs.drag_area.offsetHeight;letb_w=this.$refs.preview_image.offsetWidth;letb_h=this.$refs.preview_image.offsetHeight;letc_w=b_w*this.scale;letc_h=b_h*this.scale;letdiff_w=(c_w-c_h)/2;letdiff_h=(c_h-c_w)/2;letmax_x=a_w-(b_w-c_w)/2-40;letmin_x=-(b_w-(b_w-c_w)/2-40);letmax_y=a_h-(b_h-c_h)/2-40;letmin_y=-(b_h-(b_h-c_h)/2-40);// 回転したときの差分if(this.rotate/90%2!==0){max_x-=diff_w;min_x+=diff_w;max_y-=diff_h;min_y+=diff_h;}// 移動距離を反映letnew_pos_x=this.new_pos.x+moved_x;letnew_pos_y=this.new_pos.y+moved_y;if(new_pos_x>max_x){this.new_pos.x=max_x;}elseif(new_pos_x<min_x){this.new_pos.x=min_x;}else{this.new_pos.x=new_pos_x;}if(new_pos_y>max_y){this.new_pos.y=max_y;}elseif(new_pos_y<min_y){this.new_pos.y=min_y;}else{this.new_pos.y=new_pos_y;}// マウス座標を更新this.prev_pos.x=e.pageX;this.prev_pos.y=e.pageY;}},dragEnd(e){this.isDrag=false;},}}</script><stylelang="scss"scoped>// ※デザインの部分は省略してます。.drag_area{cursor:move;position:relative;overflow:hidden;.preview_image{position:absolute;top:0;left:0;width:auto;height:auto;max-width:100%;max-height:100%;transform:scale(.8)rotate(0deg);}}</style>

少し解説

インラインスタイルをバインディング

  • transform: scale(.8) rotate(0deg);top: 0;left: 0;の値を更新する。
<imgref="preview_image"class="preview_image"src="images.png":style="{transform: 'scale('+scale+') rotate('+rotate+'deg)',top: new_pos.y+'px',left: new_pos.x+'px'}">

@mousedown="dragStart($event)"でドラッグ開始

  • 今回、画像プレビューだったので、drag_areaにドラッグイベントをセットしているが、対象のみにイベントをつける場合はpreview_imageにしても大丈夫はず。
  • isDragがtrueのときだけマウスの動きに合わせてプレビュー画像を移動する。
  • offsetX,offsetYを使ったら、誤作動したので、pageX,pageYを使用して、ドラッグを開始した位置を保存。
dragStart(e){e.preventDefault();this.isDrag=true;this.prev_pos.x=e.pageX;this.prev_pos.y=e.pageY;},

@mousemove="dragMove($event)"でプレビュー画像を移動する

最低限の部分
  • dragStart()で保存した開始位置と今のマウス座標の差分(=ドラッグした距離)を今のtopとleftの値に加算して移動させる。
dragMove(e){if(this.isDrag){// マウス座標の差分letmoved_x=e.pageX-this.prev_pos.x;letmoved_y=e.pageY-this.prev_pos.y;// 移動距離を反映this.new_pos.x+=moved_x;this.new_pos.y+=moved_y;// マウス座標を更新this.prev_pos.x=e.pageX;this.prev_pos.y=e.pageY;}},
「ドラッグしたとき、プレビュー画像が見切れないように制御する」の部分

いろいろな要因から複雑に考えてしまっていたが、結構シンプルな計算だった。
一応画像で説明します。
また、-40は見切れないように残す大きさなので、説明では無視します。

A:ドラッグできるエリア(drag_area)
B:プレビュー画像のデフォルトサイズ(preview_imageのscale(1))
C:プレビュー画像の表示サイズ(preview_imageのscale(0.8))
とします。
preview_1.png

ここでの問題は、支点が、scaleしても変わらないということ
具体的に言うと、Cの支点もBの左上の位置ということです。

Cの右に移動できる範囲(max_x)は、
scaleが1だったら、
Aの横幅

scaleが1ではなかったら、
Aの横幅 - BとCの横幅の差分の半分
preview_2.png

Cの左に移動できる範囲(min_x)は、
Bの横幅 - BとCの横幅の差分の半分
preview_3.png
となります。

// ドラッグで移動できる範囲を制御leta_w=this.$refs.drag_area.offsetWidth;leta_h=this.$refs.drag_area.offsetHeight;letb_w=this.$refs.preview_image.offsetWidth;letb_h=this.$refs.preview_image.offsetHeight;letc_w=b_w*this.scale;letc_h=b_h*this.scale;letmax_x=a_w-(b_w-c_w)/2;letmin_x=-(b_w-(b_w-c_w)/2);letmax_y=a_h-(b_h-c_h)/2;letmin_y=-(b_h-(b_h-c_h)/2);

あとは、このmax,minの値でドラッグの移動距離を制御する。

// 移動距離を反映letnew_pos_x=this.new_pos.x+moved_x;letnew_pos_y=this.new_pos.y+moved_y;if(new_pos_x>max_x){this.new_pos.x=max_x;}elseif(new_pos_x<min_x){this.new_pos.x=min_x;}else{this.new_pos.x=new_pos_x;}if(new_pos_y>max_y){this.new_pos.y=max_y;}elseif(new_pos_y<min_y){this.new_pos.y=min_y;}else{this.new_pos.y=new_pos_y;}
回転したときの調整

これも、諦めかけた問題、、
rotateしても、支点の位置は変わらない

どういうことかというと、
例えば、横長の画像を90度回転させて、縦長にしたとする。
しかし、支点は、回転する前の位置なので、それを考慮してドラッグ可能範囲を設定しなければならない。
preview_4.png
しかしこれは、冷静に考えれば、今回の90度刻みの仕様なら対応できると気づき、
縦向きになったとき(rotateを90で割り、奇数かどうかで判断)に
Cの縦横の差分の半分を足すか引くかで調整できた。

letdiff_w=(c_w-c_h)/2;letdiff_h=(c_h-c_w)/2;// 回転したときの差分if(this.rotate/90%2!=0){max_x-=diff_w;min_x+=diff_w;max_y-=diff_h;min_y+=diff_h;}

@mouseup="dragEnd($event)"@mouseleave="dragEnd($event)"でドラッグ終了

dragEnd(e){this.isDrag=false;},

上記の理由で結局使わないことになったが、rotateが絡まなければ解決した、scaleとtranslateの兼ね合い

  • 私をややこしくした原因は、scaleの支点をセンターで行いたい関係で、translateの支点も左上ではなくセンターだったことである。
  • ドラッグ可能範囲の計算をとても複雑に考えてしまった。。
  • scaleの値はtranslateにも影響があり、なかなかうまく調整できなかったが、scaleの値を割って計算することで、辻褄を合わせることができた。
  • transform: scale(1) translate(0,0);なら、問題なく調整できた。

差分のみ書きます。

  • transform: scale(.8) translate(0,0);をインラインスタイルにバインディング
<imgref="preview_file"class="preview_file":src="images[activeIndex].data":style="{transform: 'scale('+scale+') translate('+new_pos.x+'px,'+new_pos.y+'px)'}">

ドラッグ可能範囲の計算

↓なぞに考えてしまった内容
支点がセンターなので、
Cの右に移動できる範囲(max_x)は、
scaleが1かつ、AとBの横幅が同じだったら、
Cの横幅

scaleが0.8で、AとBの横幅が同じだったら、
(Cの横幅 + BとCの横幅の差分の半分) ÷ 0.8

scaleが0.8で、AとBの横幅が違ったら、
(Cの横幅 + BとCの横幅の差分の半分 + AとBの横幅の差分) ÷ 0.8

このように、scaleの値を割ることによって、扱うべき値をもとめることができる。

と、なぞに複雑に考えていたが、(本当はさらにからみ合ってこれと同じ値を導き出していた)
パズルをはめ直してみると、
(Aの横幅 - BとCの横幅の差分の半分) ÷ 0.8
で問題なかった。。

ようは、scale分割って戻せばよかったのだった。。。

letmax_x=(a_w-(b_w-c_w)/2)/this.scale;letmin_x=-(b_w-(b_w-c_w)/2)/this.scale;letmax_y=(a_h-(b_h-c_h)/2)/this.scale;letmin_y=-(b_h-(b_h-c_h)/2)/this.scale;

お疲れ様でした。

参考サイト

https://fuwafuwac.com/?p=748
https://qiita.com/yukiB/items/cc533fbbf3bb8372a924

JavaScriptをWEBサイト(HTMLファイル)に適用する方法

$
0
0

さぁJavaScript自体はなんとなく理解できたぞ、ってなってもそれを実用できないと意味がないですよね。

ターミナルでわちゃわちゃやってるだけでも楽しいけど、やっぱりWEBサイトに適用させた方がもっと面白いはずです。今回は、HTMLファイルにJavaScriptを適用する方法をメモしていきます。

HTMLファイルにJavaScriptを適用する方法

1. HTMLタグの中に入れる

qiita.html
<bodyonload="alert('this is alert');"><h1>Hello</h1></body>

この場合は、Bodyがロードされた時にalertが実行されます。CSSもこんな感じでタグに直接適用することができますけど、あんまりやらないですよね。

2. HTMLファイルの中にJavaScriptスペースを作る

qiita.html
<body><h1>Hello</h1>


   //こちらがJavaScriptスペース

   <script type="text/javascript">alert('this is alert');</script></body>

同じくCSSでも同じようにできますけど、こちらもあんまりやらないやつ。

3. 外部JavaScriptファイルを使用して適用する

こちらが本命。CSSのように外部シートを作成して、そちらにJavaScriptを記述していくタイプになります。

qiita.html
<body><h1>Hello</h1>


   //こちらが外部JavaScriptシート(index.js)の参照

   <script src="index.js"charset="utf-8"></script></body>
index.js
alert('this is alert');

ちなみに、ポイントとしてCSSへのlinkはHTMLファイルの最初に記述するのに対し、JavaScriptファイルへの参照はBodyタグの一番最後に記述します。

(理由として、HTMLファイルは上から順に読み込まれていくので、特定のclass,idを指定するJavaScriptのファイルが上にあるとそもそもタグを参照できないからです。例えば、h1に適用するJavaScriptのプログラムを書いたとすると、そもそもh1が読み込まれていないと適用できないんですね。)

そして、これで 1,2,3 ともに全て同じ処理をすることができました。

DOM(Document Object Model) とは

簡単にいうと、HTMLをJavaScriptで操作する仕組みのことです。HTMLファイルは下記のようなツリー構造(階級構造)になっていると考え、その要素(Node ノード)を指定してJavaScriptを適用していくことができます。

スクリーンショット 2020-01-08 08.42.38.png
(Chrome拡張機能のHTML Tree Generatorです。めっちゃ便利なので是非)

・DOMを使用して変更できるもの

そして、DOMを使用して変更できるのは大きく2つに分かれます。

  1. Properties (プロパティ)

状態を変えるもの。例えば、そのノードの色や文字を変更したり。

  1. Methods (メソッド)

何か動作を加えるもの、例えば、何か関数を適用したり。

・Node(ノード)を指定してJavaScriptを適用する方法

それでは具体的な指定の方法と適用方法です。まず階級構造ですがDocumentの中に、このHTMLファイルがあると考えます。

上記画像のH1を指定したい時はこんな感じです。

qiita.js
document.firstElementChild.lastElementChild.firstElementChild;

Documentの中の最初の子ノード(HTML)の中の最後の子ノード(BODY)の中の最初の子ノード(H1)が指定されています。

指定するの結構めんどくさいですよね。
でも大丈夫。ちゃんとid名やclass名で指定できるものがあります。

qiita.js
//id名で指定document.getElementById("idName");//class名で指定document.getElementsByClassName("className");//タグの名前で指定document.getElementsByTagName("h1");//h1複数ある場合は配列に格納されているので、何個あるか確認document.getElementsByTagName("h1").length;//その配列の2個目の色をREDに変えたい場合document.getElementsByTagName("h1")[1].style.color="red";

注意!! 詳しく見てみると getElementとgetElementsで複数形になっています。idが1つなのに対し、classやtagnameは複数形なので配列で戻されます。例えclassが適用されている場所が1つしか無くても、Elementsなので配列で返されるのです。

もっと詳しく見たい人は、KDEさんのがすごく綺麗にまとまっていたのでそちらを参考に→リンク

・セレクタで指定してJavaScriptを適用する方法

でも結局よく使うのはセレクタでの指定みたいです。セレクタっていうのはCSSのスタイルシートでよく使う、タグなら h1 とか、クラスなら .class名 とか、IDなら #id名 みたいなやつです。

qiita.js
//タグを選択する場合document.querySelector("h1");//IDを選択する場合document.querySelector("#idName");//クラスを選択する場合document.querySelector("className");//リストの中のaリンクのみを選択する場合(階級構造)document.querySelector("li a");//nameというクラス名を持つ リストを選択する場合document.querySelector("li.name");// id名"List"の中にあるクラス"item"の要素を全て抽出document.querySelectorAll("#list .item");

この辺を使えばだいたい対応できるんじゃないかな。

DOMを使用してJavaScriptでCSSを操作する

JavaScriptを使用して、要素のCSSを変更することができます。

例えば、h1の色を赤に変えたいときは

qiita.js
//selectorでh1を選択して、styleの色を"red"に変える。document.querySelector("h1").style.color="red";

色だけじゃなくて、backgroundColorとか、fontFamilyとか、色々なスタイルを変えることができます。ポイントは、CSSだとbackground-colorだったのが、キャメルケースCamel Lettersになり、backgroundColorになることです。

そのほかにもめっちゃたくさんあるので、詳しくはw3schoolsを参照ください。
w3schoolリンク

クラスをJavaScriptで適用したり、外したりする

CSSのスタイルシートに存在するクラスを、JavaScriptを使用して要素に外したり、つけたりすることができます。

例えば、CSSのスタイルシートに"gorilla"というclass名のスタイルがあるとします。

style.css
.gorilla{color:brown;}

このクラス"gorilla"を h1タグに適用したり、しなかったりする方法。説明下手か。

index.html
<h1> Gorilla is the strongest animal in the world. </h1>
index.js
// Goriilaのノードを選択し、クラス gorilla を適用document.querySelector("h1")classList.add("gorilla");// すでに適用されているクラス"gorilla"を外すdocument.querySelector("h1")classList.remove("gorilla");// "gorilla"クラスがすでに適用されていれば外して、適用されていなければ適用するdocument.querySelector("h1")classList.toggle("gorilla");

適用して外すってそういうことね!ってなってくれたら嬉しいです。

HTMLのテキストをJavaScriptを使用して変更

h1タグのテキストを変えたい場合とかありますよね。あるかな笑
そんな時は、、、

qiita.js
//取得して変更document.querySelector("h1").textContent="changed H1 text";document.querySelector("h1").innerHTML="changed H1 text";

HTMLの属性をJavaScriptを使用して変更・追加

最後にHTMLタグ内の属性を変更する方法です。

qiita.js
<ahref="htps://www.google.com">グーグル</a>
//上記のaタグがどのような属性を持っているかを求めるdocument.querySelector("a").attributes;//aタグの特定の属性hrefを求めるdocument.querySelector("a").getAttribute("href");//→ この場合、"htps://www.google.com"が求められます。//最後にこのaタグのhref部分を置換しますdocument.querySelector("a").setAttribute("href","https://www.kibinag0.com");

これにてJavaScriptをWEBサイトに適用する方法終了。


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

$
0
0

100日チャレンジの206日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

207日目は

clip-pathでd3グラフの指定した範囲の色を変える

$
0
0

まえがき

d3でグラフを作成しているとき、指定した範囲のグラフ部分の色を変更したい場面があった。実際のイメージはこんな感じ。
スクリーンショット 2020-01-07 15.00.28.png

グラフのうち、値が100以上の部分は赤、それ以下は青で描画させる。

ところが、d3自体にはこれを簡単にやってくれる機能がないらしい。そこで、clip-pathというSVGのプロパティを使ってこれを実現する。

clip-pathとは

まず、clip-pathについて理解しておく必要がある。clip-pathを使用すれば、他の場所で定義された一部分を取り除くことができる。これをクリッピングと呼ぶ。

使用例1)
スクリーンショット 2020-01-07 1.42.47.png
コードは以下。

<svg><clipPathid="clip-left-above"><rectx="0"y="0"width="130"height="50"/> //切り取る部分の設定
        </clipPath><circlecx="100"cy="100"r="100"clip-path="url(#clip-left-above)"/> //元の図形
      </svg>

まず、clipPathタグに固有のidを指定したのち、そのタグ内で、切り取る部分(実際に描画させたい部分)を指定している。そして、元の図形(切り取りして描画させたい図形)のタグにclip-path属性を"url(#先程指定したclipPathのid)"の形で付与する。

すると、5行目で書かれている、中心が(cx, cy) = (100, 100)で半径100の円のうち、clipPath内で指定したrectと重なる部分のみが実際に画面に描画される。

使用例2)
スクリーンショット 2020-01-07 2.39.48.png

コードは以下。

<svgwidth="1000"height="1000"><clipPathid="clip-somewhere"><rectx="130"y="0"width="125"height="200"/><rectx="350"y="20"width="255"height="180"/><rectx="220"y="220"width="120"height="110"/><rectx="400"y="200"width="170"height="155"/><rectx="130"y="350"width="190"height="110"/><rectx="430"y="440"width="220"height="50"/><rectx="145"y="515"width="450"height="40"/><rectx="222"y="570"width="160"height="100"/><rectx="490"y="560"width="230"height="230"/></clipPath><imagexlinkHref={"画像のURL"}width="800"height="800"clip-path="url(#clip-somewhere)"/></svg>

何と、clip-pathを使えばこんなことまでできてしまう。画像が全部みたい?であれば、上記のコードを使って、ぜひ自分でやってみると良い。見たい部分をclipPathのタグ内で好きな形で範囲指定できる。

d3グラフで指定の範囲の色を変える

おふざけはここまでにして、本題に戻る。
今回はこのclip-pathを使って、100を超える範囲についてのみ色が赤くなる棒グラフを作成する。
スクリーンショット 2020-01-07 15.00.28.png

作成の手順としては、まず切り取られる対象(棒グラフ)を作成する際、ほぼ全く同じ値を持ち、同じ動きをするグラフを2つ作る。そしてそのそれぞれに異なるclip-path属性を指定して、違う色を指定する。

d3.select(graphSelector)
            .selectAll(".bar-below")
            .data(Data)
            .enter()
            .append("rect")
            .attr("clip-path", "url(#clip-below)") //clip-path属性の指定
            .attr("class", "bar-below")
            .attr("x", d => Number(scale.x(d.x.toString())) + 5)
            .attr("y",  height)
            .attr("width", width / Data.length - barPadding)
            .attr("y", d => scale.y(d.y))
            .attr("height", d => height - scale.y(d.y))
            .style("fill", "blue"); //clip-belowで切り取られた範囲は青

        d3.select(graphSelector)
            .selectAll(".bar")
            .data(Data)
            .enter()
            .append("rect")
            .attr("x", d => Number(scale.x(d.x.toString())) + 5)
            .attr("y",  height)
            .attr("width", width / Data.length - barPadding)
            .attr("clip-path", "url(#clip-above)") //clip-path属性の指定
            .attr("class", "bar-above")
            .attr("y", d => scale.y(d.y))
            .attr("height", d => height - scale.y(d.y))
            .style("fill", "red"); //clip-aboveで切り取られた範囲は赤

そして次に、切り取る範囲の指定を行う。ここでclipPathタグをappendしてそのタグにid="clip-above"を指定する。ここで指定された範囲は赤色でfillされる。
ここでは、y="0"、すなわち上端から、横幅はグラフコンポーネントの幅、縦幅はグラフコンポーネントの縦幅の上端から10/13まで、すなわち130~100までの範囲を切り取っている。

d3.select(graphSelector)
.data(Data)
.append("clipPath")
.attr("id", "clip-above")
.append("rect")
.attr("x", d => Number(scale.x(d.x.toString())) + 5)
.attr("y", 0)
.attr("width", width)
//130から100までの高さを指定
.attr("height", (height * 3) / 13)

同様にして、100以下の範囲も切り取る。切り取られた範囲と、グラフが重なる部分は青く描画される。

        d3.select(graphSelector)
            .data(Data)
            .append("clipPath")
            .attr("id", "clip-below")
            .append("rect")
            .attr("x", d => Number(scale.x(d.x.toString())) + 5)
            //100%の高さを起点に指定
            .attr("y", (height * 3) / 13)
            .attr("width", width)
            .attr("height", 500)

ちなみにブラウザのHTMLはこんな感じ。作成の際の参考にしてほしい。

<gclass="graphContainer"><clipPathid="clip-above"><rectx="5"y="0"width="500"height="69.23076923076923"></rect></clipPath><clipPathid="clip-below"><rectx="5"y="69.23076923076923"width="500"height="500"></rect></clipPath><rectclip-path="url(#clip-below)"class="bar-below"x="5"y="184.6153846153846"width="45"height="115.38461538461539"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="55"y="46.15384615384615"width="45"height="253.84615384615384"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="105"y="230.76923076923075"width="45"height="69.23076923076925"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="155"y="161.53846153846152"width="45"height="138.46153846153848"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="205"y="23.076923076923062"width="45"height="276.92307692307696"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="255"y="53.07692307692309"width="45"height="246.9230769230769"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="305"y="76.15384615384615"width="45"height="223.84615384615387"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="355"y="235.3846153846154"width="45"height="64.61538461538461"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="405"y="140.76923076923077"width="45"height="159.23076923076923"style="fill: blue;"></rect><rectclip-path="url(#clip-below)"class="bar-below"x="455"y="11.538461538461531"width="45"height="288.46153846153845"style="fill: blue;"></rect><rectx="5"y="184.6153846153846"width="45"clip-path="url(#clip-above)"class="bar-above"height="115.38461538461539"style="fill: red;"></rect><rectx="55"y="46.15384615384615"width="45"clip-path="url(#clip-above)"class="bar-above"height="253.84615384615384"style="fill: red;"></rect><rectx="105"y="230.76923076923075"width="45"clip-path="url(#clip-above)"class="bar-above"height="69.23076923076925"style="fill: red;"></rect><rectx="155"y="161.53846153846152"width="45"clip-path="url(#clip-above)"class="bar-above"height="138.46153846153848"style="fill: red;"></rect><rectx="205"y="23.076923076923062"width="45"clip-path="url(#clip-above)"class="bar-above"height="276.92307692307696"style="fill: red;"></rect><rectx="255"y="53.07692307692309"width="45"clip-path="url(#clip-above)"class="bar-above"height="246.9230769230769"style="fill: red;"></rect><rectx="305"y="76.15384615384615"width="45"clip-path="url(#clip-above)"class="bar-above"height="223.84615384615387"style="fill: red;"></rect><rectx="355"y="235.3846153846154"width="45"clip-path="url(#clip-above)"class="bar-above"height="64.61538461538461"style="fill: red;"></rect><rectx="405"y="140.76923076923077"width="45"clip-path="url(#clip-above)"class="bar-above"height="159.23076923076923"style="fill: red;"></rect><rectx="455"y="11.538461538461531"width="45"clip-path="url(#clip-above)"class="bar-above"height="288.46153846153845"style="fill: red;"></rect></g>

終わりに

clip-pathを使えば結構自由にグラフをアレンジできる。色を変える以外にも、使える用途がたくさんありそう。

画像の一部を隠したいときにvwを使うと便利

$
0
0

はじめに

後輩から教えてもらって非常に感動したテクニックのメモです。
人の写真の胸から上、など画像の一部だけ表示したい場合のテクニックです。

ググると出てくるテクニック

少しググると以下のような記事にたどり着きます。
https://stackoverflow.com/questions/11092146/how-to-hide-part-of-the-image

HTML:
<div class="image-container">
  <img src="some-image.jpg" />
</div>

CSS:
.image-container {
  max-height:100px;
  overflow:hidden;
}

画像をdivで包んでしまい、
親要素のハイトをピクセル単位で絞ってしまい、
はみ出した分は非表示とするやり方です。

これでも十分なのですが、イメージのwidthが100%などになっているといった
ディスプレイサイズに画像の大きさが依存する場合、うまく行きません。

結論

heightの値をピクセルでなくvw単位で実装します。

HTML:
<div class="image-container">
  <img src="some-image.jpg" />
</div>

CSS:
.image-container {
  max-height:40vw;
  overflow:hidden;
}

実際の値はデベロッパーツールを使って調整します。
これで、ディスプレイのサイズに寄らず、画像の一部を隠すことができます。

ダークモード切り替えボタンをjsでつくる

$
0
0

こんな感じのをつくりました(絵文字をクリックしてね!)。

See the Pen dark mode support js by MAKI I (@IKEMAKI) on CodePen.

はじめに

ここのところダークモードがブイブイいわせてますね。アプリや記事メインのWebサイトはどんどこ対応していってる印象です。
LINEのダークモード表示がかっこよくて好きです。

自分はまだお仕事のWeb制作でダークモード対応をしたことはないのですが、これからありそうだよね~と話が出たり、個人的に眩しいのが苦手でダークモード好きだったりなどの理由でいじってみました。ヒアウィーゴ

ざっくり何してるか

  • 見てる人のパソコンやスマホがダークモードかライトモードか調べて、設定されてたらあわせる
  • 設定されてなかったら、デフォルトのダークモードで表示する(私がダークモード好きだから)
  • チェックボックスを押されたらモードを切り替えて、ローカルストレージにどっちを選んだか保存しておく(次回訪問時には選んだモードがデフォルトになる)
  • 太陽と月の絵文字を置いといて、切り替えるたびぐるぐる回す

コード

HTML

<!-- 表示を切り替えてみたい要素  --><pclass="msg light">light mode</p><pclass="msg dark">dark mode</p><!-- モード切替スイッチ --><divclass="switch"><labelclass="switch-label"><inputtype="checkbox"id="js_mode_toggle"><spanclass="switch-mode"id="js_rotate"></span></label></div>

ぶっちゃけHTMLはなんでもいいです。
今回は絵文字もCSSで表示しちゃってますし、モードを手動で切り替える機能がいらなければユーザー側のスイッチも不要なので、好きな感じにしちゃっておkです。

CSS

/* デフォルトはダークモード表示 */body{margin:0;padding:1em2em;color:#AAAE8D;background-color:#1D1D2C;transition-duration:1s;transition-property:color,background-color;}.msg{font-size:30px;font-weight:bold;}.dark{display:blcok;}.light{display:none;}/* ライトモードのとき */.js-mode-light{color:#000;background-color:whitesmoke;}.js-mode-light.light{display:block;}.js-mode-light.dark{display:none;}/* モード切り替えボタン */input[type="checkbox"]{display:none;}.switch{position:fixed;top:.5em;right:.5em;font-size:60px;}.switch-label{cursor:pointer;}.switch-mode{position:absolute;top:-120px;right:-120px;display:block;width:200px;height:200px;transform:rotate(0);transition:transform1s;}/* 月と太陽を対角線上に設置しておく。
   設定したspanを回したら太陽がひっくり返ってしまったので、transform scaleで上下反転した */.switch-mode::before{content:"🌙";position:absolute;left:0;bottom:0;}.switch-mode::after{content:"🌄";position:absolute;right:0;top:0;transform:scale(1,-1);}

今回はモードを判定するCSSのメディアクエリは使っていません。またあとで説明します。

表示の切り替えは、ライトモードを設定されたらjsでbodyにjs-mode-lightというクラスをつけるようにしました。ライトモード時にあてたいスタイルを.js-mode-lightに書いていけばおkです。
たとえばレスポンシブ対応で、スマホ表示のときはpcクラスを非表示にする……みたいなのと同じ感覚です。

ただ、モードを手動で切り替えられるスイッチを付けた場合、レスポンシブ対応のようにただ表示/非表示を切り替えてしまっては味気ないので、色などは適宜transitionをうまく使って設定したほうが良いです。

また変化が広範囲におよんで事故る可能性も高いので、transition-propertyでちゃんと適用したいプロパティを定義しておくのも大事です。日頃からとりあえず流れるようにtransition: all .2s;と打ってしまう私のようではだめということです。

色とか数値は全部テキトーです。

JS

// 要素やクラスを指定しておくconstcheckToggle=document.getElementById('js_mode_toggle');constrotateIcon=document.getElementById('js_rotate');constclassLight='js-mode-light';// デバイスがライトモードかどうかチェックconstisLight=window.matchMedia('(prefers-color-scheme: light)').matches;// ローカルストレージに保存するための適当なKey名constkeyLocalStorage='whike-theme-mode';// ローカルストレージの情報を取得constlocalTheme=localStorage.getItem(keyLocalStorage);// 絵文字を回転させる角度letnowRotate=0;// ローカルストレージの中身と、端末がライトモードかどうか(ie,edgeには無意味)をチェックif(localTheme==='light'){// ローカルストレージの情報が優先rotateInfinite();changeMode('light');}elseif(localTheme==='dark'){changeMode('dark');}elseif(isLight){rotateInfinite();changeMode('light');}// チェックボックスでの切り替え、選択をローカルストレージに保存// モード切替スイッチが変更されたら発動checkToggle.addEventListener('change',function(e){// 絵文字大回転rotateInfinite();// チェックされたらライトモード、されなければダークモードにし、ローカルストレージにどちらを選んだか保存するif(e.target.checked){changeMode('light');localStorage.setItem(keyLocalStorage,'light');}else{changeMode('dark');localStorage.setItem(keyLocalStorage,'dark');}});/**
 * テーマ切り替え
 * @param {String} mode 'light' もしくは 'dark'
 */functionchangeMode(mode){// 引数にしたがってbodyにクラスをつける// チェックボックス経由で変更かかったときはいいんだけど、ローカルストレージとかからモードを変えた場合にチェック状態がおかしくなるので、合わせておくif(mode==='light'){document.body.classList.add(classLight);checkToggle.checked=true;}elseif(mode==='dark'){document.body.classList.remove(classLight);checkToggle.checked=false;}}/**
 * 月と太陽アイコン無限回転
 * 呼ばれるたびに180度角度が追加されていく
 */functionrotateInfinite(){nowRotate+=180;rotateIcon.style.transform='rotate('+nowRotate+'deg)';}

デバイスのテーマを調べる

デバイスのテーマを調べるには、CSSで用意されているprefers-color-schemeを使います。

prefers-color-scheme は CSS のメディア特性で、ユーザーがシステムに要求したカラーテーマが明色か暗色かを検出するために使用します。
by prefers-color-scheme - CSS: カスケーディングスタイルシート | MDN

なのでこれを使えばCSSだけで切り替えることができます。
こんなかんじで👇

.dark{display:block;}.light{display:none;}@media(prefers-color-scheme:light){.dark{display:none;}.light{display:block;}}

ただIEとEdgeが非対応なので、そこも対応する場合は(するよね??)結局JSを使うことになるため、両方で管理したくないっという思いから今回はJSだけ使っています。

参考: Can I use prefers-color-scheme ?

で、それをJSで使うときはwindow.matchMediaを使います。
ためしに開発者ツールのコンソールにwindow.matchMedia('(prefers-color-scheme: light)').matchesをコピペしてEnterすると、ライトモードならtrue、ダークモードならfalseが返ります。私はPCをダークモードにしているのでfalseになりました。
これでユーザーのデバイステーマを判定できました。

ユーザーの選択したテーマを保存

テーマを選択するボタンを設置した以上は、次回サイト訪問時も選んだテーマになってて欲しいので、ユーザーがどちらを選んだかブラウザのローカルストレージに保存しておきます。

保存は簡単で、localStorage.setItem(任意のKey名, 値);とすればおkです。
今回は、ライトモードのときにはlocalStorage.setItem('whike-theme-mode','light');、ダークモードのときにはlocalStorage.setItem('whike-theme-mode','dark');としています。whikeは私の名前です。そうそう被らないとは思いますが、固有のKeyにするため付けてます。
setItemで情報を保存したら、getItemでlocalStorage.getItem(Key名);こういう感じに取り出せます。もし設定されてなければnullが返ります。

Chromeであれば、開発者ツールApplicationタブのStorage欄に、Local Storageというのがあるのでそこを展開してみると、設定したKeyとValueが確認できます。他のブラウザでもだいたい似たようなところにあります。IEでも大丈夫😉

ちなみにローカルストレージは気軽に扱えるぶん、個人情報とかログイン情報とか、大事なものは置いちゃダメですよ✊

おわりに

最初なんとなくで月と太陽が入れ替わったら楽しいデショと思って作ったのですが、回すのが意外と面倒😂この動きにしなかったらもう少しシンプルなコードにできた気がします。
もっと上手に回せそうな気がするんですが……😵

やってることは結構単純だし、このやり方であればIEやEdgeも動いたので、お仕事で使う分にも特に問題はなさそうかなーという印象でした。
たぶん大変なのはデザイナーさんの方ですね(¯―¯٥)

IEとEdgeはアレですが、cssのメディアクエリでやるやり方はすぐに試せると思うのでやってみてください😍
Win10であれば設定>個人用設定>色>色を選択する>白or黒切り替えでPCのテーマを変えられるので(Macも似たような感じでダーク/ライト切り替え)、それに合わせてWebページが変化するのがオモロイです~やっぱ見た目が変わるのは楽しい😍😍

コードに関しては、やりたいことを中心にモリモリ作ってしまったので、もっとスマートにやれそうだという箇所があればぜひ教えてください!

ではでは~

参考

Styled-componentsでEmmetが効かない

$
0
0

めちゃくちゃ単純なことにハマったのでメモ。

症状

const Name = styled.div `
  display: block;
`

を書きたいとして、Emmetの補完が効かない。具体的には、

const Name = styled.div `
  db
`

Tabを押すと

const Name = styled.div `
  <db>
`

になってしまう。

解決策

settings.jsonに

"emmet.includeLanguages": {
  "typescriptreact": "css",
  "javascriptreact": "css"
}

を追記すれば解決。

画面幅に合わせて可変する正方形を作りたい

$
0
0

はじめに

レスポンシブ対応のウェブページを作っているときに、画面幅に合わせて可変する正方形が必要になったので、調べて実装しました。
今後、使い回しが効きそうだったので備忘録として残しておきます。

固定サイズの正方形を作る

<divclass="square"></div><style>.square{width:100px;height:100px;background-color:red;}</style>

こうですね。
わかりやすく赤色の正方形です。

横方向を画面幅に合わせて可変させる

<divclass="square"></div><style>.square{width:50; <=変更しましたheight:100px;background-color:red;}</style>

この状態で、画面幅をいじると、四角形の横幅が変化します。

正方形にする

<divclass="square"><divclass="inner"></div></div><style>.square{width:50%;height:100px;background-color:red;}.inner{width:0px;height:0px;}

四角形の中に、高さ・幅とも0のdivを入れました。
この中に入れたdivにpadding-bottomを設定します。

.inner{width:0px;height:0px;padding-bottom:100%;<=追加}

marginやpaddingを%で指定する場合、親要素の幅から計算されます。
topやbottomでも親要素の幅が基準になります。
なので赤い四角形の幅が500pxだった場合、padding-bottom 100%も500pxになるわけです。

最後に赤い四角形の高さ指定を外してあげれば、完成です。

完成形

<divclass="square"><divclass="inner"></div></div><style>.square{width:50%;background-color:red;}.inner{width:0px;height:0px;padding-bottom:100%;}

画面幅に合わせて可変する正方形の完成です。

HTML・CSS

$
0
0

HTML・CSSのまとめ

HTMLとCSSと勉強していて、基本的な事と分かり難かったところ、注意すべき点をまとめました。
(間違いがあった場合は、ご指摘いただけると幸いです。)

HTML

タグ

開始タグ<h1>と終了タグ</h1>に挟まれている『こんにちは』これがコンテンツ。実際の画面に表示されるもの。

h1.png

属性・属性値

タグに追加的な情報を付け加えてくれるのが属性
属性には値を設定しなければならない。それが属性値
上記の例でいうとlinkの属性がrel
=”stylesheet”のstylesheetが属性値
属性値は必ず””で囲む

zokusei.png

要素の構造

個人的に一番面白かったのがこの要素の構造
親要素、子要素、祖先要素、子孫要素
開始タグと終了タグが同じ位置にくるので、必ずキレイなカーブになります。
綺麗に並べると間違いも見つけやすい。

irekokouzou.png

全てのHTMLに共通するタグ

qiita-html.png

<!DOCTYPE html>

DOCTYPE宣言と言います。
このHTMLは『HTML5』の使用に準拠して書かれていることを示しています。

<html></html>

ルート要素と呼ばれDOCTYPE宣言を除く他の全てのHTMLタグの親要素。子要素として必ずheadタグとbodyタグの2つがこの順番で含まれます。

<head></head>

headタグはメタデータと呼ばれるHTMLのドキュメント自身の情報を記述します。

主に3つの大切な役割。

1.<meta charset>文字コード方式の宣言で必ず<head>のすぐ後ろに記述します。新規のHTML文字コード設定をUFT-8に設定。

2.<title></title>HTML自身の『タイトル』を意味します。
<meta>タグのすぐ後ろに記述します。

3.<link rel="stylesheet" href="●●●●.css">
これはCSSと結び付けるもので必ず必要。

:hand_splayed:<meta>タグの補足
metaタグには覚えておかないといけない重要なタグがあと2つあります。

:star:<meta name="viewport" content="width=device-width,intial-scale-1">
<meta name="viewport">タグは
レスポンシブデザインのページならどんな場合でもこの記述。

:star:<meta name="description" content="●●●●●●●●●●">
<meta name="description">タグの
content属性に概要のテキスト(70文字程度)を含めます。
SEOでとても重要。

<body></body>

そのページの内容(コンテンツ)を表す要素です。
画面に表示したいコンテンツ全て<body>要素内に配置します。

body要素でよく使われるタグ

<header></header>ヘッダーの部分をまとめるタグ
<main></main>ページの中心となる内容をまとめるタグ
<footer></footer>フッターの部分をまとめるタグ
<h1>~<h6>見出しのタグ
<nav></nav>そのページの主要なナビゲーション    
<div>要素をまとめてグループ化する
<ol>番号付きリスト
<ul>番号なしリスト
<il>ol,ulの子要素
<table>
<a>リンクの出発点と到達点を指定する
<p>段落
<img src>画像
etc...

:star2:SEOについて

『検索エンジン最適化』のことで検索エンジンからの成果を最大化することです。
検索エンジンとは日本においてはGoogleのこと。

:star2:SEO対策はキーワード順位を上げる意味でもとても重要。
現在はmetタグのdescription属性や、h1,h2タグ。

:star2:HPを作る際

いかに多くの人の目に触れるか。という事がとても重要。
そのためにSEO対策だけではなく、レイアウトや内容、出来上がってからのマメな更新がとても大切だと思いました。

CSS

・CSSは、HTMLを装飾して見やすくスタイリングするもので、セレクタ、プロパティ、値で表記されます。
・たくさんの種類のプロパティがあります。
・今回は大まかな説明とfloatを使った配置について記述していこうと思います。

セレクタ { プロパティ : 値 ; }
セレクタ.png

リセットCSS

ブラウザによって決められた設定があるため、そのままCSSの入力をするデザインが崩れてしまうことがあります。
そのために一度デフォルトに戻す作業が必要。
決められた記述ではなく、その都度自分でカスタマイズすることができます。

ブロック要素のデフォルトの大きさ

横幅(width)親要素の横幅と同じ
高さ(height)子要素の高さの合計

qiita.css
body,html{height:100%;background-color:white;}h1,h2,h3,h4,h5,h6,p,body{font-size:18px;color:#4a4a4a;font-family:sans-serif;margin:0;padding:0;}

左上に重力があるHTMLの特徴を理解する

HTMLとは左上に重力がある箱のような物でCSSで配置を設定する。

floatでの回り込みとその解除。

左右にボックスを配置し、その下にもう一つのボックスを配置したい時。

floatで左右に配置する(HTML)

qiita.html
<divclass="left-content"></div><divclass="right-content"></div>

(CSS)

qiita.css
.left-content{width:700px;float:left;}.right-content{width:260px;float:right;}

floatの解除をして下にもう一つのボックスを配置(HTML)

qiita.html
<divclass="bottom-content"></div>

CSS clear:both; の設定をする。

qiita.css
.bottom-content{background-color:green;clear:both;

:sunny:CSSでclear:both;の設定をすると、入力したセレクタからfloatが解除されます。


[未経験] ProgateのHTML&CSSレッスン受けたからポートフォリオサイト作ってみた。

$
0
0

自己紹介

  • 文理系(?)の4年制大卒

  • 新卒未経験でSES+受託開発の中小企業に入社

  • 入社後、3ヶ月間の社内研修を受講(C,Java,HTML,CSS,PostgreSQL,Linux..)

  • 現在は大手保険会社のWindowsアプリ開発プロジェクト(C#.Net,SQLite使用)に参画中

  • Web系に転職を検討中。。

Progateについて

  • Progateとは・・・

     HTML、CSS、Java、Ruby、SQL etc..様々なプログラミング言語をWebまたはスマホで学習できるオンラインプログラミング学習サービスです。
     ➡︎ https://prog-8.com/


  • 今回は『HTML&CSS』の全7レッスンを受講した後、簡単に自作のポートフォリオサイトを作ってみました!

ポートフォリオサイトについて

FireShot Capture 002 - Sakutomo Studio. - sakutomo07.github.io.png

  • シンプルなデザインで、内容も軽めのTopページのみ作成しました! (Simpler is usually better...笑)

  • HTML&CSSのみの実装ですので、コンタクトフォームやリンク、ボタンなどありますが、見た目だけになっています。

  • ProgateのHTML&CSSのレッスン受講〜制作完了までにかかった時間は約50時間くらいです(ちょっと時間かかりすぎたかもです笑)

  • 制作〜公開までに参考にさせていただいた文献、使用したソフトや開発環境は後述

  • 制作したWebページはGitHubPageにて公開いたしました!

 ➡︎  https://sakutomo07.github.io/sakutomo_portfolio_ver1.0./

開発環境・使用ソフト・参考サイト

  • 開発環境

     MacBookAir(macOS Catalina 10.15.2)

  • 使用ソフト

    Visual Studio Code ➡︎ コーディングに使用

    GitHub Desktop ➡︎ ソースファイル、画像ファイルをGitHubにプッシュ(Upload)するために使用

    Numbers ➡︎ 主にWebページのイメージを設計するために使用
     

  • 参考サイト

    ① HTML&CSS学習
     Progate
     MDN web docs
     qiAz web tech blog


    ② 画像データ取得
     Font Awesome
     SVG PORN
     pixaboy
     Online Logo Maker


    ③ GitHubについて
     ferret
     

制作開始〜完成までにやったこと

 1. 目標設定・計画

・目的の明確化 ➡︎ ProgateのHTML&CSSのレッスンの復習&実践  
 
・目標の設定 ➡︎ ポートフォリオサイトのTOPページ1枚の作成  
 
・設計 ➡︎ 他の方のポートフォリオサイトを参考にどんなデザインにするのか、サイトに入れる内容などを考える。  
 
 2. コーディング

・設計を基にProgateを復習しながらコーディングを進めていきました。  
 
・わからない&Progateで学習した範囲外のことはググって調べながら進めていきました。  
 
 3. Webページの公開

・ローカルリポジトリ&GitHubにリモートリポジトリを作成後、ソースファイル・画像ファイルなどをPush(Upload)してGitHubページに公開しました。

所感

 
・良かった点

 
1. コーディングに入る前に目標設定や簡単な設計によって完成のイメージが固まっていたことで、
 割とスムーズに完成までコーディングすることができました。

 
2. コーディングで詰まった時など、どうすれば上手くいくか考えたり自分で試してみたりする時間が
 長くなりすぎないように意識し、わからないことはどんどんググっていち早く解決に辿り着けるようにできました。

 
3. Progateで学んだこと以外に、自分で調べて発見した新しい技術・知識
 (例:CSSだけでWebページをフェードインで表示させる)を取り入れたりして、楽しみながら制作することができました。

 
・反省点

 
1. 目標設定した際に、期限(納期)を定めていなかったことで、少しズルズルと制作をしていました。

 ➡︎ 今後は制作期間・時間の目標設定を実施
 
2. まだまだHTML&CSSについての知識、コーディング経験の不足しているため、
  ソースコードが雑であることが否めない・・

 ➡︎ 基礎がまだまだ身についていないので、MDN Web Docsなどを読んで知識をinputしつつ、継続的にコーディングしていきます。

今後の目標

 ・HTML&CSSだけでなく、JavaScriptやBootstrapなどを学んで、動的機能を持つWebサイトを作成する

 ・Ruby,railsを学んでSNSサービス(twitter,instagram)などのコピーサイトを作成する

最後に

最後までご覧いただきありがとうございます。

宜しければ、こちらの記事やソースについて、ご指摘・アドバイス・感想など頂けると幸いです。

まだまだ未経験新卒新人のヒヨコですので、お手柔らかに、、笑

今後ともよろしくお願いいたします!!

JQueryを使わずjsとcssを使って背景画像のスライドショー 作成

$
0
0

JSの勉強を兼ねて、JQueryを使わずにJSとCSSで背景画像のスライドショーを作成しました。
※まだまだ勉強中なのでミス等あればコメントで教えていただければありがたいです。

結果

まずは結果を表示します。こんな感じに仕上がりました。

See the Pen slideshow by RS (@shimamar) on CodePen.

コード

コードを記載します。処理に直接関係ないところは省略しております。

test.html
<divid="slideshow"><h1>Hello!</h1></div>
test.css
div{height:300px;width:500px;transition:background-image2.5Sease;/*背景画像をゆっくり変化させる*/background-image:url("最初に表示する画像パス");}h1{font-size:30px;color:white;text-align:center;line-height:300px;}
test.js
//スライドショー で表示させる画像パスを変数に格納varsetImage=["画像01パス","画像02パス","画像03パス"];//カウンターの初期値設定varcounter=0;//設定した画像パスをid="slideshow"のbackground-imageに設定する、繰り返すfunctionslideimage(){//カウンターが設定画像数より大きいか確認if(counter>=(setImage.length-1)){//カウンターを初期値に戻すcounter=0;}//背景画像を設定document.getElementById("slideshow").style.backgroundImage="url("+setImage[counter]+")";//カウントアップcounter++;}//3秒ごとに背景画像を切り替えるsetInterval("slideimage()",3000);

ポイント

cssの transitionプロパティの設定時間を
JSの setIntervalの設定時間より短くしたこと

同じにしてしまうとタイミングが重なってしまうせいなのか、
transitionプロパティがうまく効かずにはっきりと切り替わりが起こってしまいます。

//JS
setInterval("slideimage()",3000); //3秒

//css
transition: background-image 2.5S ease; //2.5秒

まとめ

ネットで検索するとスライドショー の作成方法はたくさん出てくるのですが主にJQueryで作成されている方が多く、自分の基礎勉強のためにもJSで実装してみました。

ただ、ゆっくり表示させるところがなかなかうまくいかず苦戦しました。
そして background-imageプロパティでは無く <img>タグで画像指定した方が良かったのでは。。と振り返って思ったりもします。

まだまだ納得のいかない・わからないところもあるので、勉強を重ねてバージョンアップできればと思います。

CSS 重ねかた

$
0
0

以下、箇条書き。
・padding-topで上に延びる。(left, right, bottomも同じ)
・margin-leftで左に余白が延びる。(topとかも同じ)(余白なので延びた左側白くなる)
・position: ¥;
 ¥の中身はabsolute(絶対座標), fixed(画面からの位置),relative(相対座標)
簡単に説明。(top: 0;などを下に記述)
absoluteは左上を(0, 0)を基準とした時の位置。
fixedは左上を(0, 0)を基準とした時の位置だが画面に固定される。ずっと見えてて欲しい広告やHeaderなど便利なものを固定することが多い。
relativeは、ホラ、HTMLって積み木のように重なっていくじゃん?そうなった時の表示される場所って(0, 0)じゃない事が多い事が多い。横にずらしたいだけって時などには便利かも。
・z-index: ¥;
 ¥には数字(大抵1,2くらい)が入る。数字が大きいほど前に出る。表示だけじゃなく、作業中この要素隠れてるけどどんなふうに配置されてんのかなーって思う時にも便利。とてつもなくでかい値を入れると確かめられる。
・width calc(100% - 300px)など
 calcで計算できる。%とかpxとかvhとか入れても単位も勝手に揃えてくれる。
・height: 100vh;
100%と間違えるとハマる。ハマるな危険。

JavaScript と DOM 応用編

$
0
0

DOMとJavaScriptについて、ちょっと理解できてきたので、より踏み込んだところをまとめて行きます。本記事はUdemyの講座を参考にしたメモです。

UdemyのAngelaさんの講座(英語だけどめっちゃわかりやすいです!) → リンク

addEventListenerでクリックしたときに関数を適用する

例えばユーザーがボタンをクリックした時に特定の処理を実行する際などに使用します。

qiita.js
//buttonがclickされたらclicked()関数を適用するdocument.querySelector("button").addEventListner("click",clicked);

※addEventListener()の中に入れる関数は()をつけない。clicked()ではなく、そのままclickedと記載する。

今回はclickされた時に関数を実行する処理でしたが、"click"以外にも"keydown"や"load"など、様々なTypeを指定することができます。
(Type一覧はこちら→ リンク

ちなみに上記では、clicked関数をあらかじめ作成して適用したわけですが、assEventListner内で関数を作成して適用することも可能です。英語ではAnonymus Functionというみたい。

qiita.js
document.querySelector("button").addEventListner("click",function(){alert("this button was clicked");});

関数名がなく function (){処理内容} が直接addEventListenerの中に追加されています。

addEventListenerでキーボードで入力したときに関数を適用する

qiita.js
// addEventSelector で keyboard が押されたときの処理をかく// keydownの詳細がevent として、anonymus functionに渡される。document.addEventListener("keydown",function(event){varkeyPressed=event["key"];alert("Pressed key is "+keyPressed+".");});// function関数のeventとは何なのかをみてみる(今回はkeydownの詳細)// consoleを開いて、keyboardを押してみるとみれる(関数内に入れる)console.log(event);// eventには、様々な要素が入っている。その中の "key"という要素を抜き出す。(関数内に入れる)event["key"];// これで"a"とか"k"とか何のキーが押されたのかがわかります。

※クリックの際は、querySlectorでクラス名を指定したけど、Keyboardの際はクラスとかないので、documentの後に直接 addEventListenerをかく。

※eventにはめっちゃ大量の要素が含まれていることがわかる。詳しくは、こちら
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

関数を使用して関数を作る

あんまりDOMと直結する内容ではないのですが、関数を使用して関数を使用する講義がUdemyであったのでメモします。

qiita.js
//足し算の関数functionadd(num1,num2){returnnum1+num2;}//掛け算の関数functionmultiply(num1,num2){returnnum1*num2;}//関数指定によって、適切な関数を適用するfunctioncalculator(num1,num2,operator){returnoperator(num1,num2);}

関数わからなくなったら、Chrome→表示→開発・管理→JavaScriptコンソールで 関数を読み込ませてから debugger; と打ち込んで関数を入れるとその関数がどこで間違っているのかが分かりやすくなります。

qiita.js
//consoleでやるとdebuggerモードになります。debugger;calculator(3,4,add);

JavaScriptで音声を再生する

それでは、ボタンを押した時に音声を再生させるにはどうすれば良いのでしょう。

qiita.js
//音声を変数に格納するvaraudio=newAudio("sound.mp3");//play関数でaudioを再生するaudio.play();//buttonをclickすると、functionが適用されるdocument.querySelector("button").addEventListner("click",function(){audio.play();});

this を使用してコードを省略する

例えば、下記のようにfor文とかを使用すると、毎回指定される要素が違いますよね。

qiita.js
for(vari=0;i<numberOfButtons;i++){document.querySelectorAll("button")[i].addEventListener("click",function(){this.style.color="white";//ちなみに、ここに console.log(this.innerHTML); とかって書くとthisが実際なんなのかわかるよ});}

例えば、i=0の時は document.querySelectorAll("button")[0]になります。
i=1の時は document.querySelectorAll("button")[1]になります。

ループするごとに違う要素が指定されるのです。

そんな時に、thisを使用すると、"現在指定されている要素"の代わりになるみたいです。ほかにも色々使用方法があるみたいですけど、今回に限るとthis は
document.querySelectorAll("button")[i] の部分を指定しています。(ぶっちゃけあんまり良くわかってない笑)

オブジェクトの作成

オブジェクトは、複数のプロパティを格納したものです。例えば、生徒が5人いてみんな同じ3教科のテストを受けました。その時のそれぞれの点数を格納するときとかに使用します。

つまり、同じプロパティを持つ複数の変数を作るときに便利な機能でしょうか。

Example

生徒名 (国籍)英語数学国語
BOB (USA)988035
JOHN (AUS)709085
SARAH (FRA)5050100

こんな表があった時に、それぞれこんな感じにオブジェクトを使用してデータを格納することができるのです。

qiita.js
//BOBのデータvarstudent1={Name="Bob",English:98,Math:80,Japanese:35,Nationality:"USA"}//JOHNのデータvarstudent2={Name="John",English:70,Math:90,Japanese:85,Nationality:"AUS"}//SARAHのデータvarstudent3={Name="Sarah",English:50,Math:50,Japanese:100,Nationality:"FRA"}

こんな風に1つの変数に複数のデータを格納することができるんですね。便利!

ちなみにその呼び出し方はこんな感じ。

qiita.js
//BOBのデータ全てを呼び出す。student1;//BOBのEnglish部分を抜き出すconsole.log(student1.English);

今回はBOBとJOHNとSARAHの3人だったから良いけど、これが10人、100人ってなったら流石に一回一回English, Math, Japanese, Nationalityって書いていくのめんどくさいですよね。

そこで登場するのが、Constructor Function (コンストラクタ関数)です。要は、上記の変数を作るための関数ですね。(特徴は関数の名前の最初が大文字であることです。)

qiita.js
//Constructor Function の作成functionTestScore(name,english,math,japanese,nationality){this.name=name;this.english=english;this.math=math;this.japanese=japanese;this.nationality=nationality;}// new student4 を作成するときvarstudent4=newTestScore("Amy",72,39,80,"CAN");// newを忘れないように注意。。

コンストラクタ関数に関数を入れる

ちなみに、このデータには
this.func = function(){alert("calling function");};
とかで関数を入れたりもできる。

qiita.js
//Constructor Function の中のデータに関数を入れるfunctionTestScore(name,english){this.name=name;this.english=english;this.func=function(){alert("calling function");};}//student4 で関数を呼び出すときは、、student.func;

Switch 文。 Nintendoooooo じゃないSwitch。

Switch文は、基本的に普通のIF ELSE文と似ているものです。

IF ELSEは条件によって、処理が変わるけど、SWITCHはどちらかというとデータによって、処理が変わるイメージを持ちました。

qiita.js
// あらかじめ 変数nameは定義しておく必要はあり。 nameのデータによって処理かえる。switch(name){//nameがドラえもんだったら、、case"ドラえもん":console.log("僕ドラえもん〜!");break;//nameがピカチュウだったら、、case"ピカチュウ":console.log("ピッ ピカチュウ!");break;//nameがカオナシだったら、、case"カオナシ":console.log("あ、あ、う、あ、う。");break;//nameがそれ以外だったら、、default:console.log("あなたのことを知りません。");break;}

JavaScriptでなんちゃってAnimationを適用する

使うのは setTimeout() 関数です。
必要な引数は
setTimeout(function, ミリ秒数)

今回はボタンが押されたら透明度を50%にします。
手順としては、CSSで透明度50%になるクラスをつけて、ボタンがクリックされれば、そのクラスを追加して、1秒後にクラスを外してもとの透明度に戻すという処理です。

style.css
.animation{opacity:0.5;}
qiita.js
functionapplyAnimation(){// button というクラスを持つ要素に animation というクラスを追加するdocument.querySelector(".button").classList.add("animation");// 1秒後に animation クラスを外すsetTimeout(function(){document.querySelector(".button").classList.remove("animation")},1000)}

これでなんちゃってアニメーションの完成です。

以上で JavaScript と DOM 応用編完結です。

リセットCSS、ノーマライズCSS、サニタイズCSSの違い

$
0
0

はじめに、デフォルトCSSについて

HTMLのタグには、デフォルトCSSが設定されています。
例えば<h1>タグはfont-sizeを設定したわけでもないのに大きくボールドで表示されます。
<p>タグも同様にmargin系のプロパティを設定していないのに下に空きができます。
CSSでスタイルを設定しようとすると、思ったとおりの見栄えが実現できないことがよくありますが、理由の1つがこのデフォルトCSSです。
デフォルトCSSの挙動は把握する必要はありますが、一方でデフォルトCSSはブラウザごとに微妙に設定が違います。
これをある程度揃える目的でリセットCSS、ノーマライズCSS、サニタイズCSSが存在します。

デフォルトCSSを揃えるCSS

リセットCSS

デフォルトCSSをほぼ全て初期化するCSS。例えば以下です。

  • <h1>〜<h6>は全て同じフォントサイズになる。
  • <p>のマージンがなくなる。
  • <li>のビュレット※1が表示されなくなる。

マージンとパディングは全て0になります。
まっさら過ぎるため、自分で独自のスタイルを定義していく必要も生じます。
結果、CSS自体の記述量は増えてしまうでしょう。
まっさらな状態から全てのCSSを設定したい場合に向いています。

HTML5 Doctor Reset CSSが有名です。
以下で記載されているコードをコピペしてreset.cssという名前で保存することで取得できます。
HTML5 Reset Stylesheet | HTML5 Doctor

保存したら、linkタグで読み込みましょう。

html
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css">

ノーマライズCSS

デフォルトCSSで適用されるスタイルは可能な限り残しつつ、ブラウザ間での表示の差異をなくすように調整するCSS。

以下からダウンロードできます。
Normalize.css: Make browsers render all elements more consistently.

保存したら、linkタグで読み込みましょう。

html
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/style.css">

サニタイズCSS

ノーマライズCSSをさらに気を利かせた感じのCSS。
ある意味、タグのCSSフレームワークです。
例えば以下の設定が追加されます。

  • <nav><ul>に含まれる<li>(ページナビゲーションによく使われるタグ構造)にはビュレットを表示しない
  • 全ての要素に「box-sizing: border-box」※2が適用されている。(レスポンシブWebデザインに便利)

以下からダウンロードできます。
sanitize.css

保存したら、linkタグで読み込みましょう。

html
<link rel="stylesheet" href="css/sanitize.css">
<link rel="stylesheet" href="css/style.css">

使用上の注意

リセットCSS、ノーマライズCSS、サニタイズCSSは必ず一番最初に設定します。
つまりリセットCSSについての<link>タグは一番上に置きます。
(上記の読み込み例は全て自分で設定したstyle.cssを後に読み込ませています。)

html
<link rel="stylesheet" href="css/sanitize.css">
<link rel="stylesheet" href="css/style.css">

後で設定すると、タグが上手くリセットされません。

※1: ビュレットは<li>タグの前にある「・」のこと。
※2: 「border-box」はパディングとボーダーを幅と高さに含める設定。
パディングとボーダーを幅と高さに含めない設定は「content-box」で、本来はこちらが初期値。

Viewing all 8773 articles
Browse latest View live