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

ngx-color-pickerで設定したカラーコードを取得する方法

$
0
0

Angular用のColorPickerのライブラリとして有名なものに ngx-color-pickerというものがあります。
個人的に設定したカラーコードの取り出しに時間がかかったのでメモがてらここに残しておきます。
内容的には薄いので、寂しさを紛らわせるために導入の部分も日本語訳という大義名分のもと書きます。

導入までの手順

インストール

npm install ngx-color-picker --save

モジュールの読み込み

import { ColorPickerModule } from 'ngx-color-picker';

@NgModule({
  ...
  imports: [
    ...
    ColorPickerModule
  ]
})

HTMLに組み込む

<input [(colorPicker)]="color" [style.background]="color"/>

実際の表示はこんな感じ

スクリーンショット 2020-04-01 21.13.18.png

めっちゃ便利ですね。

実際の利用方法としてtext入力欄の色がそのまま変化するのは少し寂しいので、こんな感じにカラーパレットのように利用するんじゃないかなと思います。

qiita.gif

コードは以下のような感じです。
CSSは特に解説も無いのではしょります。

<section>
   <label>
      <input type="radio">
      <p class="color-pallet-custom"
         #ignoredInput
         [style.color]="color"
         [cpIgnoredElements]="[ignoredButton, ignoredInput]"
         [(cpToggle)]="toggle"
         [(cpPosition)]="top-right"
         [(colorPicker)]="color"></p>
   </label>
   <button #ignoredButton (click)="toggle=!toggle" class="btn-primary" type="button" ngbButtonLabel>色選択</button>
  </section>

本題

ここまで設定できて『(゚∀゚)イイ!!』 ってなってたんですけど、どうやって値取り出すんだって結構試行錯誤しました。実際はこんな感じで取り出せます。

コード

<input type="radio" [value]="this.color">

簡単ですね。
例えばreativeformを使って実装する際などはこのような形で値を渡してやることができます。
私がまだまだAngularに慣れていないからかわかりませんが、結構時間がかかってしまいました。
ngx-color-pickerは他にも便利なオプションがあるので、ぜひ参考にしてみてください。

参考

ngx-color-picker
examples
How to Use Color Picker in Angular


JavaScript JavaScriptでポップアップウィンドウを作成

$
0
0

完成品

スクリーンショット 2020-04-01 22.34.48.png
スクリーンショット 2020-04-01 22.35.07.png

HTML

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Document</title><linkrel="stylesheet"href="style.css"><script src="script.js"></script></head><body><inputtype="button"id="btn"value="押す"><!-- 変数に格納 --><divid="box"><!-- 変数に格納 --><pid="close">× <!-- 変数に格納 --><h2>ポップアップ</h2></p></div></body></html>

CSS

@charset"UTF-8";#box{background:#FFF;border:1pxsolid#333;box-shadow:010px10px#999;display:none;/*! id要素に対してdisplay:none  */font-family:serif;padding:10px;position:relative;text-align:center;width:200px;}#box>#close{background-color:#EEE;color:#333;cursor:pointer;height:30px;line-height:30px;margin:0;position:absolute;right:1px;text-align:center;top:1px;width:30px;}#box>#close:hover{background-color:#F9F9F9;color:#999;}#btn{background-color:rgb(20,114,236);border:0;color:#FFF;cursor:pointer;padding:5px20px;}#btn:hover{color:rgb(20,114,236);border:1pxsolidrgb(20,114,236);background-color:rgb(255,255,255);}#btn:active{background-color:#4A4;}

JavaScript

