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

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

$
0
0

100日チャレンジの202日目

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

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

202日目は


Spring 案件ソルーション 3

$
0
0

Spring画面系をどう乗り切るか(技術面)その3

CSS/Jqueryを試してみる。

趣旨

とんがった案件でなくてもSpring画面系で必要な技術 HTML CSS jQuery Bootstrap
が出てくるのが当たり前になっている状況がある。今回は公開しているページを改良しながら
電卓を作ってみることによりCSS/Jqueryの練習をしてみようと思う。

参考にしたページ

https://codeforfun.jp/jquery-how-to-create-a-simple-calculator/

修正内容

・ 4則計算記号を変更した。
→ それに伴って正規表現を使用した。
・ gridを使用するようにした。

モジュール一覧

・calc.html
・calc.css

学習用アプリの画像貼り付け

スクリーンショット 2020-01-03 18.28.29.png

プログラム部分

<script>
$(function(){
    $('.button').click(function(){
        var pushed = $(this).text();
        var inputLabel = $('#boxinputLabel');

        var h1Text = inputLabel.text();
        h1Text = h1Text.replace("×", "*");
        h1Text = h1Text.replace("÷", "/");
        if (pushed == '=') {
            // 計算
            inputLabel.text(eval(h1Text));
        } else if (pushed == 'AC') {
            // 全てクリア
            inputLabel.text('0');
        } else {
           alert(inputLabel.text())
            console.log(inputLabel.text());
            if (inputLabel.text() == '0') {
                inputLabel.text(pushed);
            } else {
                inputLabel.text(inputLabel.text() + pushed);
            }
        }
    });
});
<style>
* {
    font-family: 'Inconsolata', monospace;
    color: #555;
 }
body
{
      background-color: white;
}
body > * {
    margin: 3px;
    padding: 10px;
}
.container {
margin: auto;
padding:auto;
display: grid;
grid-template-columns: 40px 40px 40px 40px;
grid-template-rows: 80px 40px 40px 40px 40px 40px;
width: 220px;
background-color: #E0DEDA;
grid-gap: 20px;
}
.container > * {
align : center;
}
#boxinputLabel{
grid-column: 1 / span 4;
grid-row-start: 1;
grid-row-end: 2;
background-color: #DFE9E9;
padding-left: 1rem;
padding-right: 1rem;
}

#boxAC {
grid-column: 1 / span 3;
grid-row-start: 2;
grid-row-end: 2;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#box÷ {
width:10%;
grid-column: 4/ span 1;
grid-row:2;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#box7 {
width:10%;
grid-column: 1/ 4;
grid-row:3;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;

}
#box8 {
width:10%;
grid-column: 2/ 4;
grid-row:3;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#box9 {
width:10%;
grid-column: 3/ 4;
grid-row:3;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#box× {
width:10%;
grid-column: 4/ 4;
grid-row:3;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#box4{
width:10%;
grid-column: 1/ 4;
grid-row:4;
background-color: white;
grid-gap: 10px;
padding-left: 1rem;
padding-right: 1rem;
}
#box5{
width:10%;
grid-column: 2/ 4;
grid-row:4;
background-color: white;
grid-gap: 10px;
padding-left: 1rem;
padding-right: 1rem;
}
#box6{
width:10%;
grid-column: 3/ 4;
grid-row:4;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#boxMinus{
width:10%;
grid-column: 4/ 4;
grid-row:4;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#box1{
width:10%;
grid-column: 1/ 4;
grid-row:5;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}
#box2{
width:10%;
grid-column: 2/ 4;
grid-row:5;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#box3{
width:10%;
grid-column: 3/ 4;
grid-row:5;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#boxPlus{
width:10%;
grid-column: 4 / 4;
grid-row:5;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#box0{
grid-column:1 / span 2;
grid-row:6;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#boxTen{
width:10%;
grid-column: 3/ 4;
grid-row:6;
background-color: white;
padding-left: 1rem;
padding-right: 1rem;
}

#boxEqual{
width:10%;
grid-column: 4/ 4;
grid-row:6;
background-color: white;
grid-gap: 10px;
padding-left: 1rem;
padding-right: 1rem;
}

IBMCloud上に乗せたもの。

Flaskアプリ上に先ほどのアプリを乗せている。
試せる。

https://flask-sample-jquery.mybluemix.net/
参考 URL
https://www.ibm.com/cloud/blog/simple-hello-world-python-app-using-flask

今後

気になっているところ
→ Form+Jquery

R qgraphでspring-embeddedレイアウトのグラフを描く

$
0
0

Rqgraphを使って、下図のようなspring-embeddedレイアウトのネットワーク図を書く方法の備忘録です。
qgraph-spearman_sample_w400.png
題材は、自分がこれまでコーディングしたCSSファイルをanalyze-cssで解析したメトリクスデータを集めたもの。メトリクスの相関の強さをqgraphで表してみました。

動作環境および必要なソフトウェア
バージョンは本記事執筆時点で使用しているもの

第1章 分析用のデータを集める

analyze-cssは、CSSファイルを解析してルール記述やセレクタの個数などの情報を出力してくれるコマンドラインツールです。ver.0.12.7現在、37種類のメトリクスがサポートされています。

analyze-cssの使い方

npmでインストールします。

$ npm install--global analyze-css

計測したいCSSファイルのパス名を引数に指定してanalyze-cssを実行すると、解析結果がJSON形式で標準出力に書き出されるので、リダイレクトして適当なファイルに保存します。引数--prettyを指定すると、項目ごとに改行とインデントが付いて読みやすい形式になります。

$ analyze-css --pretty--file examples/style.css > style.json

JSONをCSV形式に変換

Rで処理しやすくするため、ファイルのフォーマットをJSON形式からCSV形式に変換します。pythonを使うと簡単です。抽出する項目はキー"metrics"が保持するデータだけです。

css-metrics.py
importjsonimportsysargs=sys.argviflen(args)<2:sys.exit('usage: python %s json_file'%args[0])withopen(args[1],'r')asf:jsn=json.load(f)forkeyinjsn['metrics']:print(key+','+str(jsn['metrics'][key]))

jsonファイルを1つのフォルダに集め、一括してCSV形式に変換します。

$ ls json/
project1.json   project2.json   project3.json

以下のシェルスクリプトを実行すると、同じフォルダに拡張子.csvのファイルが出来ます。

mkcsv.sh
#!/bin/bashfor i in$(find json -name'*.json'-print)do
  echo$ioutf=${i%.*}.csv
  echo"metrics,value">$outf
  python css-metrics.py $i | sort>>$outfdone
$ ls-p
css-metrics.py  json/       mkcsv.sh
$ ./mkcsv.sh 
$ ls json
project1.csv    project2.csv    project3.csv
project1.json   project2.json   project3.json

バラバラのCSVファイルを1個のCSVファイルに統合します。その際、1行目に列見出し、2行目以降にデータ行が追加されるようにしたいので、Pythonを使って元のデータ(metrics,valueの2列構成)の行と列を転置して出力します。また、1列目には、ファイル名から抽出したプロジェクト名を挿入し、見出しをprojectに書き換えます。

csv-transpose.py
importcsvimportsysimportoshdr=Falseargs=sys.argvusage='usage: python %s csv_file [ H ]'%args[0]iflen(args)<2:sys.exit(usage)iflen(args)>2:ifargs[2]=='H':hdr=Trueelse:sys.exit(usage)basename=os.path.basename(args[1])tpl=os.path.splitext(basename)projname=tpl[0]key_list=[]val_list=[]withopen(args[1],'r')asf:reader=csv.reader(f)header=next(reader)key_list.append('project')val_list.append(projname);forrowinreader:key_list.append(row[0])val_list.append(row[1])ifhdr==True:print(','.join(key_list))print(','.join(val_list))

以下のシェルスクリプトを走らせてフォルダ内のCSVファイルを一括して変換し、結果の標準出力をファイルに保存します。

merge-list.sh
#!/bin/bashhdr=H
for i in$(find json -name'*.csv'-print)do
  python csv-transpose.py $i$hdrhdr=done
$ ls-p
css-metrics.py      json/           mkcsv.sh
csv-transpose.py    merge-list.sh
$ ./merge-list.sh > css-metrics-data.csv

保存したCSVファイルを表計算アプリで開いて、正しく変換できたか確認します。これでRに読み込ませるデータが準備できました!
csv-convert_w1000.png

第2章 Rにデータを読み込んでqgraphでグラフを描く

以下、[R]で始まる見出しは「RのTips」、[qgraph]で始まる見出しは「qgraphのTips」のつもりで書いてあります。Tipsとして読めるよう、分析の詳細については(退屈ですし)端折ってます。

[R] データフレームの作成: CSVファイルの読み込み

