昨今のWEB事情お勉強

メタ情報

title

<title>テキストテキストテキストテキストテキストテキスト</title>

AI曰く28~35文字程度が目安?他のサイトを見るとPCは30文字、スマホだと幅375pxで37文字だった。(英語混じりのやつで)
なので、30文字に収めるって事を意識すべきかと思われる。

meta description

<meta name="description" content="テキストテキストテキストテキストテキストテキスト">

検索結果に表示されるのは、PCだと130文字、スマホだと60~90文字とのこと、出典により差があるので、最低60文字程度で考えるべき?
→デバイス幅により変動する、vw375pxで見た所日本語で66文字だった、60文字程度を基準に考えるべきか。

OGPタグについて

『Open Graph Protocol』の略、SNSにURLが投稿された時に表示されるタイトル、画像、説明文を表示する為に記述。

<meta property="og:url" content="ページのURL"/>
<meta property="og:type" content="ページの種類(website または blog または article)"/>
<meta property="og:title" content="ページのタイトル"/>
<meta property="og:description" content="ページの概要"/>
<meta property="og:site_name" content="ページのサイト名"/>
<meta property="og:image" content="サムネイル画像のURL"/>

Twitter用には上記に加えて他に設定出来るタグがある

<meta name="twitter:card" content="カードの種類">
<meta name="twitter:site" content="@ユーザー名">
<meta name="twitter:title" content="ページのタイトル">
<meta name="twitter:description" content="ページの概要">
<meta name="twitter:image" content="サムネイル画像のURL">

twitter:cardの種類は『summary』と『summary_large_image』の2つ、
twitter:imageの画像サイズについてはSummaryの場合は『1:1で144 × 144px以上』、『summary_large_image』の場合は、『1.91:1で600 × 314px以上』
→800 × 800pxと1200 × 627pxとかで作ったほうがいいかも。

備忘録、noteでOGPタグが読み込めなかった!

運用しているサイトのURLをノートに貼ったところ、でOGPタグが読み込まれず、トラブル。
原因は、海外からのサーバーのアクセスを遮断してた事によるもの。
OGPタグはクローラーで読みにくるものなので、アクセスを遮断してると読み込みがされなくなってしまう。
解決方法としては、.htaccessに海外アクセスを除外する設定を書き込んでいたので、そこに『notebot』からのアクセスを許可する記述『SetEnvIf User-Agent "notebot" allowbot』を追記したらいけた。

前後の設定の流れがあるから留意!

#########  海外IPを許可しないための設定  #########

### 検索エンジンをまとめて許可するためにenv化する (Must)
SetEnvIf User-Agent "Googlebot" allowbot
SetEnvIf User-Agent "msnbot" allowbot
SetEnvIf User-Agent "bingbot" allowbot
SetEnvIf User-Agent "Slurp" allowbot
SetEnvIf User-Agent "notebot" allowbot

### いったん全てを拒否する (Must)
order deny,allow
deny from all

### 検索エンジンからのアクセスを許可 (Must)
allow from env=allowbot

### SearchConsoleのプロパティが確認出来るためにの対策 (使っていなければ不要)
### https://support.google.com/webmasters/answer/80553?hl=ja
allow from googlebot.com
allow from google.com


order deny,allow
deny from all

allow from 1.0.16.0/20
........

ファビコンについて

基本の形は下記?

<link rel="icon" href="favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">

一般的なfaviconとスマホ用のfaviconで2つ。

それ以外のサイズ展開

サイズ 用途
「16px × 16px」 ブラウザファビコン
「32px × 32px」 ブックマークやショートカットファビコン
「96px × 96px」 デスクトップショートカットファビコン
「180px × 180px」 Apple デバイス(iPad)用ファビコン
「192px × 192px」 Chrome 推奨ファビコンサイズ
「256px × 256px」 Android ホーム画面表示用ファビコン

バキッと用意するならこれかな?

<link rel="icon" href="/favicon.ico" sizes="32x32">
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">

普通のfaviconは32px×32px、『apple-touch-icon』は180px×180pxで製作する。


閲覧環境(2025年10月時点調べ)

デバイスのディスプレイサイズについて

2025年10月の数字まとめ
↓参考URL
https://gs.statcounter.com/screen-resolution-stats/desktop/japan

世界

日本の数値、PC解像度

1920x1080
24.85%
一般的なPCディスプレイ
1536x864
8.1%
これはおそらく『1920x1080』を125%で見てる人の画面サイズ
2560x1440
6%
WQHDっていうカテゴリ、『1920x1080』より一回り大きめなサイズ
1366x768
4.9%
ノートPCとか?
1280x720
3.66%
一昔前のディスプレイサイズ

