2023年8月15日火曜日

タグの意味とデザインタグ

タグの意味とデザインタグ

タグ意味要素
h1大見出しブロック要素
p段落ブロック要素
ulとli箇条書きブロック要素
table表(一覧)ブロック要素
div意味を持たないブロック要素
span意味を持たないインライン要素

さて、少しだけピックアップしましたが、例えばタイトルなどはh1タグを使います。
段落を区切る場合はpタグ、箇条書きならulタグを使います。

tableタグはデザインで避けられがちでdivで無理やり表にしている人もいますがある程度のデータ量があるならばそれはtableタグで纏めるべきです。

単一の情報を並べるだけなら箇条書きだし、2つ以上の情報の掛け合いによって意味をなすデータであるならば表であるべきです。

htmlは意味のあるタグはその意味の通りに使おう。
というのが前提の元に考えられています。

なので基本的に特定のタグを使う場合は「~タグ」は「こう使うべき」と明確に決まっています。

我々がデザインする上で実はデザインタグというものは存在していません
現在デザインするのにdivが意味を持たないブロック要素であるからこれを使っています。

また、現在はCSS(Cascading Style Sheets/ カスケーディングスタイルシート )で文章と装飾は分けるのを基本にしています。
同様にjs(javascript)で動的操作や動的機能を分けるのを基本とします。

こうする事で、本来の『情報』と『デザイン』と『機能』を分離して考える事が出来ます。
ウェブを巡回しているクローラーなどは正しい意味の通りにタグが使われている事で正しく文章の内容、文章の重要度や順序を正しく判定する事ができます。

このように整理されてきた結果html上で直接デザインに影響するcenterタグなどいくつかのタグは徐々に非推奨や廃止の方向に向かっています。

これらは結果的にメンテナンス性を上げ、人間にとっても見やすい表示になると考えられています。

ブロック要素とインライン要素

ブロック要素というのは、コンテンツの内容が一つの塊という事です。
基本的に幅100%で左右に自動改行される要素です。
(まぁ左右改行というよりどちらかと言えばこの範囲が100%で両端まで潰すために上下に押し出すイメージです。)
ブロックですので、高さや幅を指定する事が出来ます。

逆にインライン要素というのはコンテンツの一部に配置される要素であり、文中の一部を強調表示したりする様に情報の途中に一部変化を加えるものです。
ですのでインライン要素では改行要素は付きませんし高さや幅を指定出来ません

divとspanの違い

まず根源的な話をすればこの二つの違いは
「div=display: block」
「span=display: inline」
のたったこれだけです。

どちらも意味を持たないタグであるため、divにdisplay: inlineした場合はspanと同じ様に扱えます。
ただ、このように設定されているという事は、divはコンテンツの一つのデータのブロック単位である事をさしており、逆にspanはコンテンツの一部の変化に使うべきものです。

divにdisplay: inlineを指定するなら最初からspanを使うべきであり、逆にspanにdisplay: blockを指定するなら最初からdivを使うべきです。

つまりどちらも意味を持たないタグとはなっていますが
・divはコンテンツのブロック単位で使うタグ
・spanはコンテンツの一部で使うタグ
と言う最低限の意味を持っている事になります。

div内のdivを中央揃え

内側のdivに「style="width:100px;margin:0 auto;"」を追加するだけで良いです。
幅は任意に変えて下さい。これは他のブロック要素も同様です。

仕組みとして二つの要素があります
・「幅を指定」
・「左右の余白を自動調整」

divは幅100%がデフォルト設定です。
ですので幅を指定して左右に余白を作ります

インライン要素の場合、たとえばテキストなどは外側の親要素に「text-align:center; 」を指定しますがdiv内のdivを中央に寄せる場合は違います。

<div><span>内容</span></div>
である場合は
<divここにtext-align:center指定><span>内容</span></div>

<div><div>内容</div></div>
の場合は外側のdivに指定は不要です。

<div>余白自動調整<divここに幅指定とmargin:0 auto>内容</div>余白自動調整</div>
内部のdiv自身が左右の余白を自動調整することで結果的に中央にコンテンツが配置されます。


ボックス構造

ボックス構造は以下の様になっています

マージン
枠線
余白
コンテンツ
余白(padding)
枠線(border)
マージン(margin)

コンテンツとそれを囲む枠線は認識しやすいと思います。
・余白は枠線とコンテンツの間部分:無色透明
・マージンはこのボックスと外側の間部分:無色透明