Rを起動し、Rコンソールから以下のコマンドを入力して、前節で作ったCSVファイルをデータフレームに読み込ませます。

df<-read.table("css-metrics-data.csv",header=T,sep=",")

[R] データフレームから列を削除(その1)

データの相関関係の分析にはスピアマンの順位相関係数を使います。dfには、相関係数の算出に向かない列も含まれているため、事前に取り除いておきます。たとえば以下のような列は不要なので削除します。

  1. 1列目の見出し(プロジェクト名)
  2. 値が全部ゼロ
  3. 値が全部同じ(ゼロ以外)
  4. 値が0と1しかない(値のばらつきがほとんどない)

項目1〜3については以下のコマンドで対応します。df[,-1]は1列目を除く列、colSums(df) != 0は列の和が0でない(オール0でない※)列のみTRUE、apply(df, 2, var) != 0は分散が0でない(値が均一でない)列のみTRUEになることを利用して、dfの該当列のみ抽出しています。
※測定値が0以上であることが前提

df<-df[,-1]df<-df[colSums(df)!=0]df<-df[apply(df,2,var)!=0]

項目4については、以下のコードのように関数is.bin()を定義し、引数に与えたベクトルxの要素の集合(重複なし)が{0, 1}に等しいかどうかを判定します。データフレーム dfからis.bin()がTRUEになる列を除外して、dfを置き換えます。

is.bin<-function(x){return(setequal(unique(x),c(0,1)))}df<-df[!apply(df,2,is.bin)]

[R] スピアマンの順位相関係数の算出

相関係数の算出には関数cor()を使います。dfのすべての列の組み合わせに対して、スピアマンの順位相関係数を計算した結果を変数vに保存します。

v<-cor(df,method="spearman")

[qgraph] springレイアウトのグラフ作成

ここまでの状態で一旦グラフを描いてみましょう。まずqgraphパッケージをインストールします。依存するパッケージが芋づる式に多数インストールされるため少々時間がかかります。

install.packages("qgraph")

qgraphパッケージをロードしてみて、正しくインストールできたことを確認します。

>library(qgraph)RegisteredS3methodsoverwrittenby'huge':methodfromplot.simBDgraphprint.simBDgraph

qgraphパッケージをロードした後、関数qgraph()に順位相関係数のベクトルvを渡して、springレイアウトでグラフを描かせます(下図)。

qgraph(v,minimum=0.7,layout="spring")

qgraph-spearman_01_w1000.png
グラフの各ノードが、変数vの各要素つまりメトリクスを表します。ノードのラベルはメトリクス名を3文字に省略した文字列です。
例:sBC = selectorsByClass
ラベル名と元のメトリクス名をグラフの凡例に表示する方法は後述します。

ノードどうしを結ぶ辺は相関の強さを表します。線が太く・色が濃いほど相関が強いことを示しています。qgraph()は、デフォルトでは全ノードのすべての組み合わせに対する相関関係の辺を描画しますが、変数が多くビジーすぎるので、qgraph()に引数minimum=0.7を指定することにより、相関係数が0.7以上の辺のみをグラフに表示させました。

[R] データフレームから列を範囲で抽出

sBT (selectorsByTag) とsTT (specificityTagTotal) など、CSSセレクタの詳細度に関するメトリクスを表すノードと、セレクタの個数を表すノードはどちらも同じ要素を計数しているため、両者の増減が連動し相関が強く出るのは当然なので、両方をグラフに入れると冗長だと判りました。そこで、データフレームから詳細度に関するメトリクスspecificity* の列を削除します。

データフレームの列名を確認するには関数colnames()を使います。

>colnames(df)[1]"colors""comments""commentsLength".....[19]"selectorsById""selectorsByPseudo""selectorsByTag"[22]"specificityClassAvg""specificityClassTotal""specificityIdAvg"[25]"specificityIdTotal""specificityTagAvg""specificityTagTotal"

specificity* の列はインデックス22以降に集まってますので、列1〜21までを抽出してdfを書き換えます。

df<-df[1:21]

[R] データフレームから列を削除(その2)

このほか、ノードimp (imports) と emR (emptyRules) から出ている辺も、元のデータの偏りから生じたノイズだと判ったため(CSSの作りからして本来無関係)、これらもデータフレームから削除することにします。

データフレームから列を名指しで除外するには、列名の集合に対して関数setdiff()を利用します。

df<-df[setdiff(colnames(df),c("emptyRules","imports"))]

[qgraph] グラフの書式を調整

グラフに凡例を追加し、ノード間の辺に相関係数の値を表示し、文字の大きさを調整します。

v<-cor(df,method="spearman")qgraph(v,minimum=0.7,layout="spring",repulsion=0.6,legend=T,nodeNames=names(v[,1]),legend.cex=0.5,edge.labels=T,edge.label.cex=0.5,label.cex=0.8)

qgraph-spearman_04_final_w1000.png

qgraph()の引数に追加した項目は以下のとおりです。

repulsion=0.6
1より小さくすると、ノードの“島”どうしの間隔が近くなり、個々の島の占める領域が広がります。ノードが密集している部分のノード間の辺が長く表示されて、結合状態がよく見えるようになります。

legend=T, nodeNames=names(v[,1]), legend.cex=0.5
グラフの右側に凡例を表示します。nodeNamesは、ノードのラベルに対するフルネームのベクトルを指定します。この例では、関数cor()の戻り値を保存した変数vに入っている列名のリストをv[,1]により取り出しています。凡例の文字列の拡大率を0.5に設定します。

edge.labels=T, edge.label.cex=0.5
辺にラベル(相関係数の値)を表示し、ラベル文字列の拡大率を0.5に設定します。

label.cex=0.8
ノードのラベル文字列の拡大率を0.8に設定します。

[qgraph] ノードをグループ化して色分けする

グラフのノードを以下の4つのグループに分けて、それぞれノードに色をつけてみましょう。

グループ意味ノード
A#FF4081CSSの保守性に関わる指標lng, sLA
B#A1887FCSSの構成要素の計数clr, dcl, mdQ, rls, slc, sBC, sBI, sBP, sBT
C#2196F3複雑な構造の計数cmS, dpP, dpS, mcS, qlS, rCN
D#BDBDBDその他cmm, cmL

まず、qgraph()の引数に渡すデータを準備します。ノードのラベルに対応する列名をcolnames(df)から調べ、そのインデックスをノード番号としてc()を使ってグループごとのベクタを作成します。4個のグループに対するベクタを要素とするリストをlist()を使って作成し、変数groupsに保存します。

グループの配色は、RGB値#...や色名の配列で指定し、変数colorに保存します。配列の要素1がgroupsリストの要素1に対応します。

groups<-list(c(8,14),c(1,5,9,13,15,16,17,18,19),c(4,6,7,10,11,12),c(2,3))color<-c("#FF4081","#A1887F","#2196F3","#BDBDBD")

qgraph()に引数groups=groupscolor=colorを渡すとグラフのノードが塗り分けられます。以下のコードではlabel.colorでラベルの文字列の色を指定し、borders=Fでノードの境界線を非表示にしました。ただし、凡例左側の小さな円の境界線はborders=Fでは消えません。対策として、border.color="white"も指定して凡例側の円を若干見やすくしました。

qgraph(v,minimum=0.7,layout="spring",repulsion=0.6,legend=T,nodeNames=names(v[,1]),legend.cex=0.5,edge.labels=T,edge.label.cex=0.5,label.cex=0.8,groups=groups,color=color,label.color="white",borders=F,border.color="white")

qgraph-spearman_05_groups_w1000.png
これでグラフが完成しました!

#FF4081のノードと#2196F3のノードの関係を見て、私が書いていたCSSはセレクタの指定が複雑になる傾向にあることが判りました。確かに、analyze-cssの出力jsonファイルには、.foo .bar .baz pみたいにdivの階層辿るようなセレクタを使ってる箇所が多く報告されていました1。このようなセレクタは詳細度が無駄に上がってしまい、media queryの中などでCSSプロパティを上書きしたい時、セレクタを元と同じ形式かそれ以上の詳細度で指定しなければならず、メンテナンスしにくいCSSになる要因ですね。

[R] 箱ひげ図が付いた散布図の描き方

おまけとして、散布図のX軸とY軸の外側に箱ひげ図が付いた下図のようなグラフをRで描く方法です。このグラフは、CSSのlng (length) と sLA (selectorLengthAvg) のデータの分布をプロットしたものです。2本の赤い線はそれぞれlngとsLAの中央値を示します。
scatterplot_06_w450.png

箱ひげ図が付いた散布図は、carパッケージの関数scatterplot()で簡単に描けます。

install.packages("car")

