#2 2020年9月にツイートしたHTML/CSS/JavaScriptのTipsまとめ
2020 年 9 月にツイートした HTML/CSS/JavaScript のツイートまとめです。見出しをクリックするとツイート元に遷移するので、気に入ったらフォロー・ファボ・リツイートお願いします。
autofocus属性
1.お問い合わせフォームやサインイン画面などでは、最初の input
要素に autofocus
属性をつけておくと、ユーザーがすぐに入力できるのでおすすめです。
<input type="text" autofocus>
autocomplete属性
2.input[type="password"]
要素には適切な autocomplete
属性を指定します。
<input type="password" autocomplete="new-password">
<input type="password" autocomplete="current-password">
新規登録フォームやパスワードリセットフォームでは new-password
値を指定し、サインインフォームでは current-password
値を指定するとパスワードマネージャーが自動入力してくれます。
imagesrcset属性
3.link[rel="preload"]
要素を使ったコンテンツの先読みで imagesrcset
属性と imagesizes
属性を使うことにより、画面幅に応じて必要な画像のみ先読みさせられます。
<link
rel="preload"
as="image"
imagesrcset="
https://picsum.photos/400/300.jpg 400w,
https://picsum.photos/800/300.jpg 800w,
https://picsum.photos/1200/300.jpg 1200w"
imagesizes="100vw">
構文は img
要素の srcset
属性や sizes
属性と同じです。今のところ、Chrome 73 と Edge 79 以降のみ対応しています。
<link rel="preload" as="image" href="https://picsum.photos/400/300.jpg" media="(max-width: 400px)">
<link rel="preload" as="image" href="https://picsum.photos/800/300.jpg" media="not all and (max-width: 400px) and (min-width: 800px)">
<link rel="preload" as="image" href="https://picsum.photos/400/300.jpg" media="(min-width: 800px)">
imagesrcset
属性に対応していないときは media
属性を使って分けて書くこともできます。
上下左右中央揃え
4.CSS で上下左右中央揃えといえば、display: flex;
や display: grid;
を指定して、align-items: center;
と justify-content: center;
を使うことが多いと思います。
<div class="parent">
<div class="child">...</div>
</div>
.parent {
display: flex;
}
.child {
margin: auto;
}
子要素に margin: auto;
を指定することで、子要素から上下左右中央揃えの指定を行うこともできます。
@property規則
5.CSS Custom Properties の定義に @property
規則を使うと変数の型を制限できます。syntax
プロパティには <image>
や <color>
、<number>
などの型を指定します。
initial-value
プロパティには初期値を指定し、inherits
プロパティには値を継承するかどうかを指定します。
@property --primary-color {
syntax: '<color>';
initial-value: red;
inherits: false;
}
.sample-1 {
background-color: var(--primary-color);
// => red
}
.sample-2 {
background-color: var(--primary-color, blue);
// => red
}
.sample-3 {
--primary-color: blue;
background-color: var(--primary-color);
// => blue
}
.sample-4 {
--primary-color: foo;
background-color: var(--primary-color);
// => red
}
.sample-2
では var()
のフォールバック値よりも @property
の initial-value
値が優先されます。.sample-4
では --primary-color
変数に foo
が指定されていますが、 <color>
型ではないため無効な値になり、initial-value
値が使われます。
対応ブラウザ はまだまだ少ないですが覚えておくとよいテクニックです。
CSS設計REMM
6.CSS設計で悩んだら一度 REMM という考え方を見てみるといいかもしれません。
String.prototype.replaceAll()
7.文字列の置換には .replace()
を使うことが多いと思いますが、.replaceAll()
というのもあります。第 1 引数に文字列を指定すると .replace()
は 1 つめのマッチだけを置換するのに対し、.replaceAll()
はすべてを置換します。
'a-b-c'.replaceAll('-', '=')
// => 'a=b=c'
'a-b-c'.replaceAll(/-/g, '=')
// => 'a=b=c'
また、.replaceAll()
は第 1 引数に正規表現を指定した場合、g
フラグをつけないと TypeError になります。
if文のショートハンド
8.&&
演算子は左辺が true
のときに右辺を評価し、左辺が false
のときには右辺を評価しないので if 文の代わりに使えます。
const a = 'あ'
// Before
if (a === 'あ') {
doSomething()
}
// After
a === 'あ' && doSomething()
ネストされた配列の展開
9.Array.prototype.flat()
を使うとネストされた配列をフラットにできます。
const array = [1, [2, 3, [4, 5, 6, [7]]]]
console.log(array.flat(Infinity))
// => [1, 2, 3, 4, 5, 6, 7]
引数には展開する階層数を指定しますが、すべてのネストを展開したい場合は Infinity
を指定します。
オブジェクトのキーを削除
10.オブジェクトのキーを削除するときは delete
演算子を使うのが普通だと思いますが、あえて分割代入を使っています。
// オブジェクトのキーを削除する関数
const omit = (obj, key) => {
const {[key]: _, ...rest} = obj[key] === null ? {...obj, [key]: 0} : obj
return rest
}
const object = {
a: 1,
b: 2,
c: 3,
d: null,
}
console.log(omit(object, 'd'))
// => {a: 1, b: 2, c: 3}
ただ、この方法だとオブジェクトのキーの値が null
のときエラーとなってしまうので、null
値のときは適当な値 0
に置換しています。
チルダ演算子で小数点以下の切り捨て
11.チルダ演算子 ~
を使えば簡単に小数点以下の切り捨てができます。
const x = 3.9
// 32ビット整数に型変換されてからビット反転される
const y = ~x // -(x + 1) = -(3 + 1) = -4
const z = ~y // -(y + 1) = -(-4 + 1) = 3
// つまり、こうすれば小数点以下を切り捨てられる
console.log(~~x) // => 3
Math.floor()
だと引数に指定された数以下の最大の整数を返すため、負の値のときには意図した挙動になりません。
const x = 3.9
const y = -3.9
console.log(~~x) // => 3
console.log(Math.floor(x)) // => 3
console.log(~~y) // => -3
console.log(Math.floor(y)) // => -4
お手軽スムーススクロール
12.scrollIntoView()
を使うと簡単にスムーススクロールを実装できます。behavior
オプションに 'smooth'
を指定することでスムーススクロールされ、block
オプションに 'center'
を指定するとスクロール先の要素が画面の中央に表示されるようになります。
document.querySelector('.target').scrollIntoView({
behavior: 'smooth',
block: 'center',
})
対応ブラウザをみると、IE や Safari で対応していないため、scroll-behavior-polyfill を使うとよいと思います。
event.targetとevent.currentTargetの違い
13.event.target
は実際にイベントが発生した要素を返しますが、event.currentTarget
はイベントが紐づけられた要素を返します。
<button>
<span>ボタン</span>
</button>
document.querySelector('button').addEventListener('click', event => {
console.log(event.target) // spanかbutton要素
console.log(event.currentTarget) // 常にbutton要素
})
valueAsNumberプロパティ
14.<input type="number">
要素に入力された値を取得するとき、event.target.value
の値を parseInt()
などで数値に変換しているコードをよく見かけますが、valueAsNumber
ならそのまま数値として取得できます。
<input type="number">
document.querySelector('input').addEventListener('input', event => {
console.log(event.target.value) // String型
console.log(event.target.valueAsNumber) // Number型
})
jQueryについて
15.今から jQuery を学ぶかどうかは自由ですが、一番の懸念点として jQuery プラグインのメンテナンスがされなくなっているということです。有名なプラグインですらここ数年、issue が放置されたりしています。
他のフレームワークに取り込みやすいように jQuery プラグインから jQuery 依存なしのライブラリへと書き換えられていることが多いので、そちらを使えば大丈夫だと思います。
Chrome DevToolsで数値の増減
16.ショートカットキーを使えば簡単に数値の増減ができます。クラス名に数字が含まれていれば、数字部分のみ値の増減を行うこともできます。
増減値 | ショートカットキー |
---|---|
±0.1 |
Alt (⌥) + ↑ / ↓ |
±1 |
↑ / ↓ |
±10 |
Shift + ↑ / ↓ |
±100 |
Ctrl (⌘) + ↑ / ↓ |
Chrome DevToolsでクラスの操作
17..cls をクリックするとクラス名ごとにチェックボックスが表示され、オンとオフを切り替えられます。また、テキストボックスに任意のクラス名を入力して追加もできます。
ztext.js
18.ztext.js は立体的な文字を実装できるライブラリです。
Vanilla Colorful
19.Vanilla Colroful は軽量なカラーパレットのライブラリです。
nanogallery2
20.nanogallery2 はモダンな画像や動画のギャラリーを作れるライブラリです。
clusterize.js
21.clusterize.js はリストやテーブルなどの超大量データ DOM 要素のスクロールを滑らかに描画するライブラリです。一度に描画する DOM 数を制限することで描画の負荷を軽減しています。
dequal
22.dequal は超軽量で 2 つの値が等しいかどうかを判定できるライブラリです。
import { dequal } from 'dequal';
dequal(1, 1); //=> true
dequal({}, {}); //=> true
dequal('foo', 'foo'); //=> true
dequal([1, 2, 3], [1, 2, 3]); //=> true
dequal(dequal, dequal); //=> true
dequal(/foo/, /foo/); //=> true
dequal(null, null); //=> true
dequal(NaN, NaN); //=> true
dequal([], []); //=> true
dequal(
[{ a:1 }, [{ b:{ c:[1] } }]],
[{ a:1 }, [{ b:{ c:[1] } }]]
); //=> true
dequal(1, '1'); //=> false
dequal(null, undefined); //=> false
dequal({ a:1, b:[2,3] }, { a:1, b:[2,5] }); //=> false
dequal(/foo/i, /bar/g); //=> false
linkinator
23.linkinator は Node.js で Web サイトのリンク切れを検出できるライブラリです。
file-type
24.file-type は Node.js でファイルの種類(拡張子)を特定できるライブラリです。
Playwright
25.Playwright は Node.js で Chromium や WebKit、Firefox での表示を一度に確認できる Microsoft 製のライブラリです。
Color.Nunja
26.Color.Ninja は 2 色間グラデーションの色を生成してくれるオンラインジェネレーターです。
Discussion