日本の数値、スマホ解像度

375x812
15.08%
iPhone XとかiPhone11相当?
390x844
14.9%
iPhone 12、Pro関係~iPhone 14
393x852
10.63%
iPhone 16
414x896
8.55%
iPhone 11 Pro Max
375x667
5.74%
iPhone 11 Pro、iPhone X
412x915
4.75%
???

スマホ375と390が横並びトップ的な?ただ、他とのバランスを考えると、375~415位でしっかり表示させる感じで作るのがよろしいかと?リキッドリキッド

日本の数値、PC、スマホ総合、割合編

Desktop
49.79%
Mobile
48.92%
Tablet
1.28%

日本の数値、PC、スマホ総合解像度編

1920x1080
13.15%
375x812
6.92%
390x844
6.76%
393x852
4.81%
1536x864
4.25%
414x896
3.87%

割合から見ると、どちらを優先するともなくPC、スマホ両方のシェアが同等なので同様に対応すべきっぽいように見えるが、自分が作るサイトを見る人の属性を考えて対応すべき。

ブラウザ比率調査(2025年10月版)

日本のブラウザシェア率ではレガシーなブラウザはもう完全に無視してもよかろうという状況、というかすでに皆気にはしてないだろうね、うん。

参考リンク:https://gs.statcounter.com/browser-market-share/all/japan

Xの閲覧環境について(2023年)

スマホ(携帯電話)が圧倒的みたいだぁね。

参考リンク:20代は81.6%が携帯電話から閲覧…X(旧Twitter)の利用状況詳細(最新)

cssについて

何か気が付かないうちにめっちゃ成長してた…

ネストが使えるようになってた…

2023/04/05にChromeがサポートし始めたらしい。
scssで基本メインで使ってたのがネストの機能だから、もう要らんやん…、sass…。

という事でこのメモもscssを捨てた。元々機能を使ってなかったし。

これがcssでできちゃう…

hoge {
  hagu {
    margin-bottom: 0;
    margin-top: 15px;
    &:first-child {
      margin-top: 0;
    }
  }
  fuga {
    margin-bottom: 0;
    &:before {
      content: 'ー';
      color: #ccc;
      padding-right: 0.2em;
    }
  }
}

各モダンブラウザは対応済

いわゆるモダンブラウザでは全部対応できてるので心配なく使って良さそうだ。

参考リンク:https://caniuse.com/css-nesting

参考記事:https://coliss.com/articles/build-websites/operation/css/css-nesting.html

変数も使えるようになってた、

えぇ~、めっちゃええやん…

変数の宣言

※スコープがあるよ

/* どこでも使用可能 */
:root {
  --text-color: #444;
}
/* セレクタ内で使用可能 */
.hoge {
  --hoge-color: red;
}

変数のコール

/* どこでも使用可能 */
:root {
  --text-color: #444;
  --margin: margin;
}
.hoge {
  color: var(--text-color);
}
/* プロパティ名を変数にすることはできない */
.fuga {
  var(--margin): 30px;
}

css変数の中でcss変数を定義

:root {
  --gradient-start-color: #e66465;
  --gradient-end-color: #9198e5;
  --bg-gradient: linear-gradient(var(--gradient-start-color), var(--gradient-end-color));
}
.hoge {
  background: var(--bg-gradient);
}

jsで変数の名前を指定して読んだり、設定しに行く事も可能

const hogeStyleVal = hogeStyle.getPropertyValue('--text-color');
console.log(hogeStyleVal);

グリッドレイアウトについて

いい加減グリッドレイアウトと向き合おう、目を背けてばかりではいかん。

グリッドレイアウトって?

縦横でグリット状のレイアウトが作れちゃうよ~ってやつ、そのまんま言ってるだけやん。

scroll-snap-type

スクロール位置をパシッと決めることが出来る…?cssらしいです。

/* スナップなし */
scroll-snap-type: none;

/* スナップ軸のキーワード値 */
scroll-snap-type: x;
scroll-snap-type: y;
scroll-snap-type: block;
scroll-snap-type: inline;
scroll-snap-type: both;

/* スナップの厳格さに関するオプションのキーワード値 */
/* 任意の mandatory | proximity*/
scroll-snap-type: x mandatory;
scroll-snap-type: y proximity;
scroll-snap-type: both mandatory;

「mandatory」が厳格、「proximity」はちょっとゆるめ

「scroll-snap-align: center;」はスナップする位置で、start、center、endがある

試しに使ってみよう