以下のコードではcarパッケージをロード後、par()でグラフィックスパラメータを退避・更新してから、scatterplot()を呼び出します。さらに、関数abline()でX, Y軸に平行な直線を引き、最後にグラフィックパラメータを元に戻しています。グラフィックスパラメータを更新した理由は、箱ひげ図の外側に余白を入れたいので、par(oma=...)を呼んで作図領域の底辺と左辺にマージンを設定するためです。

library(car)oldpar<-par(no.readonly=T)oma<-c(2,2,0,0)par(oma=oma)scatterplot(df$length,df$selectorLengthAvg,smooth=F,regLine=F,grid=F,xlab="length",ylab="selectorLengthAvg",pch=16,cex=1.5,reset.par=F)abline(v=median(df$length),col="red")abline(h=median(df$selectorLengthAvg),col="red")par(oldpar)

lngとsLAが共に大きいグループ=赤い線で区切られた右上の領域=にプロットされたプロジェクトは、ページ制作当時、ハマりまくったものばかりなので、生産性の悪さ加減がグラフに現れてるなと納得しました(苦笑)


  1. コーディングを始めた頃、既存サイトに下層ページを追加する案件を担当していて、手本にした既存のCSSが#product .foo ul.bar li {...}みたいに冗長なセレクタを多数使用していたのに倣ったのがいけなかった。 

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

$
0
0

100日チャレンジの203日目

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

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

203日目は

グラデーションの上に画像と文字を表示

$
0
0

グラデーションの上に画像と文字を表示

学習した内容のアウトプットをしてこなかったので、
まずはメモ程度の内容からの投稿です。

やりたいこと

以下のような画像があるとして、矢印で示した要素で表現したい。
(SAMPLEの部分もテキストでいいのでは?というのもあるが、
本来の画像ではこのSAMPLEの部分がロゴマークだったので。。。)
sample.png

どのように書いたか

