CHROMA

世の中の "当たり前" を確認する

ぼかしテキスト

f:id:thleap:20141202190406p:plain

qnyp を開いたらネタバレを含む感想のテキストがぼかされて見えずらくしてあった。

あまり Web では見ない表現ではじめは驚いたけど、ネタバレ文章のように内容が読み解かれてはいけないけど文章量などの情報をなんとなく見せたいとき、ぼかしテキストはなかなか良さそうだと思った。

テキストのぼかしは CSS で行われていて、文字の塗りを透明にしてテキストシャドウでぼんやり文字の輪郭を取ってる。

Demo: http://jsfiddle.net/thleap/1hprth4f/

.blur-text {
  text-shadow: 0 0 7px rgba(0,0,0, .7);
  color: rgba(255,255,255, 0);
}

ちなみにぼかし量をピクセルで指定してるので、大きな文字では文字サイズに対するぼかし具合が弱く、このままのスタイルでは同じ効果は得られない。

使う場面があるかどうかは別として、ぼかし量を em で指定してすると文字サイズに合わせてスタイルを変更する必要はなくなりそう。

Demo: http://jsfiddle.net/thleap/1hprth4f/2/

/* text-shadow の 3番目の値を em で指定 */
.blur-text02 {
  text-shadow: 0 0 .5em rgba(0,0,0, .7);
  color: rgba(255,255,255, 0);
}

Canvas テキストのお試し

今週少しずつ進めている HTML5 Canvas、 3章「テキスト」でテキストアレンジャーというのものを作った。

で、章の終わりで完成したものをサンプルとして残しておくだけでも良かったんだけど、できたものを使っていると楽しくなってきたので、レイアウトを最低限整えてみたり背景の色も変えれるようにしてみた。

あと、テキストアレンジャーを作ってる途中に透明度の指定がうまく反映されないことがあったんだけど、これはテキストの透明度の値が背景にも影響されてたからっぽい。背景に context.globalAlpha = 1 を指定するとちゃんと予期した通りの表示になった。


JSFiddle は編集画面の URL の末尾に show を加えると結果をフル画面表示にできて、jsdo.it は fullscreen を加えるとフル画面にできる。忘れがち。

Canvas でテキストの中央揃え

昨日から引き続き HTML5 Canvas 読んでて、今日は「3.1 基本的なテキストの描画」をやってる。

テキストの中央揃えには measureText() メソッド を使うみたい。

以下のものでは Canvas 幅の半分の位置から算出したテキスト幅の半分をさらに引いて行内 (x軸)の中央揃えを行い、列内(y軸)に対しての中央揃えは単純に Canvas の縦幅の半分の位置を使ってる。

上記の指定を行った後、これらを context.fillText の x座標、y座標に指定するとテキストが中央揃えになる。

Demo: http://jsfiddle.net/thleap/aqs5at8p/4/

window.addEventListener('load', eventWindowLoaded, false);

function eventWindowLoaded() {
  canvasApp();
}

function canvasApp() {
  var theCanvas = document.getElementById('canvasOne');
  var context = theCanvas.getContext('2d');

  var message = 'your text';

  var formElement = document.getElementById('textBox');
  formElement.addEventListener('keyup', textBoxChanged, false);

  drawScreen();

  function drawScreen() {
    // 背景
    context.fillStyle = 'yellow';
    context.fillRect(0, 0, theCanvas.width, theCanvas.height);
    // テキスト
    context.font = '24px sans-serif';

    // テキストを Canvas に対して中央揃え
    var metrics = context.measureText(message);
    var textWidth = metrics.width;
    var xPosition = (theCanvas.width / 2) - (textWidth / 2);

    var yPosition = (theCanvas.height / 2);

    context.fillStyle = 'red';
    context.fillText(message, xPosition, yPosition);
  }

  // input 要素に入力したテキストを Canvas 上に表示
  function textBoxChanged(e) {
    var target = e.target;
    message = target.value;
    drawScreen();
  }
}