.css_test.test251212_01 {
	.section {
	  overflow-x: auto;
	  scroll-snap-type: x mandatory;
	  -webkit-overflow-scrolling: touch;
	  scroll-padding: 1rem;
	  white-space: nowrap;
	}
	 
	.section__item {
		display: inline-block;
		width: 400px;
	  height: 150px;
	  margin-right: 15px;
	  scroll-snap-align: center;
	  background-color: #ccc;
	}
}
<div class="css_test test251212_01">
	<div class="section">
	  <div class="section__item">Item 1</div>
	  <div class="section__item">Item 2</div>
	  <div class="section__item">Item 3</div>
	  <div class="section__item">Item 4</div>
	  <div class="section__item">Item 5</div>
	</div>
</div><!-- .css_test -->
			
Item 1
Item 2
Item 3
Item 4
Item 5

おお…、ピタピタと動く…、すごい…

:has()

疑似クラスの一種、何回か見たことある
()の中で指定した子孫要素を持つ親要素に対してスタイルを適用出来る。

/*
  img要素を子孫に持つ
  a要素のカラーを変更
*/
a:has(img) {
  color: red;
}

これ欲しい時、ある気はするんだけど、本能でそうなるシチュエーションを避けてしまう節があるからなぁ…。

starting-style + allow-discrete

@starting-styleは、display: none;が指定されている要素に対して、cssプロパティの開始値を定義する為のプロパティ
display: none;があるとtransitionが効かない為。

ゲロくっそ長いけど実例!

なしパターン

ありパターン1

ありパターン3

<style>
.css_test.test251212_02 {
	/* 基本スタイル */
	dialog {
	  padding: 0;
	  width: 300px;
	  height: 300px;
	  position: fixed;
	  top: 50%;
	  left: 50%;
	  margin-left: -150px;
	  margin-top: -150px;
	}

	/* ここから本番 */

	/* トランジションと透過を設定 */
	dialog#test251212_02_modal02 {
		transition: opacity 1s;
	}

	/* 開始時のopacityを定義、これでdisplay: none;からblockに変わった時の値が定義できる */
	@starting-style {
		dialog#test251212_02_modal02 {
		  opacity: 0;
		}
	}

	/* 
	この時、表示される時には効くけど、消えるときには効かない。
	なので、次に使うのが「transition-behavior」の「allow-discrete」。
	displayやoverlay等の「離散プロパティ(?)」に対してトランジションを効かせる
	*/
	dialog#test251212_02_modal03 {
		/* 初期状態のopacityを定義しておかないとtransitionした時に
		戻って来る値がないので正常動作しない */
		opacity: 0;
		transition: 
			/* 各transitionにallow-discreteを効かせる
			「overlay」はTop Layerに表示されているか否かを示すプロパティ、
			これもスタイルを付けておかないと、closeし始めた瞬間にTop Layerじゃ
			なくなるのでtransitionし始めた時に他の要素の裏に隠れたりする。 */
			opacity 1s allow-discrete, 
			overlay 1s allow-discrete,
			display 1s allow-discrete;
	}

	dialog#test251212_02_modal03[open] {
		/* transitionした先のスタイル */
		opacity: 1;
	}

	@starting-style {
		dialog#test251212_02_modal03[open] {
			/* openになった瞬間に適用される@starting-style */
		  opacity: 0;
		}
	}


	/* 「::backdrop」にも同様にスタイルを付けておくと、
	背景の薄黒いのも綺麗に表示/非表示するよ */
}

</style>

<dialog id="test251212_02_modal">
	<p>なしパターン</p>
</dialog>
<button id="test251212_02_btn" type="button">なしパターン</button>
<script>
/* aパターン */
const modal = document.querySelector('#test251212_02_modal');
const modalBtn = document.querySelector('#test251212_02_btn');
modalBtn.addEventListener('click', (event) => {
	modal.showModal();
});
modal.addEventListener('click', (event) => {
	modal.close();
});
</script>


<dialog id="test251212_02_modal02">
	<p>ありパターン1</p>
</dialog>
<button id="test251212_02_btn02" type="button">ありパターン2</button>
<script>
/* bパターン */
const modal02 = document.querySelector('#test251212_02_modal02');
const modalBtn02 = document.querySelector('#test251212_02_btn02');
modalBtn02.addEventListener('click', (event) => {
	modal02.showModal();
});
modal02.addEventListener('click', (event) => {
	modal02.close();
});
</script>


<dialog id="test251212_02_modal03">
	<p>ありパターン3</p>
</dialog>
<button id="test251212_02_btn03" type="button">ありパターン3</button>
<script>
/* cパターン */
const modal03 = document.querySelector('#test251212_02_modal03');
const modalBtn03 = document.querySelector('#test251212_02_btn03');
modalBtn03.addEventListener('click', (event) => {
	modal03.showModal();
});
modal03.addEventListener('click', (event) => {
	modal03.close();
});
</script>

text-autospace