window.onload=function(){//window の load イベントに対応するイベントハンドラletbox=document.querySelector("#box");//id要素取得letbtn=document.querySelector("#btn");//id要素取得letclose=document.querySelector("#close")//id要素取得letboxstyle=box.style;//boxのstyle値をboxstyleに格納btn.onclick=function(){//btnがクリックされた時動かす関数if(boxstyle.display==="block"){boxstyle.display="none";}else{boxstyle.display="block";}};close.onclick=function(){//closeがクリックされた時の関数boxstyle.display="none";};}

画像をトリミングできる object fitプロパティが使える件

$
0
0

『HTMLで表示する画像のサイズを調節したい! でも、縦横の比率はそのままにしたい!』

というケースは多いと思います。
そんな時はobject-fitプロパティを使いましょう。

元の画像がこんな感じだとします。

1.png

この画像を縦300px横500pxで埋め込むとします。

img {
  height: 300px;
  width: 500px;
}

2.png

サイズは合いましたが、比率は歪んでしまっています。
早速ここでobject-fitを使ってみます。

img {
  height: 300px;
  width: 300px;
  object-fit: cover
}

3.png

比率が維持されつつ、枠に収まっています。

今回はカバーを指定しましたが、他にも,
fill, contain, none, scale-downなんかがあります。

見てもらったほうが早いんじゃないかと個人的には思います。

fill

文字通り画像がはめ込まれています。

img {
  height: 300px;
  width: 500px;
  object-fit: fill;
}

4.png

contain

元の画像の縦横の比率を維持したまま、左右に余白が生じています。

img {
height: 300px;
width: 500px;
object-fit: contain;
}

5.png

none

指定サイズとは関係なく画像が表示され、残りはトリミングされています。

img {
  height: 300px;
  width: 500px;
  object-fit: none;
}

6.png

scale-down

画像が指定より大きい場合はcontain,小さい場合はnoneが適用されます。
この場合はnoneですね

img {
  height: 300px;
  width: 500px;
  object-fit: scale-down;
}

7.png

今回はobject-noneについてまとめてみました。
まだまだQiitaに慣れず、ブログに結構時間が掛かってしまいます、、、(そもそもブログというものを書く事自体が2回目)

今度はもう少しペースをあげて、アウトプットの効率を高めていきたいものです。

ライブ配信者向けレイアウト構築システム「StreamControl」の使い方

$
0
0

StreamControlの概要

何が出来るの

image.png
(画像は第2回SplashGo!より)
ゲーム大会などでよく見るこういう画面レイアウトを作れるようになります。

強み

一般の配信ソフトでテキストを直書きすると……

  • テキストを書き換えるまでに時間がかかる
  • 入力ミスが起こりやすい
  • 入力内容を用意した別資料を見ながら入力しなければならない

StreamControlを使えば……

  • 瞬時にテキストを切り替えることが可能
    • 上記画像だと、チーム名+選手名4人という合計5要素を瞬時に切り替えることが可能です。
    • 切替可能な要素数は設定により可変です。例えば、各選手のツイッターアカウントも出したいといった要件も可能です。
  • 切り替え対象のIDを選ぶだけなので入力ミスが起こりづらい
    • 上記画像だと、それぞれのチームIDを選ぶだけで切り替えが可能というイメージです。
  • 入力内容は事前に用意したものを参照するので、別資料が必要ない

また、後述するようにhtml&css&javascriptによって構築されています。
従ってこれらの技術で実現可能なことなら、何でも自由にレイアウトを組むことが出来るという点も強みかと思います。

仕組み

配信画面はhtmlでできている

image.png
こんな感じで、配信レイアウトにしたい画面をhtmlで構成します。
最低限チーム名の部分などをdivで指定するだけでできます。

image.png
チーム名などのテキスト部分はjavascriptを動かして取得・表示します。
htmlとは別のxmlファイルに書かれている内容を取得しています。

image.png
xmlファイルの中身はシンプルにこんな感じです。
となると、チーム名などを切り替えるためにはxmlファイルの中身を書き換えればいいということになります。
ここでようやくStreamControlが登場します。

StreamControlと連携させる

image.png
StreamControl側の画面はこうなっています。
ここで保存ボタンをクリックすると、StreamControlに入力している内容を元に先述のxmlファイルが上書きされるという仕組みです。

image.png
チームIDは前方一致で候補を出してくれるので選びやすくなっています。

実際に選んでいる様子を動画で確認してみて下さい。
StreamControl-2020-04-02-08-31-37.gif
動画だと候補が出ている部分が映りませんでしたが、ラクに切り替え出来ているのが分かるかと思います。

image.png
データソースはこのようなcsvファイルになっています。
1列目のIDを指定することで、その行に対応した各列の値をセットするイメージです。

配信ソフトでhtmlを読み込む

ここまで出来れば、あとは各種配信ソフトでhtmlファイルを読み込むだけです。
レイアウト上の情報を更新したくなったら、StreamControlを操作して保存ボタンを押すだけです。
配信ソフト側は何もいじる必要はありません。更新されたhtmlを自動で読み込み直してくれます。

実際に作ってみよう

ダウンロード

配布元はこちらです。
http://farpnut.net/streamcontrol/

ですが、有志の方が公開している、既に組み上がっているレイアウトを手直しするのも良いでしょう。
各種レイアウトは日本 StreamControl 学会で公開されています。
その他、StreamControlでググることでも各種レイアウトを探すことが出来るでしょう。

設定

StreamControlのレイアウト

StreamControlの画面上にテキストボックスやボタンを置いていきましょう。
image.png
設定画面を開き、Layout Fileでxmlファイルを指定します。
このxmlファイルに書かれた内容の通りにテキストボックスなどが配置されます。

image.png
xmlファイル側にはこのように記述します。

  • layoutタグで全体を囲む
  • 必要な数だけtabタグを作る
  • tabタグの中にlabellineEdit(テキストボックス)を配置する
    • lineEditid属性と、html側のidを揃えると良さげです
  • dataSet属性にcsvファイルを指定する
  • あとはいい感じにdataField属性やmaster属性を設定

仕様はドキュメントで確認できます。
http://farpnut.net/streamcontrol/layout-documentation/

いい感じに出来たらcsvを作って動作確認してみてください。
出力するxmlファイルはstreamcontrol.xmlとなります。

javascriptの設定

html及びcssはいい感じに作ってください。

xmlから要素を取得してhtml内に反映させるところを解説します。
基本的な構造は次のようになります。

  • init()の中にやりたいことを全部書く
    • xmlファイルの変更を検知するため、setIntervalで定期的に読みに行く
  • bodyタグのonload属性にinit()を指定する

全部載せると煩雑になるので、主要な部分を載せます。

varxmlDoc;varxhr=newXMLHttpRequest();vardoUpdate=false;functioninit(){xhr.overrideMimeType('text/xml');vartimeout=this.window.setInterval(function(){pollHandler();},250);$('#round').html('');...//その他初期化$.play();}functionpollHandler(){loadData();// htmlの中身を更新すべきかどうか、loadDataしたときのtimestampを使って判断しますif(timestamp!=timestampOld){doUpdate=true;}if(doUpdate){updateBoard();}}functionloadData(){xhr.open('GET','streamcontrol.xml');xhr.send();xhr.onreadystatechange=function(){xmlDoc=xhr.responseXML;round=getValueFromTag(xmlDoc,'round')// その他、タグを指定してxmlから値を取得timestampOld=timestamp;timestamp=getValueFromTag(xmlDoc,'timestamp');}}functiongetValueFromTag(xmlDoc,tag){if(xmlDoc.getElementsByTagName(tag).length!=0){if(xmlDoc.getElementsByTagName(tag)[0].childNodes.length==0){return'';}else{returnxmlDoc.getElementsByTagName(tag)[0].childNodes[0].nodeValue;}}else{return'';}}functionupdateBoard(){// xmlから取得した値でhtmlの各要素を上書き$('#round').html(round)...$.play();doUpdate=false;}
<bodyonload="init()">
  ...
</body>

javascriptが動けば、StreamControlが出力するxmlと連携してレイアウトの更新が出来るようになると思います。
フロントエンドメッチャデキル人が何かスゴいレイアウトを作ってくれたらいいと思います。

まとめ

システム模式図

IMG_20200402_095304_waifu2x_art_noise2_tta_1.png
StreamControlのシステム全体を模式図にするとこんな感じになるかと思います。
用意するものが少し多くて大変ですが、使いこなせれば配信する上で非常に便利です。
お読み頂きありがとうございました。

分からないところなどあればコメント頂けると幸いです。この記事は随時更新してより良いものに仕上げていきたく思います。

参考にしたのとか

先駆者の方々のお力添えによって少しでもStreamControlを使えるようになりました。ありがとうございます。

StreamControl テンプレート 2019年版 配布
http://shigaming.com/2018/11/30/streamcontroltemplate2019/

OBSでのStream Control テンプレートの使い方(SHIG 仕様2019版)
https://pick-up-space.com/streamcontrol01/

ソフトの存在および基本的な使い方はがまのあぶらさんに教わりました。
https://twitter.com/gamanoabura_nsb

ちなみに:上記SHIGのレイアウトでは国旗を表示させることも出来ます。
こちらはhtmlに表示したいテキストをxmlに出力したのと同様に、表示したい国旗画像ファイルのファイル名をxmlに出力してあげてjavascript側でimgタグのsrc属性を書き換えてあげればできます。
国旗画像のアセットはネット上を検索すれば見つけられます。

写真の右上に三角形のラベルをつける

$
0
0

1 写真の方にラベルをつける方法

今回は、下の写真のような、imageの肩に斜めの装飾をつける方法を学んだので共有したいと思います。

代替テキスト

2 必要な記述

今回は簡単なサンプルとして要素を書いています。

<hamlの記述>

.image-box
 = image_tag @image.image
 .triangle-box
  sold              /*sold outの意味*/

hamlの記述は以上です。
ポイントは装飾したい写真を表示させる記述のしたに、ボックスを追加することです。
細かいことは、cssでいじっていきます。

<scssの記述>

.image-box {
 width: 100px;                       /*適当にセットしてください*/
 height: 100px;                      /*適当にセットしてください*/
 position: relative;
 overflow-x: hidden;       ←ポイント①
 = image_tag @image.image
 .triangle-box{
  position: absolute;                  /* 必須(絶対配置にするため) */
  top: -15px;                          /* 掲載位置の調整(座標) */
  left: -130px;                        /* 掲載位置の調整(座標) */
  background-color: rgba(255,0,0,0.4);    /* 背景色の調整(透けるように調整) */
  padding: 80px 40px 0 40px;           /* サイズ調整:配置 */
  width: 140px;                        /* サイズ調整:横幅 */ 
  height: 120px;                       /* サイズ調整:高さ */
  font-size: 1em;                      /* サイズ調整:文字 */
  font-weight: bold;
  font-size: 50px;                     /* サイズ調整:行高 */
  transform: rotate(-45deg);   ←ポイント②   /* 傾きの度合い */ 
  transform-origin:top;       
  text-align: center;
 }
}

ポイントは二つ
① はみ出した部分が表示されないようにする
② 写真の肩に乗せたい要素を斜めにする

overflow-x: hidden;

これがないと、要素が表示されます。
(今回はうまく表示させることができませんでした。検証ツールで[overflow-x: hidden;]を非適用にしても効きませんでした。)

移動させる要素(.triangle-box)の親要素(.image-box)に記述してください。
代替テキスト

あとはきれいに見えるように微調整を繰り返してください。

見栄えがよくできる割りに作業は簡単なのでぜひぜひ試してみてください。

最後まで見てださり、ありがとうございました。

参考記事

https://www.nishishi.com/css/round-caption-img.html
https://haniwaman.com/background-skew/

ハンバーガーメニューの作成

$
0
0

スクリーンショット 2020-04-02 18.30.51.png
スクリーンショット 2020-04-02 18.30.58.png

HTML5

<body><!-- ハンバーガーボタン --><divclass="ham"id="ham"><!-- ハンバーガーボタンのライン --><spanclass="ham_line ham_line1"></span><spanclass="ham_line ham_line2"></span><spanclass="ham_line ham_line3"></span></div><!-- メニューの中身 --><divclass="menu_wrapper"id="menu_wrapper"><divclass="menu"><ul><li><ahref="#1"style="color: #FFF;">メニュー1</a></li><li><ahref="#2"style="color: #FFF;">メニュー2</a></li><li><ahref="#3"style="color: #FFF;">メニュー3</a></li></ul></div></div>

CSS

.ham{position:relative;width:40px;height:40px;cursor:pointer;background-color:rgba(0,0,255,0.911);}/* ハンバーガボタンのライン */.ham_line{transition:all0.3s;position:absolute;left:10px;width:20px;height:2px;background-color:#FFF;}.ham_line1{top:10px;}.ham_line2{top:18px;}.ham_line3{top:26px;}/* Javascriptでクリックイベントが発火した後の処理 ハンバーガボタンのライン */.clicked.ham_line1{transform:rotate(45deg);top:20px;}.clicked.ham_line2{width:0px;}.clicked.ham_line3{transform:rotate(-45deg);top:20px;}/* メニューの表示 */.menu{position:fixed;left:-400px;width:300px;height:300px;background-color:rgba(0,0,255,0.849);transition:all0.5s;color:#FFF;}.clicked.menu{left:8px;}

JavaScript

constham=document.querySelector('#ham');constmenu_wrapper=document.querySelector('#menu_wrapper')// addEventListener さまざまなイベント処理を実行することができるメソッドham.addEventListener('click',function(){// classListとは、対象要素に設定しているクラスを配列のように扱えるオブジェクトham.classList.toggle('clicked');menu_wrapper.classList.toggle('clicked')});

addEventListener

https://www.sejuku.net/blog/57625

classListとは

https://techacademy.jp/magazine/22308

【曖昧さ回避】ブラウザレンダリングにおける「ファイルの読み込み」が意味するものとは

$
0
0

「ファイルの読み込み」とは

ブラウザレンダリングの仕組みを解説するサイトや書籍には、「ファイルを読み込んで〜」のような説明が多くあります。
自分がレンダリング工程を勉強しているときに、この「読み込み」という言葉がファイルのDownload(転送)を指すのか、ファイルのParse(解析)を指すのか、はたまたレンダリング全体のことを言っているのか、説明する場面によって意味が変わる曖昧な言葉だなーと感じていました。

ここではブラウザレンダリングの仕組みについて、1.HTMLのみ、2.HTMLとCSS、3.HTMLとJavaScript、4.HTMLとCSSとJavaScriptの4パターンに分けて、レンダリングフローに定義された言葉に当てはめながら説明していきたいと思います。

(検証環境:Google Chrome バージョン: 80.0.3987.87)

ブラウザレンダリングの仕組みの大枠

ブラウザレンダリングのフローは大きく4つの工程に分けられ、それぞれの工程は更にいくつかの細かい工程に分けられます。
(参考:Webフロントエンド ハイパフォーマンス チューニング -久保田 光則 (著)
ブラウザレンダリングの流れ.png

  • Loading(データのダウンロード・解析)
    • Download
    • Parse
  • Scripting(JSの実行)
  • Rendering(スタイルの計算、当て込み)
    • Calculate Style
    • Layout
  • Painting(描画)
    • Paint
    • Rasterize
    • Composite Layers

図を見ていると全ての工程がシリアル(直列)に進んでいくように誤解しやすいのですが、実際はそうではありません。
レンダリングエンジンがページ表示を最適化する中で、部分的にでも準備ができた段階で、都度次の工程に進むこともあります。

本記事では主にLoading(Download、Parse)Scriptingの工程に関して、ファイルごとにどのように影響を及ぼし合い、レンダリングの処理順が決まっているかについて説明します。

RenderingPaintingの工程を含むブラウザレンダリング全体の仕組みについては以下記事が詳しいです。
フロントエンジニアなら知っておきたいブラウザレンダリングの仕組みをわかりやすく解説! | LeapIn

1.HTMLのみ

はじめに外部ファイル「読み込み」記述が一切ない純粋なHTMLファイルについて、
ブラウザ検索バーにURLを入力し、HTTPプロトコルで通信してページを表示する場合を考えます。
(参考:ネットワークやTCP/IPやHTTPの基本(初学者向け) - Qiita

レンダリングの工程としては、まずHTMLDownloadが始まりますが、
ここでのポイントは、サーバからHTMLファイルなどのリソースが転送される手法は0か1の転送ではなく、
セグメントに分割しながら転送されるということです。
(どのくらいまとめて送るのかについてはサーバサイドで制御するようです)

前提として、ブラウザはUX向上のため画面に何も表示されていない時間を短くするように動きます。
よって全てのHTMLDownloadが完了していなくても、転送されたHTMLセグメントを元にParse(DOMツリー構築)や後続の処理が進み、準備ができたDOMから画面描画が始まります。

スクリーンショット 2020-03-29 2.12.07.png
上記はChrome DevToolsのNetworkパネルであり、一つのHTMLファイルをダウンロード完了するまでの解析図です。(テスト用にサーバサイド(PHP)でファイルの転送や解析速度を調整しています)

Waiting(TTFB:Time To First Byte)とはファイル転送リクエストを送ってからクライアント側で最初のデータを受け取るまでにかかる時間(主にサーバサイドの処理時間)であり、Content Downloadとは最初のデータを受け取ってから全てのデータを受け取りきるまでにかかる時間です。

解析グラフによるとContent Downloadに合計2sかかっていますが、その間も転送されてきているデータを元に別の処理(Parse、Rendering、Painting)が都度進んで描画が始まっており、それは同Performanceパネルで解析することができます。↓
スクリーンショット 2020-03-29 19.13.47のコピー.png
データを受け取る(Receive Data)たびに、HTMLParse(DOM構築)のフェーズを経て、Composite Layersまでの描画工程を完了していることが分かります。

このように準備ができたところから都度描画が行われることで、First Paint(画面に最初になにかしらが描画されタイミング)や、First Meaningful Paint(画面に最初にユーザーに意味のある表示がされたタイミング)などの表示タイミング差が存在します。

参考:Ace the Lighthouse Audit: Best Practices for Consistent Interactivity | Lumavate

2.HTMLとCSS

head要素の中のlink要素に外部CSS「読み込み」記述がある場合を考えます。

HTML
<!DOCTYPE html><html><head><linkrel="stylesheet"href="style.css"/></head><body><!-- bodyの中身 --></body></html>

CSSのDownload

この場合も、まずHTMLDownload、Parseが始まり、解析途中でlink要素を見つけた段階でCSSDownloadが始まります。↓
スクリーンショット 2020-03-29 14.07.42.png
CSSのDownloadはHTMLのParseをブロックしないので、CSSDownload中もHTMLParseが並行して進みます。
そしてその先に再び外部CSS「読み込み」記述ががあれば、同時に複数のCSSDownloadが始まります。

ただし、モダンブラウザでは(同じドメインの)TCP接続は同時に6本までという制限があるため、7本目以降の接続は前の接続の終了を待ってからとなります。
スクリーンショット 2020-03-29 14.45.11のコピー.png
見ての通りこれではダウンロードしたいファイルが多いほどページ表示速度が遅くなってしまいます。

そのため、対応策としてファイルを可能な限りまとめてリクエスト必要数を抑えたり、CDNなどを利用してあえて別ドメインから接続することでスループットを上げたり、一つのTCP接続で同時に複数のリクエスト/レスポンスを処理できるhttp/2プロトコルで通信するなどの手法が存在します。

参考:そろそろ知っておきたいHTTP/2の話 - Qiita

CSSのParse

CSSもHTMLと同様にDownloadの次の工程として、Parse(CSSOMの構築)の工程があります。
考慮すべき注意点は以下です。

  • CSSParseは見かけ上はHTMLParseと並行して行われる。
  • HTMLは描画工程に進もうとするDOMの、直前までに記載されているCSSのLoading(Download、Parse)が完了しない限り、Renderingフローに進まない。(描画処理が行われない)

HTMLParseCSSParseはどちらもレンダリングエンジンのmainスレッドで行われますが、mainスレッドでは同時に一つの処理しか行えないため、それぞれの処理が同時に走ることはありません。
ですが、HTMLParseのアイドル時間などにCSSParseが進むため、見かけ上は2つが並行して行われているように見えます。
(そもそもCSSParseにかかる時間はブラウザレンダリング全体の時間からすると極めて短く、議論に上がりにくい部分のようです。)

また、CSSのLoadingが進行中の場合は、たとえHTMLParseが先に完了していてもRenderingなどの次の工程に進まず、結果として画面描画が行われません。

これはブラウザがFOUCFlash of Unstyled Contentの略。スタイルがついていないコンテンツが一瞬表示されること)を防ぐために、CSSParseの完了を待ってスタイルが適応された画面描画を行おうとするためです。
スクリーンショット 2020-03-29 15.35.54のコピー.png
上記Performanceパネル解析図を見ても、Finish LoadingCSSParseの完了)まで、Calculate StyleなどのRendering工程に進んでいない(画面描画が行われていない)ことが分かります。

3.HTMLとJavaScript

以下のようにhead要素の中にscript要素を記述して、外部JavaScriptファイルを「読み込む」場合を考えます。

HTML
<!DOCTYPE html><html><head><script src="main.js"></script></head><body><!-- bodyの中身 --></body></html>

JSのDownloadとScripting

HTMLParseが始まってscript要素に到達するとJSのDownloadが始まります。
その時に重要なポイントが、JSのDownloadとScripting(実行)はHTMLParseをブロックするということです。

一度JSのDownloadが始まると、ダウンロードしたJSのScripting工程が完了しない限り、それ以降のHTMLParseが行われません。
これが、JSの記述はbodyの最後に記述するべきと言われる理由の一つです。
スクリーンショット 2020-03-29 20.29.02のコピー.png
上記図より、Send RequestJSDownloadが始まると、Evaluate Script工程が完了するまでHTMLParseが行われていないことが分かります。

async属性とdefer属性

script要素によるJSの「読み込み」記述はそれ以降のHTMLParseをブロックしますが、script要素asyncdeferの属性をつけることによってJSのDownloadを非同期に行い、HTMLParseと同時に処理することができます。

HTML
<script src="main.js"async></script><!-- もしくは --><script src="main.js"defer></script>

以下は先程と同じ記述で、defer属性を使用したときのPerformanceパネルの解析結果です。
スクリーンショット 2020-03-29 20.34.04のコピー.png
JSのDownloadが開始(send Request)しても、HTMLParseがブロックされずに先の工程に進み、最終的にComposite Layersまで完了して画面描画が行われているのが分かります。
その後JSのDownloadが完了した段階で、Scripting(Evaluate Script)処理が行われています。

参考:scriptタグに async / defer を付けた場合のタイミング - Qiita

4.HTMLとCSSとJavaScript

CSSとJavaScriptの両方の「読み込み」記述を書く場合です。
以下のようにlink要素の直下にscript要素を入れてみます。

HTML
<!DOCTYPE html><html><head><linkrel="stylesheet"href="style.css"/><script src="main.js"></script></head><body><!-- bodyの中身 --></body></html>

CSSDownloadHTMLParseをブロックしないため、HTMLParsescript要素の記述に到達しJSのDownloadが始まります。
先程「HTMLは直前までのCSSLoading(Download、Parse)が完了していない限り、Renderingフローに進まない」と説明しましたが、実は同様にJSも直前までのCSSLoading(Download、Parse)が完了していない限り、Scriptingの工程に進まない性質があります。

つまりこの場合、CSSよりもJSのほうが速くDownloadが完了したとしても、CSSParseが完了するまでScriptingが待機状態になるということです。
スクリーンショット 2020-03-29 16.35.27のコピー.png
↑JSのほうがCSSよりも1s速くDownloadが完了していますが、
スクリーンショット 2020-03-29 16.34.37のコピー2.png
↑CSSのLoading(Download、Parse)完了を待ってから、Scripting(Evaluate Script)処理が実行されていることが分かります。

参考:DOMContentLoaded周りの処理を詳しく調べてみました - Qiita

ブラウザのプリロード機能

以下のようにJSの「読み込み」記述をCSSよりも前に書いた場合を考えます。

HTML
<!DOCTYPE html><html><head><script src="main.js"></script><linkrel="stylesheet"href="style.css"/></head><body><!-- bodyの中身 --></body></html>

defer属性async属性がついていないscript要素による外部JSファイルの「読み込み」なので、JSのDownload、Scriptingが完了するまでそれ以下のHTMLParseが進まない、つまりCSSDownloadも進まないはずです。

しかし、モダンブラウザではその限りではありません。
NetWorkパネルを見てみると、JSとCSSのDownloadが同時に行われていることが分かります。
スクリーンショット 2020-03-29 21.22.31のコピー.png
実はChromeなどのモダンブラウザには、HTMLParseが進んでいない部分についてもDownloadが必要な記述がないか確認し、もしあれば事前にそのファイルのDownloadを開始する機能があります。(Preload Scanner

よってこの場合も、ブラウザはJSのDownload中にその先にあるCSSの「読み込み」記述を読み取り、CSSDownloadも同時に進めることでレンダリングを高速化しているのです。

※Preload Scanner機能で事前処理できるのはDownloadの工程だけです。ParseScriptingの工程は本来のレンダリングフローに沿って行われます。

参考:rel="preload"を極めるために必要な2種類のプリロード機能 | Raccoon Tech Blog

まとめ

  • HTMLはセグメントごとにDownloadが行われ、都度Parseなどの先の工程に進む
  • CSSのDownloadHTMLのParseをブロックしない
  • CSSのParseは見かけ上はHTMLParseと並行して行われる
  • HTMLは直前までのCSSLoading(Download、Parse)が完了していない限り、Renderingの工程に進まない
  • JSのDownloadScripting(実行)HTMLのParseをブロックする
  • JSも直前までのCSSLoading(Download、Parse)が完了しない限り、Scriptingの工程に進まない

誤った解釈等ございましたら、ご教授お願いいたします。。

参考

Vue.js でインクリメンタルサーチ

$
0
0

インクリメンタルサーチとは

インクリメンタルサーチ(英語: incremental search)は、アプリケーションにおける検索方法のひとつ。検索したい単語をすべて入力した上で検索するのではなく、入力のたびごとに即座に候補を表示させる

完成品

スクリーンショット 2020-04-02 22.40.28.png

スクリーンショット 2020-04-02 22.40.38.png

HTML

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>インクリメンタルサーチ</title><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><linkrel="stylesheet"href="style.css"></head><body><divid="app"><!-- v-model は任意の form 要素にある value、checked、
または selected 属性の初期値を無視します。input または 
textarea は常に、信頼できる情報源として Vue インスタンスを扱います。
コンポーネントの data オプションの中で JavaScript 側で初期値を宣言する必要があります --><inputtype="text"placeholder="検索"v-model="search"><selectv-model="sort"><optionvalue="">ソート無し</option><optionvalue="asc">昇順</option><optionvalue="desc">降順</option></select><transition-grouptag="ul"><liv-for="item in sortedList"v-bind:key="item.id">
                {{ item.text }}
            </li></transition-group></div><script src="main.js"></script><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></body></html>

JS

newVue({el:"#app",data:{search:'',sort:'',list:[{id:1,text:'Python'},{id:2,text:'Ruby'},{id:3,text:'PHP'},{id:4,text:'JavaScript'},{id:5,text:'Java'},{id:6,text:'Go'},{id:7,text:'C'},{id:8,text:'C#'},{id:9,text:'Rails'},{id:10,text:'Django'},{id:11,text:'MySQL'},{id:12,text:'Vue.jst'},{id:13,text:'react'},{id:14,text:'Docker'},{id:15,text:'unity'},{id:16,text:'jQuery'}]},computed:{filteredList:function(){returnthis.list.filter(function(item){returnitem.text.indexOf(this.search)>-1},this)},sortedList:function(){varcopy=this.filteredList.slice()if(this.sort==='asc'){returncopy.sort(this.comparatorAsc)}elseif(this.sort==='desc'){returncopy.sort(this.comparatorDesc)}else{returncopy}}},methods:{comparatorAsc:function(itemA,itemB){if(itemA.text<itemB.text){return-1}elseif(itemA>itemB.text){return1}else{return0}},comparatorDesc:function(){if(itemA.text>itemB.text){return-1}elseif(itemA<itemB.text){return1}else{return0}},}});

CSS

body{font-family:sans-serif;}input,select{padding:2px8px;font-size:inherit;vertical-align:middle;}ul{position:relative;margin-top:6px;padding:0;width:300px;list-style:none;}li{margin:0;padding:10px;border-bottom:1pxsolid#ddd;}.v-move{transition:transform300msease-out;}.v-enter-active{transition:300ms;}.v-enter{opacity:0;}.v-enter-to{opacity:1;}.v-leave-active{transition:300ms;}.v-leave{opacity:1;}.v-leave-to{opacity:0;}

【カンタン】Vueで縦に自動伸縮するtextareaの作り方 | How to make auto resizing by Vue.js

$
0
0

english ver

インターネッツで調べてみても中途半端なtextareaしか出てこなかったので、備忘も兼ねた記事です。

伸びるけど縮まないとか、縮むけど1文字いれるごとに2pxずつしか縮まないとか、意味なくない!?!?!?!?!?!?

んおお!?!?!?!?

まずは結果

ezgif-6-b2be62c1e8d5.gif

うおおおおおおおお
うおおおおおおおお
うおおおおおおおお
うおおおおおおおお
うおおおおおおおおうおおおおおおおお
うおおおおおおおお
うおおおおおおおおうおおおおおおおおうおおおおおおおお
うおおおおおおおお
うおおおおおおおお
うおおおおおおおお

コード

今気づいたけどマークダウンの候補にvuejsってある。。
便利すぎない?

業務で書いたコードからいらないやつ消した感じなので、このまま動かなかったらごめんなさい。
編集リクエスト送っていただければーーー

MyTextarea.vue
<template><textareaclass="textarea bg-white":style="textareaStyle":placeholder="placeholder":value="value"@input="handleInput($event)"/></template><scriptlang="ts">importVuefrom"vue"exportdefaultVue.extend({props:{placeholder:{type:String,default:""},value:{type:String,default:''}},data(){return{textareaHeight:100// デフォルト値いれとく。minHeightといっしょでよい。borderあるのでちょっとずれる}},computed:{textareaStyle():object{// 動的にtextareaのheightをいじれるようにしているreturn{height:`${this.textareaHeight}px`}}},methods:{asynchandleInput(event:any){// 入力されるたびによばれる。anyなのはゆるして。。。this.$emit('input',event.target.value)// これは親に伝えるためだけ。this.textareaHeight=0// ミソ。一旦textareaのheightを0にしちゃうawaitthis.$nextTick()// さらにミソ。ここで待たないとDOMの更新前に下のコードが走って変な挙動になる// heightが0になった瞬間textareaはminHeight: 100になる// 入力済み文字列の高さが100を超えたら、scrollHeightが必要な分だけ大きくなる = それをheightにしちゃえばOK!this.textareaHeight=event.target.scrollHeight}}})</script><stylelang="stylus"scoped>
.textarea-container {
  width: 100%;
}

.textarea {
  width: 100%;
  min-height: 100px; // ここはお好み。変えるならdata()の値も変えるとよいよ
  border: 1px solid #D9D9D9
  border-radius: 4px;
  padding: 5px 12px;

  &::placeholder {
    color: #D9D9D9
  }
}
</style>

TL;DR

this.$nextTickがミソなんじゃぞ。

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

$
0
0

100日チャレンジの279日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
279日目は、

CSS_初期設定【SKILLHUB学習まとめ④】

$
0
0

Webサイト制作実践講座(後編)で行ったCSSの初期設定をメモします。

body{margin: 0;background: #ccc;font-size: 12px;}h1,h2,h3{margin-top: 0;}#wrapper {background: white;width: 960px;margin: 0auto;}

*body → marginは0にして全体の余白をなくす(必要なら後でつける)
*タイトル → トップの余白をなくす(必要なら後でつける)
*wrapper → margin: 0 auto; で中央揃えにする

CSS:背景の一部をぼかす表現

$
0
0

See the Pen Frosted glass background by Kazuyoshi Goto (@KazuyoshiGoto) on CodePen.

テキストの乗っているレイヤーを、擦りガラスで透かしたような表現を作っています。

CSS(Sass)

HTMLはごくシンプルなのでCSSの要点箇所について。

body,section:before{background:url("***.jpg");background-position:center;background-size:cover;background-attachment:fixed;}section:before{content:"";z-index:-1;-webkit-filter:blur(4px);-ms-filter:blur(4px);filter:blur(4px);position:absolute;width:100%;height:100%;margin:0;padding:0;}

まず bodysection:beforeに同一の背景画像を設定しています。

次に section:beforeのみにCSSフィルター filter:blurを設定しぼかしています。

sectionではなく section:beforeに背景を設定しているのが要です。

sectionblurを設定するとテキストなど中の要素すべてがぼけてしまうため、 section:beforeにぼかした背景を設定し section本体の後ろに重ねる形にする手法で実現しています。

100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1

$
0
0

本日はCSSについてです。

HTMLからの続きになるので
そちらがまだの方はこちらをどうぞ

HTMLにの基礎1
HTMLにの基礎2
HTMLにの基礎3
HTMLにの基礎4

CSSとは

CSS(Cascading Style Sheets)
カスケード・スタイル・シートなどと呼び、ウェブページのスタイルを指定するための言語です。

HTMLなどで作成されるウェブページにスタイルを適用する場合には、
スタイルシート言語の1つであるCSSが一般的に利用されており
CSSは、HTMLと組み合わせて使用します。

HTMLがウェブページ内の各要素や情報構造を定義するのに対し
CSSではそれをどのように装飾するかを指定します。

例えば、色・サイズ・レイアウトなどの表示スタイルを指定することができます。

HTMLは情報構造を定義するための言語であるので
HTMLでは文書構造のみを定義して
スタイルについてはスタイルシートで指定することが推奨されています。

CSSを適用する

HTML内で文書にスタイルシートを適用するには以下の方法があります。

1.<link>要素で外部CSSファイルを呼び出して適用する
2.<style>要素で文書単位に適用する
3.要素にstyle属性を追加して局所的に適用する

外部CSSファイルを呼び出して適用する

スタイルシートを記述したCSSファイルをHTMLファイルとは別で用意して
HTML文書の中で呼び出して適応させる方法です。

先ずはCSSファイルを用意しましょう。

以下のソースコードを書いたファイルを用意します。

sample.css

p {color:red; }

sample.html

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="sample.css">
  </head>
  <body>
    <p>こんにちは、今日は能天気ですね</p>
  </body>
</html>

ファイルは同じディレクトリに配置します。

デスクトップなどで行う場合は両方のファイルをデスクトップにおきます。
スクリーンショット 2020-04-03 18.11.29.png

用意できたらブラウザーでHTMLを見てみましょう。

スクリーンショット 2020-04-03 18.12.26.png

CSSファイルに書かれたスタイルは
p {color:red}
となっています。

意味は pタグの色を red にするという意味です。
ソースコードに間違いがなければ文字が赤色になるはずです。

こうしてCSSファイルを分離しておくと
デザインと文書構造を切り離すことができ、複数人で共同開発がおこえます。

style要素で文書単位に適用する

外部からCSSファイルを適応せず
直接HTMLの中にスタイルを書き込んでしまう方法です。

head要素にスタイルシートを書き込んでおきます。

スタイルシートの書き方は
<style type="text/css">スタイル</style>
となります。

sample2.html

<html>
  <head>
    <style type="text/css">
      <!--
      p {color:red; }
      -->
    </style>
  </head>
  <body>
    <p>またまた能天気</p>
  </body>
</html>

用意できたらブラウザーでHTMLを見てみましょう。

スクリーンショット 2020-04-03 18.24.26.png

一人で開発する場合であればよく用いられる手法です。

ソースコード書く際にファイルを切り替えなくて済むので
こちらの方が楽な場合がありますが
ある程度慣れたら、CSSファイルに分離する方法も覚えておきましょう。

要素にstyle属性を追加して局所的に適用する

head要素にスタイルを書かずにタグの中で
直接スタイルを指定する方法です。

書き方は
<タグ style="スタイル">

sample3.html

<html>
  <head>
    <meta name="Content-Style-Type" content="text/css">
  </head>
  <body>
    <p style="color:red; ">能天気です!!</p>
  </body>
</html>

結果は

スクリーンショット 2020-04-03 18.31.25.png

style属性によるスタイル指定は、部分的にスタイル指定する際などには便利ですが
HTMLソースが複雑になり管理が複雑になりがちです。

効率の良いスタイル管理を目指す場合には、 CSS部分を外部ファイル化しましょう。

CSSの書き方

CSSでスタイルを指定する際には、どの部分にどんなスタイルどんな感じで
適応させるのかを指定します。

CSSの各部分には名称がついており、基本的なCSSの書き方は
セレクタ {プロパティ名:値;}
となります。

セレクタ {プロパティ名:値;}{から}で囲んだ部分を宣言ブロック(declaration block)
プロパティ名と値を:(コロン)で1つにした部分をスタイル宣言(declaration)と呼びます。

セレクタ(selector)

セレクタはCSSを適応させる対象のことです。

プロパティ(property)

プロパティは適応するスタイルの種類のことで、様々な種類があります。

例えば colorでは色を指定することができます。

値(value)

プロパティの値です。プロパティに対して様々な値が用意されています。

複数のスタイルを指定する

一つのセレクタにスタイルを複数指定したい場合は
1つのスタイルの宣言を;で区切ります。

p {color:red; line-height:15px;}

コメントの書き方

コメントは一時的にCSSを無効にしたり、CSSソース内にメモを残す際などに使用します。
/*から*/で囲んだ範囲はコメントとなります。
コメント部分はブラウザには無視されます。

コメントの例:

p {color:red; line-height:2;}    /*段落を赤くして行の高さを2倍にする*/
/*
コメントは複数行にすることも可能です。
*/

そのほか

大文字、小文字どちらでも区別しませんが
小文字に統一しておいた方が良いでしょう。

まとめ

一般的なCSSの使い方と書き方を押さえておこう。

明日は色々なスタイルについて学んでいきます。

君がエンジニアになるまであと86日

作者の情報

乙pyのHP:
http://www.otupy.net/

Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter:
https://twitter.com/otupython

フォントサイズの指定方法

$
0
0

はじめに

CSSでのフォントサイズの指定方法には2つの分類がある。

絶対値

サイズが固定される。指定されたサイズで表示され、他の要素の影響を受けない。

相対値

指定された要素自体の値を持っていない。サイズは親要素のフォントサイズによって変わる。依存する親要素のフォントサイズが変われば、それに応じて相対値を指定された要素のフォントサイズも変わる。

フォントサイズ指定によく使われる単位

px

絶対値
指定されたサイズが16pxであれば親要素のサイズに関係なくフォントサイズは16px

%

相対値
親要素のフォントサイズに対する割合。親要素のサイズによって指定した要素のサイズも変わる。emと同じ。

sample.css
html{font-size:100%;}div{font-size:16px;}/* 親要素の半分の8px */div>p{font-size:50%;}

em

相対値
%と同じ。親要素のフォントサイズに影響される。

sample.css
html{font-size:100%;}div{font-size:16px;}/* 親要素の半分の8px */div>p{font-size:0.5em;}

rem

相対値
ルート(html)要素が基準になる。

sample.css
/* 16px */html{font-size:100%;}/* html要素の2倍の32px */div{font-size:2em;}/* html要素の半分の8px */div>p{font-size:0.5em;}

vw

ビューポートの幅の1/100の大きさを持った単位。ビューポートが100pxの場合1vw、1vwは1pxとなる。
画面サイズによってフォントサイズが変わる。

↓画面サイズによって可変する単位

単位説明  
vwビューポートの幅の1/100(100vwで横幅いっぱい)
vhビューポートの高さの1/100(100vhで縦幅いっぱい)
vmaxビューポートの高さか幅の大きいほうの1/100
vminビューポートの高さか幅の小さいほうの1/100
レスポンシブデザインと画面サイズによって可変する単位

vwで指定すると画面サイズが小さい時にはフォントサイズも小さくなり、画面サイズが大きくなればフォントサイズも大きくなるのでレスポンシブデザインに使用するとフォントサイズが扱いやすくなる。
320px(一番小さいデバイスの幅)を基準としてフォントサイズを指定する。これで画面サイズに合わせてフォントサイズも大きくなってくれる。

サイズ早見表
pxvw
10px3.125vw
11px3.4375vw
12px3.75vw
13px4.0625vw
14px4.375vw
15px4.6875vw
16px5vw
計算方法
フォントサイズ14pxの場合
14px ÷ 320px = 0.04375(4.375%) = 4.375vw

ブラウザのデフォルト

ブラウザのデフォルトフォントサイズは

100% = 16px = 1em = 1rem

flexのalign-items と align-content と justify-content と justify-items の違い

$
0
0

はじめに

CSSのflexを使う時に様々なオプションが出てきますよね。
その中で名前が似ているタイトルのプロパティについて少し検証したので書きました。

タイトルの違いについて調べた理由はplace-itemsというalign-itemsおよびjustify-itemsを一括で設定できるプロパティを知って、中央寄せしようとした時にうまく行かなかったからです。

結論から

justify系は主軸
align系は交差軸

◯◯-content系は余白間隔
◯◯-items系はアイテムの配置

です。

justify-content
justify-items
align-content
align-items

解説

MDN Web docsを見ると詳しく書いてあります。この記事では自分なりに解説をします。

主軸・交差軸とは

フレックスボックスはデフォルトの場合、横方向に要素が追加されていくと思います。その方向が主軸です。
そして、逆方向である縦方向交差軸です。

flex-direction: column;などで向きを変えれば、逆になります。

flex-direction
Cross_Axis

alignプロパティを試してみた

content系は余白の間隔と言いました。中央寄せする場合を見てみます。

wrapなしalign

align-contentでは中央寄せされないのは、仕様です。
https://developer.mozilla.org/ja/docs/Web/CSS/align-content

単一行のフレックスコンテナー (つまり、 flex-wrap: nowrap のもの) では、このプロパティは効果がありません。

flex-wrapがnowrapの場合、1行であるため交差軸の余白は存在しないからですかね。(この予想はかなり怪しいです)

flex-wrapalign
image.pngimage.png

wrapありalign

flex-wrapがwrapの場合、どちらのプロパティも中央寄せされる。
しかし、中央の寄せ方がalign-contentalign-itemsでは少々異なります。

flex-wrapalign
image.pngimage.png

justify

alignとほとんど一緒です。
ただ、justify-itemsは、

フレックスボックスレイアウトでは、このプロパティは無視されます
みたいです。

See the Pen abOrydr by MyPoZi (@shigasy) on CodePen.

image.png

image.png

余談

place-itemsというalign-itemsおよびjustify-itemsを一括で設定できるプロパティがあるのですが、place-items: center;で中央寄せされなかった理由は、
justify-itemsがフレックスボックスレイアウトでは、無視されていたからみたいですね。
place-contentもあるのですが、単一行のフレックスコンテナー (つまり、 flex-wrap: nowrap のもの) では、このプロパティは効果がない仕様ですね。

まとめ

justify系は主軸
align系は交差軸

◯◯-content系は余白間隔
◯◯-items系はアイテムの配置

です。

flexで単純に中央寄せしたいなら

.hoge-class{align-items:center;justify-content:center;}

などを使いましょう!

CodePen埋め込み殆ど出来てなくて申し訳ないです。


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

$
0
0

100日チャレンジの280日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
280日目は、

CSS position: absoluteとrelativeの学習

$
0
0

【やったこと】
 ①下記の記事を参考に学習
  CSSのposition: absoluteとrelativeとは
 ②上記で子要素にあたるえる影響が疑問になったなため別途調査を実施

【わかったこと】
 - absoluteとrelativeの基準位置の違い
 - 後続の要素位置に与える影響の違い
 - 親要素にposition: absoluteまたはrelativeを指定すると親要素を基準とした位置となること

※詳細は下記ブログに記述
【第2回】CSSの position: absoluteとrelativeのについてWebサイトの記事を参考にやってみた

JavascriptでCSS (Sass) プロパティを利用する

$
0
0

この記事は https://css-tricks.com/getting-javascript-to-talk-to-css-and-sass/の翻訳記事となります。
(2020/4/3 寄稿記事)

Screen Shot 2020-04-04 at 11.00.07.png

JavaScriptとCSSは20年以上にわたって依存し合っているわけですが、いまだ相互のデータのやりとりには大変な苦労があります。

もちろん、これまでも数多くのアプローチが紹介されていますが、ここではシンプルかつ直感的なアプローチを紹介したいと思います。
ここで言うシンプルかつ直感的と言うのは、構造を変えての試みということではなく、CSSカスタムプロパティやSass変数の利用について述べることにします。

CSSカスタムプロパティとJavaScript

カスタムプロパティというものはそうたいそうなものではありません。ブラウザーのサポートが開始されてから、JavaScriptからその値を操作することが可能になりました。

カスタムプロパティをJavaScriptで利用する方法にはいくつかありますが、 setPropertyを利用する方法が挙げられます。

document.documentElement.style.setProperty("--padding",124+"px");// 124px

CSS変数を抽出するには、 getComputedStyleを使います。このロジックの背景はいたってシンプルです。カスタムプロパティはスタイルの一部ですので、算出スタイル (computed style) の一部でもあると言えるのです。

getComputedStyle(document.documentElement).getPropertyValue('--padding')// 124px

同様に getPropertyValueがありますが、これによりHTML上のインラインスタイルの値を抽出することができます。

document.documentElement.style.getPropertyValue("--padding'");// 124px

カスタムプロパティはスコープ定義となるので、特定の要素から算出スタイル (computed style) を取得する必要があります。
ここでは、前述の setPropertyを使って :root に変数を定義しているので値を得ることができています。

Sass変数をJavaScriptで利用する

Sassは事前処理(pre-processing)言語ですので、ウェブサイトの一部として機能するには事前にCSSへの変換が行われます。
そのため、CSSカスタムプロパティと同じようにJavaScriptからアクセスすることはできません。CSSカスタムプロパティは算出スタイル (computed style) としてDOM上でアクセスが可能だからです。

これを変えるためにbuildプロセスを変更する必要があります。とはいえ、多くの場合loaderがbuildプロセスをになってくれるのでそう大きな変更は必要ないと思います。しかし、そうではないプロジェクトの場合は、Sassモジュールのインポート (import) と翻訳 (tranlating) を行う3つのモジュールを利用して以下のように webpack の設定を行います。

module.exports={// ...module:{rules:[{test:/\.scss$/,use:["style-loader","css-loader","sass-loader"]},// ...]}};

To make Sass (or, specifically, SCSS in this case) variables available to JavaScript, we need to “export” them.
Sass変数(今回は SCSS)をJavaScriptで利用するには :exportする必要があります。

// variables.scss$primary-color:#fe4e5e;$background-color:#fefefe;$padding:124px;:export{primaryColor:$primary-color;backgroundColor:$background-color;padding:$padding;}

この :exportはwebpackが変数をimportするための魔法です。何が良いかというと、変数名を変えることができる (camelCase) ことと、利用する変数を選別できることです。

次にこのSassファイル (variables.scss) をJavaScriptでimportします。これで、変数へのアクセスが可能となります。

importvariablesfrom'./variables.scss';/*
 {
  primaryColor: "#fe4e5e"
  backgroundColor: "#fefefe"
  padding: "124px"
 }
*/document.getElementById("app").style.padding=variables.padding;

ただ、この :exportにはいくつかの制約があるので述べておいた方が良いと思います。

It must be at the top level but can be anywhere in the file.
- Topレベル階層に位置する必要があるが、ファイル内のどこで定義しても良い
- 同一ファイル内、複数箇所で定義されている場合、キー (key) と値 (value) は結合され一緒にexportされる
- キーの重複がある場合、後続のキーの値が優先される
- 値にはCSSで有効な任意の文字が利用できる(スペースも可)
- 値には引用符('")は不要(リテラル文字列として扱われるため)

There are lots of ways having access to Sass variables in JavaScript can come in handy. I tend to reach for this approach for sharing breakpoints. Here is my breakpoints.scs file, which I later import in JavaScript so I can use the matchMedia() method to have consistent breakpoints.

JavaScriptからSass変数にアクセスすることが有用であるケースは多くありますが、筆者の場合、breakpoint を共有するために利用することがよくあります。
以下の breakpoints.scssをJavaScriptでimportし、 matchMedia()で一貫した breakpoint の利用を可能としています。

// Sass variables that define breakpoint values$breakpoints:(mobile:375px,tablet:768px,//etc.);// Sass variables for writing out media queries$media:(mobile:'(max-width: #{map-get($breakpoints,mobile)})',tablet:'(max-width: #{map-get($breakpoints,tablet)})',//etc.);// The export module that makes Sass variables accessible in JavaScript:export{breakpointMobile:unquote(map-get($media,mobile));breakpointTablet:unquote(map-get($media,tablet));// etc.}

もう一つのアプローチとしてアニメーションがあります。 アニメーションで利用する durationは通常CSSSで保持されますが、複雑なアニメーションになるとJavaScriptが必要となります。

// animation.scss$global-animation-duration:300ms;$global-animation-easing:ease-in-out;:export{animationDuration:strip-unit($global-animation-duration);animationEasing:$global-animation-easing;}

変数 export に strip-unit()を利用していますが、これはJavaScript側でのparse処理を容易にするためです。


CSS、SassとJavaScriptでのデータのやりとりが簡単にできることは嬉しいことで、このような変数の共有はコードをシンプルかつ無駄のないもの(原文にはDRYとあります)にしてくれます。

もちろん、他にもこれを実現するアプローチはあります。Les James氏は2017に興味深いアプローチを紹介しています。彼が紹介しているのは、JSONを利用したデータの共有です。ただ、偏った見方になるかもしれませんが、この記事で紹介したアプローチが最もシンプルで直感的であると思います。すでに運用しているCSSやJavaScriptへの面倒な変更は不要です。

他にもアプローチがあれば、ぜひコメントください。どう解決しているのかを知りたいです!

cssのmargin:autoの学習

$
0
0

【やったこと】
 ①Webサイト『ほんっとにはじめての HTML5 と CSS3』の記事『【11-2】marginの auto という値の「?」を解決しておこう』を学習

【わかったこと】
 - margin: auto; で左右を中央に配置できる。ただしwidthの指定が必要
 - 左右のいずれかに(例 margin:1em 1em 1em auto;)具体値がある場合は自動計算する
 - 左右に同じ値をいれることで同様に中央に配置できる
 - 上下は中央に配置できない
 - 上下にautoを設定すると0になる

【補足】
 項目『縦方向のセンター合わせは display:table-cell で』については未学習です

10px以下の文字が含まれたWebデザインが上がってきたので対応した

$
0
0

先日、フォントサイズが10px以下になるサイトのコーディングを(無理やり)行ったので、その時の対処を書いておきます。

着手後まもなく私の手を離れたので、下記の対応に不足があったのかどうかも今となっては謎ですが、とりあえず残しておきます。

対応方法に不足があるかもしれませんので、その際は優しくアドバイスをいただけますと幸いです。

10px以下のフォントは表示に難あり

index.html
<!DOCTYPE html><html><head><metacharset="UTF-8"><title>Document</title><style>.size10{font-size:10px;}.size8{font-size:8px;}.size6{font-size:6px;}.size4{font-size:4px;}</style></head><body><pclass="size10">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size8">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size6">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size4">やけに小さいフォント。<br>やけに小さいフォント。
  </p></body></html>

フォントサイズを10px以下にするとこうなる。

hikaku.PNG

左がChrome、右がIEとなっています。

Chromeだと10px以下のフォントを設定しても、すべて10pxで表示されてしまいます。

無理やり対応した

この案件では、Chromeでの表示をデザインカンプにピクセル単位で合わせる必要がありました。

なんとしても、10px以下の小さな文字をChromeで表示できるようにしなくては。

Chromeで10px以下のフォントを実現する方法として、CSSで Scale を指定するのが一般的なようです。

p{transform:scale(0.8);}

デザインを途中で修正することも許されなかったので、下記のように

  • chromeで表示するときははscaleで縮小する
  • それ以外はそのままのフォントサイズで表示する

という風に対応しました。

こんな感じです。

index.html
<pclass="size10">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size8">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size6">やけに小さいフォント。<br>やけに小さいフォント。
  </p><pclass="size4">やけに小さいフォント。<br>やけに小さいフォント。
  </p>
index.js
functionscale(){constuserAgent=window.navigator.userAgentif(userAgent.indexOf('Chrome')!=-1){$(".size8").each(function(){$(this).css('transform','scale(0.8)')})$(".size6").each(function(){$(this).css('transform','scale(0.6)')})$(".size4").each(function(){$(this).css('transform','scale(0.4)')})}}$(window).on('load',function(){scale()});

henkango.PNG

表示はこんな感じ。

ちょっとおしゃれなレイアウトになっていますが、一応縮小は出来ています。
IEでも表示は問題なさそう。

単純に要素全体を縮小しているので、マージンや横幅などももろもろ小さくなってしまいますが、まぁ良いでしょう。

結論:10px以下のフォントは読みずらいし美しくない

いくら対応できたといっても、やっぱり10px以下のフォントは(ネタサイトでもない限り)良くない!

以上!

Viewing all 8767 articles
Browse latest View live


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