sample.html
<divclass="header-banner"><pclass="title-en">subtitle</p><pclass="title-jp">メインタイトル</p></div>
style.css
.header-banner{position:relative;max-width:800px;width:100%;height:75%;margin:auto;margin-bottom:8px;padding:50px050px0;z-index:0;background:url(logo.png),linear-gradient(45deg,#edbdc5,#872434);background-repeat:no-repeat;background-position:5%10%;background-size:contain;}.header-banner:before{content:"";display:block;}.header-bannerp{text-align:center;color:white;transform:translate(-50%,-50%);text-shadow:4px4px5px#000000;z-index:2;width:100%;}.header-bannerp.title-en{font-size:2.5vmin;position:absolute;top:25%;left:50%;margin:0;padding:0;}.header-bannerp.title-jp{font-weight:bold;font-size:6vmin;position:absolute;top:65%;left:50%;margin:0;padding:0;}

今回のポイント

グラデーションの前面に画像を配置するには工夫が必要です。

gradationAndPic.css
background:url(表示対象画像),linear-gradient(グラデーション方向,開始色,終了色);

まずはここまで。

参考

CSSのグラデーション(linear-gradient)の使い方を総まとめ!
MDN

HTML&CSS学習

$
0
0

本日が初投稿です。
学習したことをメモ書き程度に書く場にしようと考えております。
多めに見てやってくださいm(__)m

HTMLとは

静的なwebサイト作成に使用される「マークアップ言語」の一つです。タグを使いテキストを囲むことで、「見出し」や「リンク」を作成することができます。

タグの例

<開始タグ>こんにちは</終了タグ>

このように入力すると画面上に「こんにちは」と表示される。
終了タグの前には必ず「/」を入力する。

主なタグ

h1~h6→見出し
a→リンク
p→段落

CSSとは

HTMLで作成したファイルをデザインするためのファイルのこと。画面上で反映させるために、「link ren="stylesheet" href="cssファイル名"」をHTMLファイルのheadタグ内に記述している必要がある。

書き方

例;
h1{
(場所)
color : #ff0000
何を:どうする;
(色を:赤色にする)

herokuデプロイ 背景画像表示させる

$
0
0

記事投稿の理由

初めてherokuでデプロイした際に画像が表示されなくて苦しんだので
復習兼ねて記事書かせていただきます。
環境によって違う場合もある。参考程度にみてくださると幸いです。

今回のテーマと環境

rails 5.0.7.2

herokuでデプロイはできていて
画像のみが表示されないと仮定します。

変更箇所

assetファイルは事前にコンパイルしておきます。
しかしassetファイルが見つから無い場合にtrueにしておくとサーバー側でコンパイルしてくれるそうです。
ただし、コンパイルによりサーバー側の負荷も上がるのでここは環境によって変わると思います。

今回私の場合はconfig.assets.compile = falseのところをtrueに変更して対応しました。

production.rb
# Do not fallback to assets pipeline if a precompiled asset is missed.config.assets.compile=true

config.assets.css_compressor = :sassのコメントアウトを外して
私の場合scssファイルで色付けなど行なっていたため
config.assets.css_compressor = :scssに変更

production.rb
# Compress JavaScripts and CSS.config.assets.js_compressor=:uglifierconfig.assets.css_compressor=:scss

背景画の設定しているところを
background-image: url("china.jpg");から下記に変更

index.scss
.contact{background-image:image-url("china.jpg");

asset_pathの追加
<img src="freemarket.png" alt="制作事例1" width=500px height=280px>を下記に変更

index.html.erb
<li class="portfolio">
        <a href="http://18.177.66.99/" class="portfolio-image">
          <img src="<%= asset_path "freemarket.png" %>" alt="制作事例1" width=500px height=280px >
        </a>
      </li>

あとherokuにファイル送付する前に開発環境のコンソールにて下記忘れないように。。

$ rake assets:precompile RAILS_ENV=production

最後に

僕はこのような方法でデプロイした際にうまく画像が表示されるようになりました。
環境によっても違うと思いますが参考になれば・・・・

参考にさしていただいたサイト

Rails4 asset pipeline関連設定まとめ
Rails4ではbackground:url("assets/hoge.png")の書き方は動かない話
Rails初学者がつまずきやすい「アセットパイプライン」
HerokuにRubyのデータをデプロイ後、画像が見れない

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

$
0
0

100日チャレンジの204日目

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

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

204日目は


マークアップエンジニアから見た、デザインツール「STUDIO」

$
0
0

コードを書かずにWebサイトを作成できる、STUDIOを使ってみた所感です。
HTML、CSSのプロであるマークアップエンジニア目線で書いてみます。

STUDIOとは?

STUDIOとは、ノーコーディングでWebサイトのデザインから公開までを完結できるWeb制作ツールです。ブラウザ上で動作します。

ちなみに、ブラウザは、

  • Chrome
  • Firefox
  • Safari
  • IE11

に対応しているようです。

参照:STUDIOで作成されたWebサイトの対応環境

STUDIOでできること

  • WebデザインをGUIで作成
    • モーダル
    • ハンバーガーメニュー
    • iframe埋め込み
  • 各UIに適切なHTMLタグを指定
    • id属性も付与可能
    • ドラッグ・アンド・ドロップで入れ子にできる
  • titledescription等のmeta情報の設定
    • OGイメージやファビコンも設定可能
  • お問い合わせフォーム設置
  • 独自ドメインの設定(有料)
  • 公開

詳しくは、公式のチュートリアルをご確認ください。

いくつかピックアップして解説してみます。

WebデザインをGUIで作成

ドラッグ・アンド・ドロップで各セクションやテキスト、画像等を配置した後、細かい余白やボーダー等を調整していきます。調整の項目がCSSライクで、GUIでCSSを書いているような感覚になりました。

  • display: flex;ライクなレイアウト
  • CSSの単位はpx%vw (vh)autoflexで指定可能
  • positonプロパティは、relativeabsolutefixedが指定可能
  • backgroundopacityborder系(角丸とかも) box-shadowあたりを調整できる

疑似クラスは、:hover:focus:activeが使えました。

レスポンシブWebデザインに対応しいて、ブレークポイントごとにデザインを調整できます。(ブレークポイントは、SP・TB・PCの2箇所くらいあるみたい)

また、モーダルやハンバーガーメニュー、iframe埋め込みによるマップや動画も対応しています。

各UIに適切なHTMLタグを指定

各UIのHTMLタグをGUIで指定・変更できます。たとえば、見出しレベルをh2からh3に変更したり、divarticleに変更したり。

id属性も指定できるので、アンカーリンクとかも対応できます(idを指定したUIパーツをコピペすると、id属性が重複してしまうので注意が必要という豆知識)。img要素のalt属性も指定できました。

ドラッグ・アンド・ドロップでUIパーツの中にUIパーツを入れると、HTMLが入れ子になりました。逆に、外に出すと兄弟要素になったりします。

お問い合わせフォーム設置

お問い合わせフォームのUIが用意されているので、ドラッグ・アンド・ドロップで配置し、配信先を設定するだけで使えます。楽。

独自ドメインの設定(有料)

独自ドメインの設定は有料です。無料版ですと、{subdomein}.studio.designになります。

また、無料版では左下に広告が表示されるようです。

参照:料金設定

STUDIOでできないこと

2020年1月の時点で、以下は未対応でした。

  • 一部の擬似クラス、疑似要素の指定
  • transitionanimationでの、細かいマイクロインタラクションの設定
    • :hover時、transitionが設定されていますが、一律っぽいです
  • JavaScript全般の操作
  • Google Lighthouseでは、パフォーマンスにやや難あり

所感

JavaScriptや細かいマイクロインタラクションが使えない点がネックですが、提供されてるモーダルやフォームの範囲内で十分なWebサイトであれば、特に問題なく使えるツールだと思います。

マークアップの知識があるデザイナーさんと相性が良さそうです。

逆に、HTML・CSSが書けます程度のマークアップエンジニアは、このままでは淘汰されてしまいそうですね。。がんばりましょう(^^)

WindowsでHTMLを書いているときにパス指定で躓いた話

$
0
0

WindowsでHTMLのパス指定をする際の落とし穴

とかなんとか言っていますが、結果的に見るとこれは僕の凡ミスです。
一応メモとして今回のミスを書き残しておきます。

今回のミス

今回躓いたのは、WindowsでHTMLコードを書いているときのパス指定です。
imgタグを使う時にファイルをパス指定して表示させようと思っていたのですが、うまく表示されず小一時間悩みました。

パス指定で躓く大きな理由はおそらく3つ挙げられると思います。
① コードのシンタックスエラー
② パスを間違えている
③ ファイル名を間違えている
この3つです。
大体②で躓いて困ることがあるかと思うのですが、今回は③でつまづきました。

その原因は、WindowsとMacでファイル名を変更する際のマナーが異なっていたからでした。
詳しい話をしていきましょう。

ファイル名を変更する際のマナー

Macの場合

Macでは、ファイル名は基本的に拡張子まで表示され(例外はありますが)、変更する際には拡張子まで指定して変更することができます。
例えば、
Sample.jpg

example.png
に変更する際には、拡張子までファイル名を書き換えてしまえば、拡張子を変更することができます。

Windowsの場合

Windowsでは、ファイル名は拡張子まで表示されないことがあり、変更する際には拡張子までファイル名で変更してかいても実際に拡張子を変更することができません。
例えば、JPG形式の
Sample

example.png
に変更してもPNG形式に変更することはできません。ファイル名が「example.png」のJPG形式のファイルに変更されてしまいます。
なので、もし

<imgsrc="./img/example.png">

と書いてもexample.pngを呼び出すことはできません。
仮に、Sampleという名前の元のファイルを画像ファイルとして呼び出したいときには、

<imgsrc="./img/Sample">

ではなく、

<imgsrc="./img/Sample.png">

と表記することで呼び出せます。

CSS アニメーション

$
0
0

CSS アニメーション

時の権力者ってのは傲慢なものです。あるリソースを利用してあたかも所有物のごとく他人を牽制するのがメディア(一部アニメ)を支配するやくざならぬ政府ってものです。質問の形をしたパワハラなんて誘導尋問そのもの。

おまえが作った規格じゃないだろ。

おまえが書いたページじゃないだろ。

おまえの書いたプログラムじゃないだろ。

これを乗っ取って利用する輩を排除したい。これはもう自分で書くしかないですね!ってことで CSS アニメーションの書き方です。

基本はこれですね。

#rectangle{
  background:#808080;
  margin:0px auto;
  width:400px;
  height: 200px;
  animation: fadeIn 10s;
}

@keyframes fadeIn {
    0% { opacity:0; }
    100% { opacity:1; }
}

このひな形があればあとは応用するだけ。これの一部分を隠して表示、代償を要求などすればやくざですね。これをビジネスなど呼びならわす連中は Google 先生が退治してくれる(はずなわけはないですね)。

こんな感じでCSSアニメーションが書けます。

See the Pen Happy New Year 2020 by easai (@easai) on CodePen.


Sassの記法(SCSS構文)

$
0
0

scssファイルの拡張子は.scssです。
SCSSのCSSへのコンパイルについてはWeb制作向けnpm-scriptsをご参照ください。

※Compassは個人的に使用していないので扱いません。

output-style

SCSSをコンパイルしてCSSにした場合の形式は4種類あります。

元になるSCSS

scss
section {
  background-color: white;

  h1 {
    background-color: black;
    color: white;
  }
}

output-style:nested

css
section {
  background-color: white; }
  section h1 {
    background-color: black;
    color: white; }

output-style:expanded

css
section {
  background-color: white;
}

section h1 {
  background-color: black;
  color: white;
}

output-style:compact

css
section { background-color: white; }

section h1 { background-color: black; color: white; }

output-style:compressed

css
section { background-color: white; }section h1 { background-color: black; color: white; }

ネスト

CSSの継承をネストでまとめられます。

scss
div {
  background-color: gray;

  p {
    padding: 20px;

    span {
      color: red;
    }

  }

}

↓コンパイル

css
div {
  background-color: gray;
}

div p {
  padding: 20px;
}

div p span {
  color: red;
}

子セレクタ、隣接セレクタのネスト

scss
main {

  section {
    padding: 40px;

    +section {
      margin-top: 40px;
    }

    >h1 {
      font-size: 26px;
      font-weight: bold;
    }

  }

}

↓コンパイル

css
main section {
  padding: 40px;
}

main section+section {
  margin-top: 40px;
}

main section>h1 {
  font-size: 26px;
  font-weight: bold;
}

mediaのネスト

scss
section {
  margin: 0 auto;
  width: 1200px;

  @media screen and (max-width:640px) {
    width: 100%;
  }
}

↓コンパイル

css
section {
  margin: 0 auto;
  width: 1200px;
}

@media screen and (max-width: 640px) {
  section {
    width: 100%;
  }
}

&記号(アンパサンド)

疑似クラス

scss
.child {
  color: red;

  &:hover {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.child:hover {
  color: blue;
}

疑似要素

scss
.child {
  color: red;

  &::after {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.child::after {
  color: blue;
}

複数クラス

scss
.child {
  color: red;

  &.brother {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.child.brother {
  color: blue;
}

親要素指定

sass
.child {
  color: red;

  .parent & {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.parent .child {
  color: blue;
}

クラス名変更

scss
.child {
  color: red;

  &__modifed {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.child__modifed {
  color: blue;
}

ふくろうセレクタ

scss
.child {
  color: red;

  &+& {
    color: blue;
  }

}

↓コンパイル

css
.child {
  color: red;
}

.child+.child {
  color: blue;
}

コメント

scssのみのコメント

sass
// コメント 

scssだけでなくcssにも残すコメント

コンパイル形式がcompressedのときはcssには残りません。

scss
/* コメント */

scssだけでなくcssにも残すコメント

コンパイル形式がcompressedのときもcssに残ります。

scss
/*! コメント */

演算

sass
$boxHeight: 400px;

.box {
    width: 200px + 200;
    height: $boxHeight / 4;
}

↓コンパイル

css
.box {
  width: 400px;
  height: 100px; 
}

import

css
// _button.scssファイルをインポート
@import "_button.scss"; 

// _button.scssファイルをインポート(拡張子省略)
@import "_button";

 //複数scssファイルのインポート(拡張子省略)
@import "_button","_box","_text";

//glob(objectフォルダの中のscssを全てインポート)
@import "object/*.scss"

_で始まるSCSSファイルは個別のCSSファイルを生成しません。(パーシャル)

変数

よく使う値をあらかじめ変数化しておくと、変更時に一括で変更できます。
色、フォントなどに便利です。

変数名のハイフンとアンダースコア

変数名に含まれるハイフン (-) と、アンダースコア () は同じものとして扱われます。
例:$main-color という名前で定義した変数は、$main
color という名前でも参照できます。
(Mixin の名前や関数の名前でも同様)

scss
/* 変数設定 */
$width:500px;
$color:#aa443f;

/* 変数の使用 */
#maincontainer{
  width:$width;
  color:$color;
}

!default

変数にデフォルト値を割り当てます。
(変数が定義されてないか値が null の場合に値が有効になります)

scss
$boxRadius:10px !default;

.box1 {
  $boxRadius: 20px;
  width: 100px;
  border-radius: $boxRadius;
}

.box2 {
  width: 100px;
  border-radius: $boxRadius;
}

↓コンパイル

css
.box1 {
  width: 100px;
  border-radius: 20px; 
}

.box2 {
  width: 100px;
  border-radius: 10px; 
}

変数のデータタイプの判別

sassのデータ型意味
Number型数値
Color型
String型文字列
Boolean型真偽
List型リスト
Null型
scss
$caution:red;

.dataType {
  content: quote("$cautionColorのデータ型は"+type-of($caution));
}

↓コンパイル

css
.dataType {
  content: "$cautionColorのデータ型はcolor"; 
}

関数

関数の自作

自分の好きな関数を定義できます。

scss
@function 自作関数名($引数){
  @return 戻り値;
}
sass
@function Double($value) {
  @return round($value * 2);
}

.box{
  width: Double(300px);
}

数値系

abs()

数値の絶対値を取得します。

scss
$value:-15px;

.box {
  margin: abs($value);
}

↓コンパイル

css
.box {
  margin: 15px;
}

round()

数値の小数点以下を四捨五入します。

scss
$value:15.4px;

.box {
  margin: round($value);
}

↓コンパイル

css
.box {
  margin: 15px;
}

ceil()

数値の小数点以下を切り上げます。

scss
$value:15.1px;

.box {
  margin: ceil($value);
}

↓コンパイル

css
.box {
  margin: 16px;
}

floor()

数値の小数点以下を切り捨てます。

scss
$value:15.9px;

.box {
   margin: floor($value);
}

↓コンパイル

css
.box {
  margin: 15px;
}

色系

rgba()

色に加えて透明度を指定してRGBA形式に変換します。

scss
.box {
  background-color: rgba(red, .3);
}

↓コンパイル

css
.box {
  background-color: rgba(255, 0, 0, 0.3);
}

lighten()

色を明るくします。

scss
.box {
  background-color: lighten(red, 20%);
}

↓コンパイル

css
.box {
  background-color: #ff6666;
}

darken()

色を暗くします。

scss
.box {
  background-color: darken(red, 20%);
}

↓コンパイル

css
.box {
  background-color: #990000;
}

mix()

2種類の色の間の色を抽出します。

scss
.box {
  background-color: mix(red, blue, 50%);
}

↓コンパイル

css
.box {
  background-color: purple;
}

saturate

彩度を上げます。

scss
.box {
  background-color: saturate(gray, 50%);
}

↓コンパイル

css
.box {
  background-color: #c04141;
}

desaturate

彩度を下げます。

scss
.box {
  background-color: desaturate(red, 50%);
}

↓コンパイル

css
.box {
  background-color: #bf4040;
}

adjust-hue

色相の変更ができます。

scss
.box {
  background-color: adjust-hue(red, 180deg);
}

↓コンパイル

css
.box {
  background-color: cyan;
}

invert

色の反転を行います。

scss
.box {
  background-color: invert(red);
}

↓コンパイル

css
.box {
  background-color: cyan;
}

grayscale

グレースケール化します。

scss
.box {
  background-color: grayscale(red);
}

↓コンパイル

css
.box {
  background-color: gray;
}

complement

補色に変更します。

scss
.box {
  background-color: complement(red);
}

↓コンパイル

css
.box {
  background-color: cyan;
}

nth()

指定したN番目の値を取得します。

scss
$lists:"red","blue","yellow";

.box {
  background-color: nth($lists, 2);
}

↓コンパイル

css
.box {
  background-color: "blue";
}

インターポレーション (#{})

変数を通常使えないところで使う

sass
$img_directory:"/img/bg/";

.box {
    background-image: url("#{$img_directory}background_box.jpg");
}

↓コンパイル

css
.box {
  background-image: url("/img/bg/background_box.jpg");
}

演算しない

scss
$value1:500px;
$value2:200px;

.box {
  width: #{$value1} - #{$value2};
}

↓コンパイル

css
.box {
  width: 500px - 200px;
}

演算できない場所で演算する

scss
@for $value from 1 to 5 {
  .mt_#{$value * 10} {
    margin-top: $value * 10;
  }
}

↓コンパイル

css
.mt_10 {
  margin-top: 10;
}

.mt_20 {
  margin-top: 20;
}

.mt_30 {
  margin-top: 30;
}

.mt_40 {
  margin-top: 40;
}

アンクォート

""を無くすことができます。

scss
$color:"red";

.box {
  background-color: #{$color};
}

↓コンパイル

css
.box {
  background-color: red;
}

mixinとextend

mixin

mixinを使用することで引数を使用可能です。
mixinでスタイルを定義して、includeで呼び出します。

scss
//mixin作成
@mixin box {
  background-color: red;
  color: white;
  padding: 20px;
  width: 100px;
  height: 100px;
}


//mixin使用
.box--large {

  //mixinの使用
  @include box;

  //mixinのスタイルの上書き
  width: 200px;
}

↓コンパイル

css
.box--large {
  background-color: red;
  color: white;
  padding: 20px;
  width: 100px;
  height: 100px;
  width: 200px;
}

引数を使ったmixin

scss
//引数を使ったmixinの作成
@mixin box($width, $height) {
  background-color: red;
  color: white;
  padding: 20px;
  width: $width;
  height: $height;
}

//mixinの使用
.box--large {
  //mixin使用時に値を代入
  @include box(200px, 200px);
}

↓コンパイル

css
.box--large {
  background-color: red;
  color: white;
  padding: 20px;
  width: 200px;
  height: 200px;
}

引数に初期値を設定する

scss
//引数を使ったmixinの作成
@mixin box($width:200px, $height:200px) {
  background-color: red;
  color: white;
  padding: 20px;
  width: $width;
  height: $height;
}

//mixinの使用
.box--large {
  //mixinの使用 ()は省略可能
  @include box();
}

↓コンパイル

css
.box--large {
  background-color: red;
  color: white;
  padding: 20px;
  width: 200px;
  height: 200px;
}

mixinのスコープ

ルールセット内で書くとその中でしか利用できなくなります。

scss
.parent {
  @mixin box {
    background-color: red;
    width: 200px;
    height: 200px;
   }

   .child {
     //スコープ内なのでコンパイルできる
     @include box;
   }
}

.others {
  //スコープ外なのでmixinが参照できずエラーになる
  @include box;
}

mixinにコンテントブロックを渡す

scss
@mixin border {
  .parent & {
    @content;
  }
}

.child {
  .grandChild {

    @include border {
      border: 1px solid black;
    }

  }

}

↓コンパイル

css
.parent .child .grandChild {
  border: 1px solid black;
}

extend

指定したセレクタのスタイルを継承します。
子孫セレクタ、子セレクタ、隣接セレクタなど複数のパターンで成り立つセレクタには使えません。
※media内ではextendは使用できません。

extend用のクラス

sass
//extend用のクラス作成
.button {
  background-color: red;
  border-radius: 4px;
  font-size: 16px;
  padding: 10px 20px;
}

//extendの使用
.button--link {

  //buttonクラスを継承
  @extend .button;

  //buttonクラスのスタイルの上書き
  background-color: blue;

  //スタイルの追加
  font-weight: bold;
}

↓コンパイル

css
.button, .button--link { background-color: red; border-radius: 4px; font-size: 16px; padding: 10px 20px; }

.button--link { background-color: blue; font-weight: bold; }

extend用のクラスをcssには展開しない場合

.を%に変えると、展開しません。

scss
%button {
  background-color: red;
  border-radius: 4px;
  font-size: 16px;
  padding: 10px 20px;
}

.button--link {
  //buttonクラスを継承
  @extend %button;

  //buttonクラスのスタイルの上書き
  background-color: blue;

  //スタイルの追加
  font-weight: bold;
}

↓コンパイル

css
.button--link { background-color: red; border-radius: 4px; font-size: 16px; padding: 10px 20px; }

.button--link { background-color: blue; font-weight: bold; }

メディアクエリ

ブレイクポイントの変数化

scss
$breakpointMaxSP: 640px;
$breakpointMinTAB: $breakpointMaxSP+1;
$breakpointMaxTAB: 980px;
$breakpointMinPC: $breakpointMaxTAB+1;

mixin作成

scss
@mixin maxScreen($breakPoint) {
  @media screen and (max-width: $breakPoint) {
    @content;
  }
} 

@mixin minScreen($breakPoint) {
  @media screen and (min-width: $breakPoint) {
    @content;
  }
}

@mixin minMaxScreen($minBreakPoint, $maxBreakPoint) {
  @media screen and (min-width: $minBreakPoint) and (max-width: $maxBreakPoint) {
    @content;
  }
}

mixin使用

scss
.box {

  @include maxScreen($breakpointMaxSP) {
    font-size: 16px;
  }

  @include minMaxScreen($breakpointMinTAB, $breakpointMaxTAB) {
    font-size: 18px;
  }

  @include minScreen($breakpointMinPC) {
    font-size: 20px;
  }

}

↓コンパイル

css
@media screen and (max-width: 640px) {
  .box {
    font-size: 16px;
  }
}

@media screen and (min-width: 641px) and (max-width: 980px) {
  .box {
    font-size: 18px;
  }
}

@media screen and (min-width: 981px) {
  .box {
    font-size: 20px;
  }
}

制御構文

each

配列の要素に対して繰り返し処理を実行する

scss
@each $変数名 in リスト{
  //スタイルなど
 }
scss
$boxList: box1,box2,box3,box4;

@each $box in $boxList {

  .body-#{$box} {
    background-image: url(/img/bgimg_#{$box}.jpg);
  }

}

↓コンパイル

css
.body-box1 {
  background-image: url(/img/bgimg_box1.jpg); }

.body-box2 {
  background-image: url(/img/bgimg_box2.jpg); }

.body-box3 {
  background-image: url(/img/bgimg_box3.jpg); }

.body-box4 {
  background-image: url(/img/bgimg_box4.jpg); }

if

条件分岐

scss
$isSubpage:true;

@if $isSubpage {
  .box {
    background-color: red;
  }
}

↓コンパイル

css
.box {
  background-color: red;
}
scss
$pageType:1;

@mixin boxBackgroundColor {
  @if $pageType==1 {
    background-color: red;
  }

  @else if $pageType==2 {
    background-color: blue;
  }

  @else {
    background-color: gray;
  }

}

.box {
  @include boxBackgroundColor;
}

↓コンパイル

css
.box {
  background-color: red;
}
ifで使える比較演算子意味
A==BAとBが同じ
A>BAはBより大きい
A<BAはBより小さい
A>=BAはB以上
A<=BAはB以下
A!=BAとBは等しくない
ifで使える論理演算子意味
andかつ
orまたは
not否定

while

forより複雑な繰り返し処理を行えます。

scss
@while 繰り返しを継続する条件 {
  //スタイルなど
  //繰り返し方法を指定
}

```:scss
$value:100;

@while $value>0 {
  .mt#{$value} {
    margin-top: $value;
  }

  $value:$value - 10;
}

↓コンパイル

css
.mt100 {
  margin-top: 100; }

.mt90 {
  margin-top: 90; }

.mt80 {
  margin-top: 80; }

.mt70 {
  margin-top: 70; }

.mt60 {
  margin-top: 60; }

.mt50 {
  margin-top: 50; }

.mt40 {
  margin-top: 40; }

.mt30 {
  margin-top: 30; }

.mt20 {
  margin-top: 20; }

.mt10 {
  margin-top: 10; }

for

繰り返し処理を行えます。

for~through

throughは終了の数値を含みます。

scss
@for $変数名 from 開始の数値 through 終了の数値{
  //スタイルなど
}
scss
@for $value from 1 through 5 {
  .box_#{$value} {
    margin-bottom: 50px * $value;
   }
}

↓コンパイル

css
.box_1 {
  margin-bottom: 50px;
}

.box_2 {
  margin-bottom: 100px;
}

.box_3 {
  margin-bottom: 150px;
}

.box_4 {
  margin-bottom: 200px;
}

.box_5 {
  margin-bottom: 250px;
}

for~to

toは終了の数値を含みません。

scss
@for $変数名 from 開始の数値 to 終了の数値{
  //スタイルなど
}
scss
@for $value from 1 to 5 {
  .box_#{$value} {
    margin-bottom: 50px * $value;
  }
}

↓コンパイル

css
.box_1 {
  margin-bottom: 50px;
}

.box_2 {
  margin-bottom: 100px;
}

.box_3 {
  margin-bottom: 150px;
}

.box_4 {
  margin-bottom: 200px;
}

デバッグ

CSSには何も出力せずに、Terminalに値を出力できます。

debug

scss
// src/scss/style.scssの1行目に書いた場合
@debug "debug test";

↓コンパイル

terminal
src/scss/style.scss:1 DEBUG: debug test

warn

scss
// src/scss/style.scssの1行目に書いた場合
@warn "debug test";

↓コンパイル

terminal
WARNING: debug test
         on line 1 of src/scss/style.scss

SVGとCSSで線が回るテキストアニメーションをつくる

$
0
0

はじめに :bicyclist:

SVGとCSSを使い、線が回るテキストアニメーションを作ります。

完成像↓(右下のRerunを押すと再開します)


See the Pen
SVG Text Animation
by MasatomoFukuda (@chitomo12)
on CodePen.


SVGテキストを配置する

テキストの外郭に沿って線が動くアニメーションを作るのに普通の文字列は対応しておらず、一度テキストをSVGにする必要があります。

そこで文字列をSVG化してくれるのが<svg>タグです。

svg.html
<body><svgviewBox="0 0 100 80"class="svgbox"><gfont-size="30"><textx="50"y="40"text-anchor="middle"dominant-baseline="central"><tspan>Animate!</tspan></text></g></svg></body>

実行イメージ
image.png
これだけだと味気ないので、フォントを設定し、ついでに後のアニメーションのために白抜きします。

css
.svgbox{fill:white;stroke:red;stroke-width:0.2px;font-family:"Impact";}

実行イメージ
image.png

早速良い感じになってきました:relaxed:

周りのstrokeを動かしたいので、動かした際のラフ画を作ってみましょう。
stroke-dasharrayプロパティで線と線との間隔を、stroke-dashoffsetプロパティで線の位置を調整します。

css
.svgbox{fill:white;stroke:red;stroke-width:0.2px;font-family:"Impact";stroke-dasharray:3px1px;/*点線の間隔を設定*/stroke-dashoffset:10px;/*線の位置を設定*/}

実行イメージ
image.png
回る気がしてきました。
それでは!これをアニメーションしていきましょう。

テキストを回す

CSSでアニメーションを作るには、transitionプロパティとanimationプロパティを使う二通りのやり方があります。
ここでは設定が細かくできるanimationプロパティを使います。

進行度0%~100%時点での変化を指示するキーフレームを作成し、これをanimationプロパティから呼び出すことでアニメーションを適用することができます。

css
.svgbox{fill:white;stroke:red;stroke-width:0.2px;font-family:"Impact";stroke-dashoffset:10px;stroke-dasharray:3px1px;animation:move2seaseinfinitenormalforwards;/* animation: 左から「呼び出すキーフレーム名」「アニメーションサイクルの長さ」「速度変化」「再生回数」「繰り返し方法」「終了後のスタイル設定」を指定 */}@keyframesmove{0%{stroke-dashoffset:0;stroke-opacity:0; /* 線の不透明度を0に */stroke-width:0.1px;/* 細い線から始める */stroke-dasharray:0px20px;/* 最初はすべて白線 */}100%{stroke-dashoffset:20;stroke-opacity:1; /* 線の不透明度を1に */stroke-width:0.5px;/* だんだん線を太くする */stroke-dasharray:15px0px;}}

See the Pen SVG Text Animation 01_q01 by MasatomoFukuda (@chitomo12) on CodePen.

基本のアニメーションはこれでほぼ完成です!

あとは細かい調整などを加えましょう。

レスポンシブ対応として、SVG描写範囲をウィンドウサイズに合わせて変更するようwidthheightの値も入力します。

それから個人的な趣味で、キーフレームにワンクッションを加え、グラデーションを文字全体にかけることにします。
SVGテキストにグラデーションを適用するには、SVGタグ内でグラデーションを定義する必要があります。

svg.html
<svgwidth=98vwheight=80vhviewBox="0 0 100 80"class="svgbox"><!--  グラデーション作成  --><defs><linearGradientid="myGradient"gradientTransform="rotate(90)"><stopoffset="0%"stop-color="#0E5CAD"/><stopoffset="80%"stop-color="#79F1A4"/></linearGradient></defs><!--  描写するテキスト作成  --><gfont-size="25"><textx="50"y="40"text-anchor="middle"dominant-baseline="central"><tspan>Animate!</tspan></text></g></svg>

ここで定義した#myGradientを、CSSの方で呼び出します。

css
.svgbox{fill:url(#myGradient);/* グラデーションを適用 */stroke:url(#myGradient);/* グラデーションを適用 */fill-opacity:0;animation:move2sease1normalforwards;font-family:"Impact";}@keyframesmove{0%{stroke-dashoffset:0;stroke-opacity:0;stroke-width:0.2px;stroke-dasharray:0px20px;}70%{stroke-dashoffset:10;fill-opacity:0;stroke-width:0.3px;stroke-dasharray:25px8px;}100%{stroke-dashoffset:20;fill-opacity:1;stroke-opacity:1;stroke-width:0.8px;stroke-dasharray:15px0px;}}

そんなこんだで完成したのがこちら!


See the Pen
SVG Text Animation 01_q02
by MasatomoFukuda (@chitomo12)
on CodePen.


まとめ

解像度の高いモニターが世の中に普及したことからWebデザインでSVG画像を使う例はよく聞くようになりましたが、テキストを動かすためにSVGタグを活用する例はあまり少ないなと思い、勉強がてらに投稿しました。

作成プロセスを分かりやすくしたい思いで細かい箇所の説明は端折ってしまったため、説明不足なところは適宜調べて頂けますと幸いです。

また、誤っている点などがありましたらご指摘頂けますと嬉しいです。

jsで簡単なオーディオプレーヤーを作る

$
0
0

機能

JavascriptjQueryライブラリで以下の機能を搭載するオーディオプレーヤーを作った。
・ボタンを押すことで音楽の再生/一時停止、停止
・スライダーを動かしてボリュームの調整
・再生と同時に再生中の楽曲の名称とアーティスト名、再生時間を表示

ファイルの構造としては、media1/templates下にmusic.htmlを配置し、mp3ファイルをmedia1/music下に配置。
まず、HTMLは以下の通り

<!DOCTYPE html><htmllang="ja"><head><metacharset="utf-8"><title>おーでぃお</title><linkrel='stylesheet'href='../static/style.css'>  <!-- jQuery --><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><!-- jQuery UI --><script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script><linkrel="stylesheet"href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css"></head><body><!--再生時間表示部分--><divclass="timeviewr"id='timeviewr'>00:00:00</div><br><br><!-- コントローラー部分 --><formclass='audioform'>   <!--曲名を表示する部分は、空白を入れておく--><divid="playing_title"class='playing_title'></div><br><!-- ボタン --><divclass="btns"><buttonstyle='font-size: 15px;'type="button"id="play_btn"class='play_btn'>Play</button><buttontype="button"id='stop_btn'class="stop_btn"style='font-size: 15px;'>Stop</button></div><imgsrc='../static/volumesmall.png'class="icon-volume-down"><divclass="volume"id='volume'></div><br><!--スライダー設置部分--><imgsrc='../static/volumebig.png'class="icon-volume-up"></form><br><br>

    mp3ファイルは
    <ul><li><ahref='https://the-arcadium.net/'>https://the-arcadium.net/</a></li><li><ahref="https://amachamusic.chagasi.com/genre_darktechno.html">甘茶の音楽工房</a></li></ul>から拝借しました。
  <!--最後にjsファイルを読み込む--><script type="text/javascript"src='music.js'></script></body></html>
static.css
/* music.html */.timeviewr{position:relative;left:50px;top:80px;font-size:30px;}/* コントローラ部分*/.audioform{border:3pxsolidcadetblue;background-color:darkslategray;border-radius:5px;height:125px;width:270px;position:relative;top:30px;left:30px;}.playing_title{background-color:black;height:55px;}button.play_btn,button.pause_btn,button.stop_btn{position:relative;bottom:15px;left:37px;height:30px;width:60px;border-radius:5px;}.next_btn{width:30px;position:relative;bottom:15px;left:40px;}.icon_play{width:25px;}.icon-volume-down{width:16px;position:relative;bottom:7px;left:10px;}.icon-volume-up{position:absolute;width:27px;left:233px;bottom:2px;}/* スライダー */.volume{position:relative;bottom:30px;left:32px;width:195px;}/* 押した後のボタンの色 */button.pushed_play,button.pushed_pause,button.pushed_stop{background-color:darkgrey;}

Screenshot_2020-01-04 ワイのホームページ(6).png
※画像中のhttps://the-arcadium.net/は現在アクセスできないです。
実はこれらの機能をデフォルトで持つコントローラのコードがあり、<audio src='../static/TheFatRat+-+Unity.mp3' controls></audio>を記述すると、
Screenshot_2020-01-04 ワイのホームページ(5).png
このようなコントローラが出現する。ここではあえて使わないで、オリジナルのオーディオを作成する。
次にJavaScriptファイルを編集

music.js
// 音楽ファイルを連想配列に格納varfilelist=[{name:"Unity",artist:"TheFatRat",url:'TheFatRat+-+Unity.mp3'},{name:"MidNightMoon",artist:"甘茶の音楽工房",url:'midnightmoon.mp3'},];constdir='../music/'// ../musicをいちいち記述するのが面倒なので別に分けるvarnow_file=filelist[0];// 曲を選択// new演算子によりインスタンス化して、Audioクラスをオブジェクト化varMusic=newAudio(dir+now_file.url);varplayFlag=false;// 再生中か否かを表すフラグを定義varplaybtn=document.getElementById('play_btn');varstopbtn=document.getElementById('stop_btn');varcrtTime=document.getElementById('timeviewr');// 再生時間表示部分取得// 曲を停止したときオーディオをリセットするvarClearPlayer=function(){playFlag=false;print(playing_title,"Stopped");crtTime.innerHTML="00:00:00"};// 曲の状態とタイトル、作者を表示する// stateはnow_playing, Stopped, Pausedの3種類functionprint(element,state){element.innerHTML=state+": "+now_file.name+''+now_file.artist;element.innerHTML=element.innerHTML.fontcolor('white');element.innerHTML=element.innerHTML.fontsize('4px');};// 再生/一時停止機能// addEventListenerを使用することで処理の上書きを可能にした$(functionPlay(){// playボタンをクリックした時playbtn.addEventListener('click',function(){if(playFlag==false){// 再生されていないとき// 時間のカウントMusic.addEventListener('timeupdate',function(){varsec='0'+Math.floor(Music.currentTime%60);// 秒数varmin='0'+Math.floor(Music.currentTime/60);// 分数sec=sec.substr(sec.length-2,2);min=min.substr(min.length-2,2);vartotalSec='0'+Math.floor(Music.duration%60);//秒数vartotalMin='0'+Math.floor(Music.duration/60);//分数totalSec=totalSec.substr(totalSec.length-2,2);totalMin=totalMin.substr(totalMin.length-2,2);crtTime.innerHTML=min+":"+sec+' ['+totalMin+':'+totalSec+']';},true);playFlag=true;// 再生中フラグを立てるMusic.play();// 音楽を再生play_btn.innerHTML="Pause"// ボタンをplay→pauseに変化play_btn.innerHTML=play_btn.innerHTML.fontsize('4px')print(playing_title,"now playing")// 再生中タイトルの表示// ボタンが押されたとき、色を付け、他のボタンの色を消す$('#pause_btn').removeClass('pushed_pause');$('#stop_btn').removeClass('pushed_stop');$(this).addClass('pushed_play');}else{// 再生されているとき、ボタンを押すと一時停止playFlag=false;play_btn.innerHTML="Play";// ボタンを押すとPause→Playに文字を変化print(playing_title,"Paused")$('#stop_btn').removeClass('pushed_stop');Music.pause();}},false);// 一時停止中の停止ボタン押下イベントif(play_btn.innerHTML=="Play"){stopbtn.addEventListener('click',Stop());}});// 曲の再生が終わった時、最初の状態に戻す$(functionend(){Music.addEventListener('ended',function(){print(playing_title,"Finished")$('#play_btn').removeClass('pushed_play');$('#stop_btn').removeClass('pushed_stop');play_btn.innerHTML="Play";});});// 停止ボタンfunctionStop(){// ボタンを押している間だけボタンを色付けするstopbtn.addEventListener('mousedown',function(){$(this).addClass('pushed_stop');});// ボタンを離したとき戻すstopbtn.addEventListener('mouseup',function(){$(this).removeClass('pushed_stop');});$('#stop_btn').on('click',function(){$('#play_btn').removeClass('pushed_play');play_btn.innerHTML="Play"Music.pause();Music.currentTime=0;// 経過時間を0にして完全停止ClearPlayer();});};// ボリューム調整のスライダー$(functionSlider(){$('#volume').slider({min:0,max:100,value:50,//デフォルト値range:'min',// min方向に色を付けるchange:function(){varvalue=$('#volume').slider('value');// デフォルト値を受け取るMusic.volume=(value/100);// 受け取った値を100で割る}});});

クリックイベント

クリックイベントには3つあり、
onclick属性(HTMLのinputタグに直接onclick属性を記述し、functionを指定)
onclickプロパティ(element.onclick=functionの記述)
addEventListener()
を使う方法だ。こちらに書いてあるように、onclick属性、onclickプロパティでは処理の上書きができず、複数のイベントを追加できない。よって、addEventListener()を使う方が汎用性が高い。ちなみにaddEventListener()でスライダー(音量調整のバー)も作成できるのだが、どうやらfirefoxではうまく機能しないので、jQueryでスライダーを作成した。chromeやsafariでは機能しているらしい(参考サイト)。

innerHTML

innerHTMLはHTML要素の中身を動的に取得・変更できるメソッド。ただし中身を変更する場合、変更した後の要素は既存の要素ではなく、新たなHTML要素として置き換えられる。HTML要素を挿入するinsertAdjacentHTML()の方が処理は速いらしい。詳しくはこちら

時間のカウント処理

時間のカウント処理はこちらをまるごと利用させてもらった。現在の再生時間を取得するには、currentTimeを使用する。

ボタンの色付け処理

ボタンが押されたときの色付け処理については、それぞれのボタンに押されたときのクラスを別に用意し、色を付けるときにはaddClass()でクラスを追加し、色を消したいときにはremoveClass()でクラスを削除する、といった仕組みで変化させた。ちなみにtoggleClass()はクリックするたびに追加したり削除したりする。詳しくはこちらのサイトへ。

CSSでの複数クラスの指定での注意

複数の要素やクラスに対して同時に指定するときはカンマをつける。

.class1,.class2{/**処理**/}

同じ要素内にクラス名を複数指定している場合と、入れ子構造の場合とで指定方法が違うので注意されたい。参考サイト

初心者である自分が少し悩んだエラーには、

document.getElementById("…");  null

があったが、これはHTML要素よりも先にjavascriptファイルが読み込まれていることで、HTML要素を読み込む前にjavascriptHTML要素を参照して値がみつからない、ということだった。よって、<body>の最後に<script>ファイルを置いて最後にjavascriptを読み込ませることで解決した。こちらに例を交えて解説されている。

再生すると、
Screenshot_2020-01-06 ワイのホームページ.png

他参考サイト
HTML5 Audio Playerを改良しました: ボリューム機能追加、再生ボタン機能拡張など
audioタグvideoタグでのリスト再生
HTML5のaudio要素、メソッドとイベント
BGM・効果音のフリー素材 OtoLogic
アイコンのフリー素材 ICOOON MONO
フリー素材BGM TheFatRat 甘茶の音楽工房

疑似要素:beforeや:afterのcontentで丸数字(特殊文字)を表示する方法

$
0
0

以下の内容を書き換える。

1.「&」→「\」(windowsは「¥」)
2.「#」→「0」(←数字のゼロ)
3. 数字は「10進数」→「16進数」参考→10進数←→16進数変換プログラム
4. 最後のセミコロン「;」は省略。

①(&#9312;)をcontent用に書き換える
&#9312;=>\02460

style.css
.maru:before{content:'\02460';}
index.html
<spanclass="maru"></span>
=> ①

丸数字

表示文字実体参照数値文字参照
10進16進
contentに使う値
 &#9312;\02460
 &#9313;\02461
 &#9314;\02462
 &#9315;\02463
 &#9316;\02464
 &#9317;\02465
 &#9318;\02466
 &#9319;\02467
 &#9320;\02468
 &#9321;\02469
 &#10102;\02776
 &#10103;\02777
 &#10104;\02778
 &#10105;\02779
 &#10106;\0277a
 &#10107;\0277b
 &#10108;\0277c
 &#10109;\0277d
 &#10110;\0277e
 &#10111;\0277f
 &#9451;\024eb
 &#9452;\024ec

その他特殊文字

表示文字実体参照数値文字参照
10進16進
contentに使う値
«&laquo;&#171;\0ab
»&raquo;&#187;\0bb
<&lt;&#60;\03c
>&gt;&#62;\03e
&and;&#8743;\02227
&or;&#8744;\02228
Ξ&Xi;&#926;\039e
×&times;&#215;\0d7
&larr;&#8592;\02190
&uarr;&#8593;\02191
&rarr;&#8594;\02192
&darr;&#8595;\02193
¥&yen;&#165;\0a5
©&copy;&#169;\0a9
®&reg;&#174;\0ae
 &#9650;\025b2
 &#9660;\025bc
 &#9654;\025b6
 &#9664;\025c0
 &#9651;\025b3
 &#9661;\025bd
 &#9655;\025b7
 &#9665;\025c1
 &#9632;\025a0
 &#9633;\025a1
 &#9670;\025c6
 &#9671;\025c7
 &#9675;\025cb
 &#9678;\025ce
 &#9679;\025cf
&bull;&#8226;\02022
 &#10055;\02747
 &#10056;\02748
 &#10057;\02749
 &#10058;\0274a
 &#10059;\0274b
&spades;&#9824;\02660
&clubs;&#9827;\02663
&hearts;&#9829;\02665
&diams;&#9830;\02666
 &#9828;\02664
 &#9831;\02667
 &#9825;\02661
 &#9826;\02662
 &#9832;\02668
 &#8451;\02103
 &#8467;\02113
&there4;&#8756;\02234
 &#8757;\02235
¤&curren;&#164;\0A4
&&amp;&#38;\026
 &#12306;\03012
 &#8544;\02160
 &#8545;\02161
 &#8546;\02162
 &#8547;\02163
 &#8548;\02164
 &#8549;\02165
 &#8550;\02166
 &#8551;\02167
 &#8552;\02168
 &#8553;\02169
 &#13216;\033a0
 &#13217;\033a1
 &#10003;\02713
 &#10004;\02714
 &#10005;\02715

丸枠のその他実装方法

CSSで作るリストデザイン38選!オシャレな箇条書きを実現
【CSS】olのリストで①、②、③(丸数字)を表示させる
CSSでリストを素敵にするlist-styleの使い方+もっと自由な作り方

今回の記事はプロジェクトの都合上の実装です。
本来なら丸数字が自動で繰り上がっていくようにするのがベスト👍

特殊文字

使いたいときの HTML特殊文字 & 機種依存文字


Facebookいいね!ボタンのレイアウト崩れ対策(暫定)

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

$
0
0

100日チャレンジの205日目

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

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

205日目は

flexboxで最終行の要素の幅を揃える小技

$
0
0

悩み事と結論

CSSのFlexboxは便利ですが、下のようなことでお悩みになったことはありませんか?

image.png

レスポンシブデザインなため1列の要素数をピッタリ揃えられず、最終行の要素だけ幅が変わってしまう悩みです。

実はこの問題、HTMLだけで簡単に解決できます。

1列に並べたい最大個数だけ、末尾に下のようなadjuster要素を追加してください。
この例の場合1列は最大4個なので、末尾に4つ足しています。

<divclass="root"><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="item"></div><divclass="adjuster"></div><divclass="adjuster"></div><divclass="adjuster"></div><divclass="adjuster"></div></div>
.item,.adjuster{flex-basis:calc(25%-10px);// ←adjusterにも要素と同じ幅を持たせてください。min-width:200px;flex-grow:1;// ←伸縮も指定してください。flex-shrink:0;margin-left:10px;// ←同じ左右マージンを持たせてください。}.item{height:50px;margin-top:50px;// ←上下マージンは要素のみに持たせてください。高さを持つと、余りが出た際にズレます。}.adjuster{height:0;// ←未指定で0なら省略できます。}

このCSSを当てると、最終行の余り幅をadjusterが吸収してくれます。

image.png

また、余った分については、adjusterの高さが0なので影響しません。

image.png

image.png

親のサイズもこの通り、余った分は影響しません。

image.png

画面幅が変わって1列の個数が変わってもこの通りです。

【A-Frame】VRコンテンツの作り方

$
0
0

はじめに

社内制作でVRコンテンツを作成しました。
細かいコンテンツ作成などは置いておき、VRっぽいものを作るまでの流れが簡単だったので紹介します。

環境

OS : Windows 10 Pro
エディター : VSCode

実装

1. A-Frameの読み込み

<html><head><script src="https://aframe.io/releases/1.0.3/aframe.min.js"></script></head><body></body></html>

2. オブジェクトの配置

<html><head><script src="https://aframe.io/releases/1.0.3/aframe.min.js"></script></head><body><a-scene><a-boxposition="0 1.17 -3.9"rotation="0 0 0"color="#ff0000"></a-box></a-scene></body></html>

この時点で下記のように出力されます。
※PCで確認しているので、スマホなどで確認するとすでにジャイロセンサーなど取得して、空間上にオブジェを配置します。
image.png

画像にテクスチャーを張ったり、3Dオブジェクトを配置したりできるので、試してみてください。
詳細は↓↓公式サイト↓↓
https://aframe.io/

3. A-Frame Inspector
値を変更して毎度、確認するのが面倒なので、A-Frame Inspectorを開いて(win:ctrl + alt + i)直接オブジェクトの配置やサイズ感を決めるとやりやすいかと思います。

image.png

※端末のOSのバージョンによって、センサーの取得状況が違うため、要実機検証が必要です。

実際にA-Frameで作ったサイトは↓こちら↓
http://www.hol-on.co.jp/greetingsite/newyear/2020/??utm_source=qiita

以上

CSSのcontentプロパティがUNICODEっぽく文字化けして困るとき

$
0
0

after要素で「必須」って表示させたいのにCMSの影響なのかしらんけどUNICODEっぽく文字化けして困るとき~

content要素をUNICODEで書いて解決。
なお↓はよく使う‘必須’の文字。
content: "\5FC5 \9808"

Content要素でUNICODE使いたいときはバックスラッシュを使おう。

UNICODE一覧はこちら
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/cjku_klist.html

Viewing all 8771 articles
Browse latest View live


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