指定指定範囲/指定方法
margin・値が1つの場合……「上下左右」
・値が2つの場合……「上下」「左右」
・値が3つの場合……「上」「左右」「下」
・値が4つの場合……「上」「右」「下」「左」
margin:10px;
margin:10px 10px;
margin:10px 10px 10px;
margin:10px 10px 10px 10px;
margin-top上のマージン(余白)を指定
margin-bottom下のマージン(余白)を指定
margin-left左のマージン(余白)を指定
margin-right右のマージン(余白)を指定
padding・値が1つの場合……「上下左右」
・値が2つの場合……「上下」「左右」
・値が3つの場合……「上」「左右」「下」
・値が4つの場合……「上」「右」「下」「左」
padding:10px;
padding:10px 10px;
padding:10px 10px 10px;
padding:10px 10px 10px 10px;
padding-top上のパディング(余白)を指定
padding-bottom下のパディング(余白)を指定
padding-left左のパディング(余白)を指定
padding-right右のパディング(余白)を指定
border-width線の太さ
・値が1つの場合……「上下左右」
・値が2つの場合……「上下」「左右」
・値が3つの場合……「上」「左右」「下」
・値が4つの場合……「上」「右」「下」「左」
border-width:10px;
border-width:10px 10px;
border-width:10px 10px 10px;
border-width:10px 10px 10px 10px;
border-top-width上線の太さを指定
border-bottom-width下線の太さを指定
border-left-width左線の太さを指定
border-right-width右線の太さを指定
border-style線の太さ
・値が1つの場合……「上下左右」
・値が2つの場合……「上下」「左右」
・値が3つの場合……「上」「左右」「下」
・値が4つの場合……「上」「右」「下」「左」
border-style: none;
border-style: hidden;
border-style: dotted;
border-style: dashed;
border-style: solid;
border-style: double;
border-style: groove;
border-style: ridge;
border-style: inset;
border-style: outset;

border-style: dotted solid;
border-style: hidden double dashed;
border-style: none solid dotted dashed;
border-top-style上枠線にスタイルを指定
border-bottom-style下枠線にスタイルを指定
border-left-style左枠線にスタイルを指定
border-right-style右枠線にスタイルを指定
border-color線の色
・値が1つの場合……「上下左右」
・値が2つの場合……「上下」「左右」
・値が3つの場合……「上」「左右」「下」
・値が4つの場合……「上」「右」「下」「左」
border-color: red;
border-color: red #f015ca;
border-color: red rgb(200,50,60,.8) green;
border-color: red yellow green blue;

■色の指定方法
・「red、yellow、green、blue」等
文字で指定する

・「#F00」「#FF0000」等
#で指定する場合RGBの順序で#000000~#FFFFFFまで
#FA0と指定した場合2桁は同じ指定となり#FFAA00となる

・「rgb(255,100,10)」等
上記と同じでRGB順序でrgb(0,0,0)~rgb(255,255,255)
border-top-color上枠線に色を指定
border-bottom-color下枠線に色を指定
border-left-color左枠線に色を指定
border-right-color右枠線に色を指定

例えば「margin:10px 10px;」と指定した場合
つまり「margin:[上下10px余白] [左右10px余白]」と指定されます。

2023年7月17日月曜日

viewportに挑戦した話

今回はタイトルの通りviewportに挑戦した話です。
アクセス解析は忍者ツールズの埋め込みとGoogle Search Consoleを使っています。
Google Search Consoleはサイトのダメ出しもしてくれます。

スマホでみても拡大すりゃいいんじゃないと思っていたのでサーチコンソールのモバイルユーザビリティが全て警告なのをしばらく放置していたのですがついにメスを入れる事にしました。

具体的には
ページがモバイルで利用できない理由
以下の問題があるページでは、良好なページ エクスペリエンスが実現されません。
  • テキストが小さすぎて読めません
  • クリック可能な要素同士が近すぎます
  • ビューポートが設定されていません
  • コンテンツの幅が画面の幅を超えています
たぶん、単にサイトを作ってる人はこうなるんじゃないかなと思います。

問題1:テキストが小さすぎて読めません

現在推奨されてるフォントサイズはおおよそですが14px~18pxで自サイトでのサイズはだいたいが12pxなので確かに小さいのかと思ったのですが根本的な問題はそこじゃありません。
勿論フォントサイズを大きくすればこの警告は消せるのですがこんどはPCで大きくなりま過ぎます。

この警告が言いたいのはPC向けに作られている場合、スマホなどで表示するとコンテンツ幅で表示するので「サイトを開いた際に拡大しないと文字が読めない」これです。


問題2:クリック可能な要素同士が近すぎます。

