背景日本語を学び始めた当初は、日本語の50音を覚えるのは簡単ではなく、特にカタカナを覚えるのは困難でした。この時、断片的な時間を有効に活用して、昼休みや地下鉄の中でいつでも50音を練習できるアプリがあったらいいなと思いました。そこで 成し遂げるオンライン体験アドレス: https://dragonir.github.io/kanaApp/ 実装効果は以下のとおりです。アプリケーションは主に3つのページに分かれています。
回答ロジックのルールは、質問表示エリアの単語に対応する正しいオプションを、指定された ダークモード ダークモードを決定する
結果が 次の例では、システム テーマ カラーが暗い場合、 @media (優先カラースキーム: 暗い) { .demo { 背景: #FFFFFF; } } @media (優先カラースキーム: 明るい) { .demo { 背景: #000000; } } ダークモードを決定する システムがテーマカラーをサポートしているかどうかを判断するための判断媒体として if (window.matchMedia('(prefers-color-scheme)').media === 'not all') { // ブラウザはテーマカラー設定をサポートしていません} if (window.matchMedia('(prefers-color-scheme: dark)').matches){ // ダークモード } else { // ライトモード} さらに、システムのダーク モードの状態を動的に監視し、システムのダーク モードの切り替えに応じてリアルタイムで応答することもできます。 window.matchMedia('(prefers-color-scheme: dark)').addListener(e => { if (e.matches) { // ダークモードをオンにする } else { // ダークモードをオフにする } }); または、ダークモードまたはライトモードを個別に検出します。 const リスナー = { 暗い: (mediaQueryList) => { mediaQueryListが一致する場合 // ダークモードをオンにする} }, ライト: (mediaQueryList) => { mediaQueryListが一致する場合 // ライトモードをオンにする} } }; window.matchMedia('(prefers-color-scheme: dark)').addListener(listeners.dark); window.matchMedia('(prefers-color-scheme: light)').addListener(listeners.light); 50トーンゲームでは、 ページで画像要素が使用されている場合、システムがダーク モードを有効にしているかどうかを <写真> <source srcset="dark.jpg" media="(prefers-color-scheme: dark)"> <img src="light.jpg"> </画像> 注意: オフラインキャッシュネイティブアプリケーションのように素早くアクセスするためのショートカットをデスクトップ上に生成し、いつでもどこでもオフラインで使用できるようにするために、 特徴:
設定ページのパラメータプロジェクトのルートディレクトリに // マニフェスト.webmainifest { "name": "かなゲーム", "short_name": "かなゲーム", "start_url": "index.html", "ディスプレイ": "スタンドアロン", "背景色": "#fff", "description": "かなゲーム", 「アイコン」: [ { "src": "assets/images/icon-64x64.jpg", "サイズ": "64x64", "タイプ": "画像/jpg" }, { "src": "assets/images/icon-256x256.jpg", "サイズ": "256x256", "タイプ": "画像/jpg" } ] } パラメータの説明:
一部のシステムのブラウザが
設定情報自動生成ツール: https://tomitm.github.io/appmanifest/
<meta name=viewport content="width=デバイス幅、初期スケール=1、最大スケール=1、最小スケール=1、ユーザースケーラブル=いいえ、ビューポートフィット=カバー"> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="apple-mobile-web-app-title" content="かなゲーム"> <link rel="スタイルシート" type="text/css" href="./assets/css/main.css" rel="外部nofollow" > <link rel="スタイルシート" type="text/css" href="./assets/css/dark.css" rel="外部 nofollow" > <link rel="スタイルシート" type="text/css" href="./assets/css/petals.css" rel="外部 nofollow" > <link rel="ショートカットアイコン" href="./assets/images/icon-256x256.jpg" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" > <link rel="apple-touch-icon" href="./assets/images/icon-256x256.jpg" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" /> <link rel="apple-touch-icon-precomposed" href="./assets/images/icon-256x256.jpg" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" > <link rel="ブックマーク" href="./assets/images/icon-256x256.jpg" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" /> <link rel="manifest" href="./manifest.webmanifest" rel="外部 nofollow" > <title>かなゲーム</title>
server-worker を登録するには、 window.addEventListener('load', () => { SWを登録します。 }); 非同期関数registerSW() { if ('serviceWorker' in ナビゲータ) { 試す { navigator.serviceWorker.register('./sw.js'); を待機します。 } キャッチ (e) { console.log(`SW登録に失敗しました`); } } } ルートディレクトリに // キャッシュのキー値を定義します const cacheName = 'kana-v1'; // キャッシュする必要があるファイルを定義する const staticAssets = [ './', './index.html', './assets/css/main.css', './assets/js/main.js', './assets/images/bg.jpg' // ... ]; // インストールイベントをリッスンし、インストールが完了したらファイルをキャッシュします。self.addEventListener('install', async e => { // キーに対応するキャッシュを検索し、操作可能なキャッシュ オブジェクトを取得します。const cache = await caches.open(cacheName); // キャッシュする必要があるファイルを追加します。await cache.addAll(staticAssets); self.skipWaiting() を返します。 }); // キャッシュされたデータを更新するために activate イベントをリッスンします self.addEventListener('activate', e => { // 最初のロードフェッチが self.clients.claim() をトリガーすることを確認します。 }); // キャッシュされたデータを使用するためにフェッチ イベントをリッスンします。 self.addEventListener('fetch', 非同期e => { 定数 req = e.request; const url = 新しい URL(req.url); url.origin === location.origin の場合 { e.respondWith(cacheFirst(req)); } それ以外 { e.respondWith(ネットワークとキャッシュ(req)); } }); 非同期関数cacheFirst(req) { // 現在のリクエストをキャッシュする必要があるかどうかを判断します const cache = await caches.open(cacheName); const キャッシュ = cache.match(req); // キャッシュがある場合は、そのキャッシュを使用します。ない場合は、新しいリクエストから取得します。 return cached || fetch(req); } 非同期関数networkAndCache(req) { const キャッシュ = caches.open(cacheName) を待機します。 試す { // キャッシュ エラーも新しいリクエストから直接取得されます const fresh = await fetch(req); cache.put(req, fresh.clone()) を待機します。 新鮮な状態に戻る。 } キャッチ (e) { const キャッシュ = cache.match(req); キャッシュされたものを返します。 } } **
注: これで、インストールされた 結果: PC 側 🖥️: モバイル 📱: 桜が散る 視覚効果と興味を高めるために、ページに桜の花が散る 基本的な構文:
パラメータ:
次のコードは、この例の具体的な実装です。 <div id="花びらコンテナ"> <div class="花びら"></div> <!-- ... --> <div class="花びら"></div> </div> var petalPlayers = []; 関数animatePetals() { var 花びら = document.querySelectorAll('.petal'); if (!petals[0].animate) { var petalsContainer = document.getElementById('petals_container'); false を返します。 } (var i = 0, len = petals.length; i < len; ++i) の場合 { var 花びら = 花びら[i]; petal.innerHTML = '<div class="rotate"><img src="petal.jpg" class="askew"></div>'; var スケール = Math.random() * .6 + .2; var プレイヤー = petal.animate([{ 変換: 'translate3d(' + (i / len * 100) + 'vw,0,0) scale(' + scale + ')', 不透明度: スケール }, { 変換: 'translate3d(' + (i / len * 100 + 10) + 'vw,150vh,0) スケール(' + scale + ')', 不透明度: 1 } ], { 期間: Math.random() * 90000 + 8000, 反復回数: 無限、 遅延: -(Math.random() * 5000) }); petalPlayers.push(プレイヤー); } } 花びらをアニメーション化します(); .花びら.回転{ アニメーション:driftyRotate 1s infinite both easy-in-out; 視点: 1000; } .花びら .斜め { 変換: skewY(10deg); 表示: ブロック; アニメーション: ドリフト 1 秒無限交互イーズインアウト; 視点: 1000; } .petal:nth-of-type(7n) .askew { アニメーション遅延: -.6秒; アニメーション期間: 2.25秒; } .petal:n番目の型(7n + 1) .askew { アニメーション遅延: -.879秒; アニメーション期間: 3.5秒; } /* ... */ .petal:nth-of-type(9n) .rotate { アニメーション期間: 2秒; } .petal:n番目の型(9n + 1) .rotate { アニメーション期間: 2.3秒; } /* ... */ @keyframes ドリフト { 0% { 変換: skewY(10deg) translate3d(-250%, 0, 0); 表示: ブロック; } 100% { 変換: skewY(-12deg) translate3d(250%, 0, 0); 表示: ブロック; } } @keyframes ドリフト回転 { 0% { 変換: rotateX(0); 表示: ブロック; } 100% { 変換: rotateX(359deg); 表示: ブロック; } } 完全なコードは記事の後のリンクでご覧いただけます この例では、 /* 最小アスペクト比 */ @media (最小アスペクト比: 8/5) { // ... } /* 最大アスペクト比 */ @media (最大アスペクト比: 3/2) { // ... } /* アスペクト比をクリアし、すべての条件が満たされたときに重なりを防ぐために下部に配置します */ @media (アスペクト比: 1/1) { // ... } アプリケーションでの具体的な実装方法は、 <div class="mod_orient_layer"></div> .mod_orient_layer { 表示: なし; 位置: 固定; 高さ: 100%; 幅: 100%; 左: 0; 上: 0; 右: 0; 下部: 0; zインデックス: 999; 背景: #FFFFFF url('landscape.jpg') 繰り返しなし 中央; 背景サイズ: 自動 100%; } @media スクリーンと (最小アスペクト比: 13/8) { .mod_orient_layer { 表示: ブロック; } } 結果: 互換性以下は、この記事で取り上げたいくつかの属性の互換性ビューです。実際の運用プロジェクトでは、互換性の適応に注意する必要があります。 Photoshopのスキルロゴデザイン
外部リンクと参考文献 桜が散るアニメーション フルバージョン https://codepen.io/dragonir/full/WNjEPwW WebKit のダーク モード サポート https://webkit.org/blog/8840/dark-mode-support-in-webkit PWA 技術理論 + 実践分析 https://www.cnblogs.com/yangyangxxb/p/9964959.html H5 PWA テクノロジー https://zhuanlan.zhihu.com/p/144512343 アスペクト比 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@media/aspect-ratio サービスワーカー https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API Element.animate() https://developer.mozilla.org/zh-CN/docs/Web/API/Element/animate 著者: dragonir ブログアドレス: https://www.cnblogs.com/dragonir/p/15041977.html Gokudōゲームのフロントエンド知識に関するこの記事はこれで終わりです。フロントエンド知識ゲームに関する関連コンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMを応援してください。 以下もご興味があるかもしれません:
|
<<: MySQL InnoDB ロック メカニズムの詳細な例
>>: HTML テーブルタグチュートリアル (27): セルの背景画像属性 BACKGROUND
この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...
効果図: 全体的な効果: ビデオ読み込み中: 写真:ステップ1: HTML要素を作成するまず、HTM...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
目次概要コードの実装要約する概要アダプタ パターンは、デザイン パターンの動作パターンのパターンです...
<br />Web ページに音楽を挿入する場合、サフィックスに応じて異なるコードを記述す...
オペレーティング システム win10 MySQL は、公式 Web サイトからダウンロードした 6...
タイムスタンプの差を計算するSQLメソッド概要場合によっては、特定のレコードを時間で検索する必要があ...
フォーム内の読み取り専用および無効な属性1. 読み取り専用:サーバーは、ユーザーがデータを変更するこ...
LinuxにMySQL 5.7.18をインストールする方法1. MySQLをダウンロードします。公...
1. コマンドの紹介bzip2 は、ファイルの圧縮と解凍に使用されます。これは、Linux システム...
1. オブジェクト指向のクラス継承これまでの章では、JavaScript のオブジェクト モデルがプ...
目次序文1. リスナーの基本的な使い方2. リスナー形式3. ページに入るとすぐに監視とディープモニ...
チェックボックスは Web ページで非常によく使用されます。e コマースの Web サイトでもプラッ...
目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...
目次1. はじめに2. 関数型プログラミングとは何ですか? 3. 純粋関数(関数型プログラミングの基...