最初に出してる "your text" の部分が中央揃えにならなくて困った。

けど、それは中央揃え関連の指定の後に context.font の指定を置いていたからだった。

中央揃え関連の指定前に context.font の指定を置いてやると最初に出しているテキストにも中央揃えが適用された。

Canvas での色とグラデーションの扱い方

オライリーから出ている「HTML5 Canvas」読んでる。

線形グラデーション

線形グラデーションは createLinearGradient() メソッドを使って描画される。引数ではグラデーションの開始点(x, y)と終了点(x2, y2)を指定する。

createLinearGradient(x, y, x2, y2);

y, y2 の値を両方 0 にすると水平方向のグラデーション、x, x2 を両方 0 にすると垂直方向のグラデーションになる。

// 水平方向
createLinearGradient(0, 0, 100, 0);

// 垂直方向
createLinearGradient(0, 0, 0, 100);

// 垂直方向
createLinearGradient(0, 0, 100, 100);

addColorStop を使用することで、グラデーションの色の変化を制御することができる。

グラデーションの開始点から終了点を 0 ~ 1.0 で表し、最初の引数でどの地点に色を挟むか指定する。第二引数では適用したい色を指定する。

addColorStop(stop, color);

Demo: http://jsfiddle.net/thleap/qk1zs3ra/1/

function drawScreen() {
  var gr = context.createLinearGradient(0, 0, 100, 0);

  gr.addColorStop(0, 'red');
  gr.addColorStop(.5, 'yellow');
  gr.addColorStop(1, 'red');

  context.fillStyle = gr;
  context.fillRect(0, 0, 100, 100);
}

また、一度グラデーションを設定した後は新たな色の指定をしない限り、後に続く他の図形にもグラデーションが適用されることを注意しておきたい。

グラデーションの範囲を超える部分については最後の色(ここでは赤)で塗りつぶされることになる。

Demo: http://jsfiddle.net/thleap/qk1zs3ra/2/

  function drawScreen() {
    var gr = context.createLinearGradient(0, 0, 100, 0);

    gr.addColorStop(0, 'red');
    gr.addColorStop(.5, 'yellow');
    gr.addColorStop(1, 'red');

    context.fillStyle = gr;
    context.fillRect(0, 0, 100, 100);
    context.fillRect(0, 100, 50, 100);
    context.fillRect(0, 200, 200, 100);
  }

輪郭(線)へのグラデーションの適用

グラデーションは図形の輪郭や線にも適用することができる。

Demo: http://jsfiddle.net/thleap/qk1zs3ra/3/

  function drawScreen() {
    var gr = context.createLinearGradient(0, 0, 100, 0);

    gr.addColorStop(0, 'red');
    gr.addColorStop(.5, 'yellow');
    gr.addColorStop(1, 'red');

    context.strokeStyle = gr;
    context.strokeRect(0, 0, 100, 100);
    context.strokeRect(0, 100, 50, 100);
    context.strokeRect(0, 200, 200, 100);
  }

複合図形(パスでの描写)にも適用できる。

Demo: http://jsfiddle.net/thleap/qk1zs3ra/4/

  function drawScreen() {
    var gr = context.createLinearGradient(0, 0, 100, 0);

    gr.addColorStop(0, 'red');
    gr.addColorStop(.5, 'yellow');
    gr.addColorStop(1, 'red');

    context.strokeStyle = gr;
    context.beginPath();
    context.moveTo(0, 0);
    context.lineTo(50, 0);
    context.lineTo(100, 50);
    context.lineTo(50, 100);
    context.lineTo(0, 100);
    context.lineTo(0, 0);
    context.stroke();
  }

円形グラデーション

円形グラデーションは createRadialGradient() メソッドを使って定義する。

前後 3つの引数(x座標、y座標、円の半径)を 1セットとして、開始円と終了円を指定する。x座標と y座標では円の中心点を決める。