これはほぼ上記に付随します。PC向けサイトを普通に作って入れる場合はそんなクリックし辛いとかはまずないです。
上記同様にこの警告が言いたいのは「サイトを開いた際に拡大しないとリンクエリアが小さくなりすぎて隣接するリンクが2つ以上あると押し間違いしちゃう」こんな感じです。

問題3:ビューポートが設定されていません

これは上記二つを解消するものです。
ビューポートを設定するとサイトに入った瞬間にスマホなどで適切な画面幅で表示されます。
タグを入れるとぱっと見は「最初からズームで表示されている状態」になるだけです。
ただこのビューポートを設定したこの状態は「この範囲がスマホ等の適切な見える範囲だよ」って意味です。

問題4:コンテンツの幅が画面の幅を超えています

これはビューポートを設定した時に「ウェブページが画面はみ出てる」って意味です。


問題1・2・3解決方法

これ自体は簡単です。
ビューポートタグを全てのページに入れるだけです。
ビューポートを設定すると画面スマホ等で見た時にその適切な範囲で表示されます。
するとフォントサイズが12pxでも十分に見える文字サイズですし、リンクも近すぎるっていう状態でもなくなります。

「ただしユーザーに拡大縮小させてはいけない」ので第四の問題となります。

問題4の解決方法

モバイルユーザビリティを凄く簡単に言えば「拡大縮小しないで見えるサイトにして」って事です。
さらに言えば幅400前後のサイトにしてって事です。

ビューポートタグを全てのページに入れて拡大縮小しないで見ようとすればコンテンツの幅がはみ出てますよね。それがダメなのです。

普通の幅固定のPCサイトであれば1000~2000pxとかの幅があると思いますがスマホでの場合はスマホのスタイルに書き換える。
具体的には

@media screen and (min-width:481px) {
.a{PC用すたいる}
}
@media screen and (max-width:480px) {
.b{スマホ用すたいる}
}

こんな感じです。
「@media screen and (max-width:480px) 」は最後に読み込ませます。
共通のスタイルを上書きする事が出来ます。
ただし空定義で設定を無効は出来ません。あくまでも上書きです。
もしもPCの時のみの設定がある場合は「@media screen and (min-width:481px) 」に居れればOKです。

スタイルシートは後に来るのが上書きです。
読み込みも後にする必要があります。



2022年12月3日土曜日

javascriptでtableの列tdを非表示(.display="none")にするには

これもまぁ備忘録なんですけど
tdのstyle要素にアクセスする時に「.style.display = "none";」がエラーするなぁと休みの日の午前中を丸つぶしした問題
var tbl=document.getElementById("tablename");
var trs=tbl.getElementsByTagName("tr");
for(var i=0; i<trs.length; ++i){
trs[i].getElementsByTagName("td").style.display = "none";
}
ではなく
var tbl=document.getElementById("tablename");
var trs=tbl.getElementsByTagName("tr");
for(var i=0; i<trs.length; ++i){
trs[i].cells[n].style.display="none"
}
で、OK。
TR要素のcells要素から非表示できる。

javascriptでtableのtr表示非表示を崩れさせず切り替える方法

今後も詰まる人がいるだろうし、備忘録として
今回はtrタグにidを仕込んであります。

答えから
ck=document.getElementsByName("ck1")
row=document.getElementById("c"+(i+1));
if(ck[i].checked){
row.style.display="";
}else{
row.style.display="none";
}
たいていの要素は「display: block;」と「display: none;」切り替えですがこれをtableで行うとバグります。

blockは一つのブロック要素になって戻るので挙動的には
<tr>[戻した内容が一括り]</tr>
の様になり、見た目は戻した要素が一つ目のtdタグに詰め込まれる様になります。

・tableには初期値があり
table要素 display: table
thead要素 display: table-header-group
tbody要素 display: table-row-group;
tr 要素 display: table-row;
th 要素 display: table-cell;
td 要素 display: table-cell;
tfoot要素 display: table-footer-group;

戻す場合はこれらの初期値に戻せば正しく戻ります。
・・・で、横着した結果ですが「display="";」です。
こうする事で崩れず戻す事が可能です。

2022年11月5日土曜日

バイオショック2ダイアリーチェックリスト


ただのチェックボックスタグを並べただけなのでチェックした値を保存したりは出来ません。
ゲーム中開いておいて一時的に取り逃しがないか確認する為だけ。

■アドニス高級リゾート
1 "ビッグ"ケイト・オマリー
2 レイシェル・ジェイクス
3 Dr.ラム
4 ブリジット・テネンバウム
5 マーク・メルツァー
6 アンドリュー・ライアン
7 サミー・フレッチャー
■アトランティック急行
8 アンドリュー・ライアン
9 エレノア・ラム
10 プレンティス・ミル
11 Dr.ラム
12 マーク・メルツァー
13 Dr.ラム
14 ギル・アレクサンダー
15 ブリジット・テネンバウム
■ライアン遊園地
16 Dr.ラム
17 カールソン・フィドル
18 ニーナ・カーネギー
19 エレノア・ラム
20 Dr.ラム
21 サイラス・バンダム
22 マーク・メルツァー
23 ニーナ・カーネギー
24 カールソン・フィドル
25 アンドリュー・ライアン
26 Dr.ラム
27 ニーナ・カーネギー
28 スタンレー・プール
29 マイク・ハバック
30 アンドリュー・ライアン
31 ラヴィン・レスター
32 ギル・アレクサンダー
33 グレース・ホロウェイ
34 オーガスタス・シンクレア
■パウパードロップ
35 Dr.ラム
36 グレース・ホロウェイ
37 オーガスタス・シンクレア
38 トビアス・リーファー
39 プレンティス・ミル
40 私立探偵ロック・フラナガン
41 Dr.ラム
42 Dr.ラム
43 スタンレー・プール
44 マーク・メルツァー
45 アンドリュー・ライアン
46 ジャッキー・ロドキンス
47 グレース・ホロウェイ
48 グレース・ホロウェイ
49 オーガスタス・シンクレア
50 グロリア・パーソン
51 ギデオン・ワイボーン
52 エリオット・ネルソン
53 エレノア・ラム
54 グレース・ホロウェイ
55 レオ・ハートウィグ
■セイレーン通り
56 ウェールズ神父
57 オーガスタス・シンクレア
58 ギル・アレクサンダー
59 ジェイミー・バイアス
60 エレノア・ラム
61 ウェールズ神父
62 ダニエル・ウェールズ
63 ダスキー・ドノバン
64 ダニエル・ウェールズ
65 ダニエル・ウェールズ
66 Dr.ラム
67 ギル・アレクサンダー
68 フランク・フォンテイン
69 アンドリュー・ライアン
70 マーク・メルツァー
71 エレノア・ラム
72 Dr.ラム
73 ウェールズ神父
74 Dr.ラム
75 ウェールズ神父
■ディオニソスパーク
76 スタンレー・プール
77 ビリー・パーソン
78 アンドリュー・ライアン
79 アンドリュー・ライアン
80 "ビッグ"ケイト・オマリー
81 マーク・メルツァー
82 スタンレー・プール
83 ギル・アレクサンダー
84 Dr.ラム
85 ギル・アレクサンダー
86 Dr.ラム
87 Dr.ラム
88 フランク・フォンテイン
89 スタンレー・プール
90 スタンレー・プール
■フォンテイン未来技術社
91 アンドリュー・ライアン
92 ギル・アレクサンダー
93 Dr.ラム
94 エレノア・ラム
95 ギル・アレクサンダー
96 ギル・アレクサンダー
97 フランク・フォンテイン
98 Dr.ラム
99 ギル・アレクサンダー
100 ギル・アレクサンダー
101 ギル・アレクサンダー
102 Dr.ラム
103 Dr.ラム
104 エレノア・ラム
105 アンドリュー・ライアン
106 ギル・アレクサンダー
107 Dr.ラム
■ペルセポネ外部
108 オーガスタス・シンクレア
109 Dr.ラム
110 エレノア・ラム
111 エレノア・ラム
112 エレノア・ラム
■ペルセポネ内部
113 ナイジェル・ウィアー所長
114 トーマス
115 コナー
116 ドッジ
117 マットソン
118 パーソン
119 マーフィ
120 ナイジェル・ウィアー所長
121 ハロルド・ダービー
122 エドワード・グライムス医師
123 エレノア・ラム
124 オーガスタス・シンクレア
125 アンドリュー・ライアン
126 ウィルソン
127 ナイジェル・ウィアー所長
128 エドワード・グライムス医師
129 エドワード・グライムス医師

2022年9月17日土曜日

アンチャーテッドコレクション。「ステルスたのしい!」

 内容としては

・アンチャーテッド エル・ドラドの秘宝
・アンチャーテッド 黄金刀と消えた船団
・アンチャーテッド -砂漠に眠るアトランティス-

の上記3作品が入っています。

簡単に言えば「そうはならんやろ」という感じの大冒険をするゲームでしょうか。
ドンパチなどがあるもののけっこうコミカルにもしてあり、とても面白かったです。