createRadialGradient(x, y, radius, x2, y2, radius2);

Demo: http://jsfiddle.net/thleap/qk1zs3ra/5/

  function drawScreen() {
    var gr = context.createRadialGradient(50, 50, 25, 50, 50, 100);

    gr.addColorStop(0, 'red');
    gr.addColorStop(.5, 'yellow');
    gr.addColorStop(1, 'red');

    context.fillStyle = gr;
    context.fillRect(0, 0, 200, 200);
  }
var gr = context.createRadialGradient(50, 50, 25, 50, 50, 100);

gr.addColorStop(0, 'rgb(255, 0, 0)');
gr.addColorStop(.5, 'rgb(0, 255, 0)');
gr.addColorStop(1, 'rgb(255, 0, 0)');

context.fillStyle = gr;
context.fillRect(0, 0, 200, 200);

HTML5、これからとかとか

第52回HTML5とか勉強会に参加してきた。

勉強会の様子は動画で観れる。

矢倉さんのセッションだけそれなりにメモを取っていたので載せておく。

これもスライドの内容そのままというわけではなく、自分の解釈を途中に挟みながら書いているので、資料が公開されればそれを見たほうが良いと思う。

HTML5 これまでの経緯とこれから

HTML5 は今後どうなっていくのか。開発者はどのようにしていかなければいけないのか。

  • 勧告とは ... テスト済みの機能が(ブラウザなどで)複数実装されている -> もう使える・使ってる
  • 勧告の意味は ... 参照先としての体裁、特許ポリシー発行
  • HTML5 仕様の作り方
    • WHATWG HTMLがマスター
    • W3C は切り出して複数の仕様に分割
    • W3C版のパッチを当てる
      • 合意が取れない内容があり、その部分は仕様が異なる( hgroup とか)
  • WHATWGW3C, どっちを読んだら良いの?
  • HTML の拡張方法(いくつかの選択肢)
  • モジュラリゼーション
    • 仕様が大きいと色々大変なので、小さくしたい
  • ハッカビリティ
    • 仕様を GitHub で策定する試み
      • Issue で議論
      • Pull Request で貢献
  • Extensible Web
    • 構想
      • 高レイヤー(HTML であらばエレメントなど)を再現できる低レイヤー(Web Components など)の API を優先して定義 -> 開発者に優しく、ライブラリがより重要に
    • Symbiosis
      • 開発者がほしい機能を作れる
      • 作ったものをフィードバックしてもらいやすくなる
      • -> 標準・実装・開発の共生関係が生まれる
    • 懸念
      • 高レイヤーへのリソースが割かれなくなる可能性がある
    • 懸念への対処
      • 自分が使ってるものに対して開発者はこれまで以上にコミットしていく必要がある
        • 使ってみる
        • 仕様や実装に突っ込んでみる
        • ドキュメントを書いてみる

暖色の円をランダムに並べる

ドットインストールの「HTML5 Canvas入門」レッスンをやってる。

15回、16回でランダムな大きさ・色の円を透過させて並べるというのをやったけど、これの色を暖色に限定して並べるようにしてみた。

それがこちら:

色の指定方法を rgb から hsl に変えて、hue(色相)の値をランダムに変化させるようにした。

-20度から 80度という角度の範囲を指定するときにどうやれば良いのかわからなくなったけど、MDNに掲載されている「min から max までの乱数を返す関数」を使えばできた。

めでたし。

CHROMA, ソーシャルボタンのスタイル変更

はてなブログ、ソーシャルボタンのスタイルが変わったみたい。

このブログでは、ソーシャルボタンのサイズを無理やり変更していたので見た目が崩れた。

なので、幅や高さの指定を削除した。

ブログのテーマを作るときとかは、こういったこともあるので元のデザインを無理しない範囲で変更するのが良さそう。

このブログの場合は、ブログの購読ボタンあたりのスタイルもいつか崩れそうでこわい。