ステルスの部分が面白かったのですが別にステルスゲームではない為、ステルス不可な箇所もあります。
ただここにちょっと不満があって、「ステルス状態で開始する」のにステルス不可の箇所が不明の戦闘というのがあって、自身の行動が悪かったのでステルスが解除されたのか分からないという問題。

おそらくでしか言えませんが、開発陣的には「最初の数人を削って戦闘の負荷を下げれますよ」みたいな事をしたいんだと思います。
そこまぁ理解できなくもないんですが、「セリグマンの犬を使った実験」を知っているでしょうか?

主に「学習性無力感」などの説明でよくみる内容です。
たとえば、不快を与える程度の微量な電気を回避可能な状態と回避不能な状態の2パターン用意します。
先に回避不能状態を味わった後に回避可能状態に置かれた場合回避行動をするかどうか。
という感じの内容です。
結果からいうと、電気ショックを回避できないと学習してる為、電気ショック回避を取らなくなります。

これと同じでステルス開始なのにどうしても100%見つかるという場合が何度かあると、ノーアラートが可能なエリアでもどうせ見つかるし、ステルス行動せずに最初からドンパチすればよくね?とう事になります。

いやまぁたぶん、アンチャーテッドの映画みたいなゲームの空気感を考えるとドンパチして欲しいって事なんでしょうが、「ここからは隠れられそうにない」とか「強襲するしかないか」みたいな言葉を入れたり、ムービーで強制戦闘に切り替わるとかしてくれればこんな手探りしなくていいのに・・・!っていうストレスがやばかったです。

もしも、開発陣はステルスを望んで無いんだ!!って場合はステルス戦闘機能なんてつけるなよ。っていう感じ。

コレクションをやって思ったことはなんかこうステルスの微妙感。
あくまでも面白かったっていう事を前提にちょっとこう足りないなぁという事を述べると、死体を隠せるようにするといった行動、死体を移動させる方法などが欲しかったです。


コレクションの古いほうは死体が落ちてても敵は反応しないので問題ないのですが、3のアトランティスなどは敵が死体を見つけると警戒かアクティブになります。

なので、ステルスキルをする場合も壁角や低遮蔽の引き込みキルが重要になります。
しかし、引き込みキルが難しいところや無理な場所(死体を隠せない)場所などがあり難易度がぐっと上がります。

まぁ、ステルス難易度が上がるだけならまぁ良いんですが、それによるステルス不可になるとむむむむむって感じになります。

ステルスの面白いところは敵の行動の観察、敵の感知範囲やなんの行動に反応するか、NPCを手探りで解析していく所・・つまりはシステムの作り込まれた部分を楽しめる所でしょうか。


まとめ

・ストーリーも面白かったですがステルス戦闘が特に面白かったです。
・開発はステルスさせたいの?させたくないの?どっちもさせたいの?
├ステルスさせたくないならそもそもそんな機能つけないで・・・
├どっちもやらせたいならステルス不可に入る箇所で何か合図が欲しい
└あと、NPCに死体発見動作をつけるなら死体を移動する方法を付けて・・・


2022年6月21日火曜日

javascript備忘録その2

 聖剣伝説の攻撃力シミュレーターを作ってその状態をURLで保存するページを作ってみました。
ただ、ツイートする際に現在のURLでツイートするから現在のURLをリアルタイムで変更したいなぁって思ったので少し調べてみた。

ページ遷移動作は
location.href = 'URL';
ようはページリンクと変わらない。

現在のページパラメーター変更は
location.search = '?param=abc';
パラメーター更新という意味ではこれが正しい。
ただ、パラメーター変更はページの更新処理が走る。

現在のハッシュ値の変更
 location.hash = '#hash';
こちらは更新は走らない。
というのもハッシュはページ内の位置を記憶する為のものだから。

他に
History.pushState()
こちらもリアルタイムに変更できる
ただパラメーターというよりはハッシュみたいな扱いな気がする

最終的な悟り
そもそもツイートボタンのリンクを書き換えればよいのでは?
それはそう。

公式のシェアボタン生成から中身を見てみる。
<a href="https://twitter.com/share?ref_src=twsrc%5Etfw"
class="twitter-share-button"
data-size="large"
data-text="聖剣伝説 Legend Of Mana リマスター 攻撃力シミュレーター"
data-url="http://blackstraycat.nobody.jp/lom/lom-savechart.htm"
data-hashtags="聖剣伝説LoM"
data-show-count="false">Tweet</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
なるほど。