文字サイズとか(実機で確認用)

12px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

13px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

14px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

15px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

16px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

17px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

18px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

19px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

20px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

22px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとな

24px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

28px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

32px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

36px

つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)

CSS関数 min(),max(),clamp()

min(),max(),clamp()について

min(),max(),clamp()はプロパティに設定する値を自動で計算してくれるCSSの数学関数です。
calc()も同じく数学関数。

min()とは

カッコの中に2種類の値を設定し、どちらか小さいほうの値が適用されます。(=最大値を設定できる)

minなのに最大値?意味が分からないと思いますが、これまでmax-widthwidhで設定していたものを min() の一行で書けます。

box {
  width: 50%;
  max-width: 700px;
}
box {
  width: min(50%, 700px);
}

上の場合だと、ブラウザ幅が1000pxのとき50%の幅は500pxとなり700pxより小さいため、50%の値が適用されます。
ブラウザ幅が1400px以上になると50%の幅が700px以上になるため、値の小さい700pxの方が適用されます。

max()とは

カッコの中に2種類の値を設定し、どちらか大きいほうの値が適用されます。(=最小値を設定できる)

これはwidthとmin-widthを使っていた時と同じイメージです。

box {
  width: 50%;
  min-width: 300px;
}
box {
  width: max(50%, 300px);
}

上の場合だと、ブラウザ幅が600px以下の時は300pxが適用され、601px以上のとき50%の幅が300pxより大きくなるため、50%が適用されます。

clamp()とは

上記のmin(),max()を合わせたものです。これはカッコの中に「最小値」「推奨値」「最大値」の3つの値を入れるので、イメージしやすいと思います。

box {
  width: clamp(300px, 50%, 900px);
}

下のSAMPLEページに三種類のデモが置いてあります。ブラウザ幅を変えて確認してみてください。

つかいどころ

上記の説明では分かりやすいようwidthの値として使用しましたが、font-sizeやmargin、paddingの値としても使えます。

safariで効かないときは

safariにも対応していますが、うまく動かないときは以下の記述を追加してみてください。

* {
    min-height: 0vw;
}

設定する値に演算子が使える

上記の例で「%」で設定していた値には「vw」や演算子も使えます。ただし流動値でないといけないの固定される値は設定できません。

block {
  width: min(100vw - 50px, 700px);
}

CSSで変数(カスタムプロパティ)を使う

[outline]

記事にしてあるかと思ったのですがまだ書いてなかったので。

カスタムプロパティとは

javascriptやプログラミング言語で当たり前のように登場する変数。
cssで使うときは「カスタムプロパティ」という呼び方になるようです。が、自分は変数と呼んでいます。

変数になじみのない方に説明すると、あるキーワードにあらかじめスタイルを定義しておき、そのスタイルを使いたいときは代わりにキーワードを入力すれば呼び出せる、というものです。

これだけだとメリットが分かりづらいのですが、たとえば「main-color」というキーワードにカラーコードを指定しておき、サイトのメインカラーを使う箇所にカラーコードではなく「main-color」というキーワードを指定しておけば、メインカラーが変更になった場合に一つ一つカラーコードを変更する必要がなく、「main-color」に指定したカラーコードを変更すれば一気に変更することができます。

コンテナクエリ(2022年新機能)

コンテナクエリとは

これまでのレスポンシブデザインでは画面幅(ブラウザ幅)を基準にブレイクポイントを決め、それに応じてスタイルを定義するメディアクエリを使用していましたが、コンテナクエリでは指定した親コンテナをベースにして子要素のスタイルを定義できます。

これが使えるようになることで、ブラウザ幅に影響されることなく親コンテナのサイズに合わせて文字の大きさを変えるといったことなどができるようになり、より柔軟なレスポンシブデザインが作れます。

使用可能ブラウザとポリフィル

2022年10月現在、Chrome 105+(Edgeも105+)とSafari 16に対応。

ポリフィルもあり、Chrome/Edge 88+, Firefox 78+, Safari 14+をカバーしています。
Container Query Polyfill -GitHub

直接CDNを読み込んでもいいのですが、下のコードを記述すると、コンテナクエリ未対応のブラウザにのみポリフィルが読み込まれるようになるのでオススメ。

// 直接CDNを読み込む
<script src="https://cdn.jsdelivr.net/npm/container-query-polyfill@1/dist/container-query-polyfill.modern.js"></script>

// 未対応の時のみ読み込む
<script>
const supportsContainerQueries = "container" in document.documentElement.style;
 
if (!supportsContainerQueries) {
  import("https://cdn.skypack.dev/container-query-polyfill");
}
</script>

使い方

コンテナクエリの親コンテナとなる要素にはスタイルを定義してはいけないというルールがあります。そのため場合によってはコンテナクエリ用のラッパー要素を用意してから、親コンテナですよと定義します。

<div class="parent-wrap">
  <div class="container">
    <div class="child-content">
      <p>親譲りの無鉄砲で小供の時から損ばかりしている。</p>
    </div>
  </div>
</div>
.parent-wrap {
  container: inline-size / parent-wrap; /* ショートハンド */
  /* container-type: inline-size; */
  /* container-name: parent-wrapper; 個別にコンテナクエリを指定する場合は名前をつける */
}

そして、メディアクエリと同じような感じで子要素のスタイルを定義します。

.child-content p {
  color: red;
}

/* 個別にコンテナクエリを指定する場合 */
/* @conteiner [container-name] (max-width: [size]) */
@container parent-wrapper (max-width: 700px) {
  .child-content p {
    color: blue;
  }
}

/* まとめてコンテナクエリを指定する場合 */
/* @conteiner (max-width: [size]) */
@container (max-width: 700px) {
  .child-content p {
    color: blue;
  }
}

これを実行すると、親要素である .parent-wrap の幅が700px以下のときに文字色は青となり、701px以上で赤となります。
まとめてコンテナクエリを指定する場合は親要素の container-name を指定する必要はなく、自動的に子要素から一番近い container-type: inline-size; を指定した親要素がベースとなります。

コンテナクエリの新しい単位

親要素にコンテナさえ指定しておけば、コンテナベースの単位を使うことができます。
単位の最初にcontainer queryの「cq」がついてるので分かりやすい。

cqwコンテナの幅の1%
cqhコンテナの高さの1%
cqiコンテナのインラインサイズの1%
cqbコンテナのブロックサイズの1%
cqmincqiまたはcqbの小さい方の値
cqmaxcqiまたはcqbの大きい方の値

ボタンのエフェクト整理ノート

ボタン自身のエフェクト

周りにオーラのようなもの

See the Pen aura by uta (@utamaro) on CodePen.

キランッてなるやつ

See the Pen blink by uta (@utamaro) on CodePen.

ボタン自体の動き

ズーム(ひかえめ)

See the Pen zoom by uta (@utamaro) on CodePen.

Posted in CSS

jQuery | スクロール量によって固定要素を表示

[outline]

ページ内にボタンやバナーを画面固定したい時、position: fixed などで固定できますが、「最初に目に入るメインビジュアルには被らせたくない」「footerには被らせたくない」というように、決まった範囲内でのみ表示しておきたいときに使えます。

動作イメージ

スクロールがsectionCに入ると(sectionCが画面内に入ると)画面下部に固定要素が表示され、sectionDが画面内に入ると非表示となります。

See the Pen スクロール量によって固定要素を表示 by uta (@utamaro) on CodePen.

下の画像はページ全体をざっくり分けたイメージ図になります。

各セクションをA~Dに割り振り、Cを表示開始トリガー、Dを表示終了のトリガーとしています。(要素の上部がトリガーの位置となります)

スクロールをしていき、Cが画面内に入ると固定要素が表示され、Dが画面内に入ると固定要素が非表示となります。

おおまかな作り方

表示し始めたい箇所の要素と表示を終わらせたい箇所の要素にID名を指定し、トリガーとします。固定要素にもID名をつけておきます。

javascriptでページトップからのそれぞれのトリガー位置とスクロールの量を取得。スクロール量が1つ目のトリガーよりオーバーしたら表示、2つ目のトリガーを過ぎたら非表示するようにします。

なお、fadeInやfadeOut動作はjQueryのほうが滑らかなので、部分的にjQueryを使用しました。

サンプルコード

HTML

表示開始のトリガーとなる要素にidjs-appearTrigger、表示終了のトリガーとなる要素にidjs-hiddenTrigger、固定要素にidjs-fixedBlockを指定します。

固定要素はここでは一番最後に記述しています。

<div class="blockA">....</div>
<div class="blockB">....</div>
<div class="blockC" id="js-appearTrigger">....</div>
<div class="blockD" id="js-hiddenTrigger">....</div>
<div class="btn" id="js-fixedBlock">....</div>

CSS

cssでは固定要素を予め非表示にしておき、前面に来るよう念のためz-indexを指定しています。
※HTMLで固定要素を先に書くと、後に書いた要素が前面に被ってしまうので、z-indexは必須です。z-indexが効いていない場合は、全面にきている要素にposition: relative;を指定してあげるとうまくいったりします。

.btn {
  display: none;
  width: 300px;
  position: fixed;
  bottom: 0;
  left: 50%; /* 中央に表示 */
  transform: translateX(-50%); /* ずらし過ぎた分元に戻す */
  z-index: 10; /*前面に表示されていれば1でも2でもOK*/
}

上記のcssは要素の幅を300pxに指定し中央寄せにしていますが、幅100%の場合はleft: 0;でぴったり左端にくっつけてあげて、transform~の記述も必要なし。

javascript

</body>直前辺りに<script>タグで囲って下記のコードを記述。

  const fixedBlock = document.getElementById('js-fixedBlock');
  const appearTrigger = document.getElementById('js-appearTrigger');
  const hiddenTrigger = document.getElementById('js-hiddenTrigger');

  // スクロール量で下部のボタンを表示・非表示
  window.addEventListener('scroll', function () {

    //スクロール量を取得
    var scroll = window.scrollY;
    var windowHeight = window.innerHeight; //画面の高さを取得

    //ターゲット要素の位置を取得
    var appearTriggerPos = appearTrigger.getBoundingClientRect().top + scroll;

    //ターゲット要素の位置を取得
    var hiddenTriggerPos = hiddenTrigger.getBoundingClientRect().top + scroll;

    if (scroll >= appearTriggerPos - windowHeight && scroll <= hiddenTriggerPos - windowHeight) {
      $('#js-fixedBlock').fadeIn();
    } else if (scroll < appearTriggerPos - windowHeight) {
      $('#js-fixedBlock').fadeOut();
    } else if (scroll > hiddenTriggerPos - windowHeight) {
      $('#js-fixedBlock').fadeOut();
    }
  });

※jQueryを使用しているので、上記のスクリプトコードより上にjQueryを読み込んでおいてください。
(CDNで読み込む場合は以下のコードを貼り付ければOK。GoogleHostedLibrariesより)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

いくつか分岐点を作って表示と非表示を分けているだけなので、分岐点を増やせばもっと細かく表示非表示を切り替えられます。

上記では、表示トリガー <= スクロール <= 非表示トリガー のときに表示、表示トリガー > スクロール もしくは 非表示トリガー < スクロール のときに非表示としています。

備考

元々全てjavascriptで作ろうとしたが、fadeInやfadeOut部分の動作が不安定だったため、結局一部jQeryを使用。javascriptでなめらかにfadeIn・fadeOutが出来たら、ここに追記しようと思う。

画像(インライン要素)の下に微妙な隙間があるとき

単純な話だけど、たびたびアレっ?てなるので忘備録。

<img src="画像ファイル">
<img src="画像ファイル"> 

たとえば、こんなかんじで画像を上下に2つ並べるとする。

marginやpaddingなどが入っていないのに、なぜか微妙な隙間が空いてしまうことがある。

原因はvertical-align。
インライン要素の場合、デフォルトでvertcal-align: baseline;となっていることが多いので、
vertical-align: top; としてあげると直る。

もしくは、画像自体をdisplay: block;でブロック要素にしてあげても直る。

filterとblend-mode

filter

filterプロパティはぼかしや色の変化などを要素自体に適用することができます。画像だけでなく要素自体に適用されるので、要素内がテキストならテキストに適用され、画像なら画像に適用されます。

なお、filterプロパティは指定した要素の子孫要素にも適用されるので、背景だけをぼかしたい!といった場合は::beforeなどの擬似要素を作って、そこに背景+filterを適用するのが良さそうです。

注意点としては、filterプロパティは2021年3月時点でIE11未対応となっています。

使い方

適用する要素のスタイルに

filter: フィルターの種類(数値); 

と書いてあげるだけでオッケーです。
数値はフィルターをどの程度適用するのかを指定するものですが、種類によってpx指定だったり%指定だったりします。(%指定の場合、100%=1として80%=0.8のように数値で書いても大丈夫)

たとえば、画像に直接指定する場合、以下のような記述になります。

// html
<img class="filter-img" src="画像URL">
//css
.filter-img { filter: blur(4px); } /* 4pxのぼかしをかける */ 

filter一覧

フィルター無しの元画像

blur
(ぼかし)

blur

blur(2px)

0(0px)が基準。0以上のpxで指定。

brightness
(明るさ)

blur

brightness(130%)

100%が基準。0%に近づくほど暗くなり、100%以上で明るくなる。0%にすると黒一色に。

contrast
(コントラスト)

blur

contrast(200%)

100%が基準。0%に近づくほどくすみ、100%以上で濃淡がはっきりする。0%でグレー一色に。

drop-shadow
(ドロップシャドウ)

blur

drop-shadow(2px 2px 3px orange)

「X方向の距離、Y方向の距離、ぼかす範囲、(色)」を指定すると反映されます。色はrgba値でもカラーコードでも。デフォルトはblack

grayscale
(グレースケール)

blur

grayscale(80%)

0%が基準。100%に近づくほど色味がなくなりモノクロになる。100%がMAX。

hue-rotate
(色相)

blur

hue-rotate(90deg)

0degが基準。色相環をベースに色が置き代わるので、360(-360)degで元の色に、180(-180)degで補色に。0~360は時計回り、-360~0は反時計回り。

invert
(色の反転)

blur

invert(80%)

0%が基準。0~50%までは色がくすんでいき、50%でただのグレーに。50%以上で反転した色がついていき、100%で完全に反転した色になる。

opacity
(透過度)

blur

opacity(60%)

100%が基準でMAX。0で透明になる。

saturate
(彩度)

blur

saturate(200%)

100%が基準。100%以上で色が鮮やかになる。0に近づくほど色味が消え、0でモノクロになる。

sepia
(セピア)

blur

sepia(100%)

0%が基準。100%に近づくほどセピア調になっていく。100%がMAX。

いろいろな使い方

複数のフィルターを適用する

pngの複雑な形に添ってシャドウをかける

background-blend-modeとmix-blend-mode

「background-blend-mode」「mix-blend-mode」は、通常photoshopなどで行っていたようなオーバーレイや乗算といった色を掛け合わせる加工をcssのみで行えます。

「background-blend-mode」は要素内に背景を複数指定し、それらをブレンドします。1つの要素のみで完結するので、背景画像を加工する場合はこちらがオススメ。

「mix-blend-mode」は複数の要素同士でブレンドします。こちらは背景画像だけでなく、テキストやimgの画像などもブレンドの対象になります。背景とテキストをブレンドしたい時など、複数の要素にまたがって加工する場合はこちらがオススメ。

どちらもIE非対応なので注意が必要です。

background-blend-mode

背景画像と背景色をブレンドしたり、背景画像と背景画像をブレンドできます。

背景画像×背景色

まずは花の画像と青色を掛け合わせてみます。

オーバーレイの効果をかけたらこんな感じになりました!

以下がざっくりした記述になります。cssのブレンドモードに関わる部分は上2行のみです。以下では背景色と背景画像をひとつにまとめて記述しましたが、background-colorやbackground-imageで別々に指定しても大丈夫です。

				
					/* HTML */
/* CSS */
.background-blend {
    backgrdound: #3294FF url(花の画像URL);
    backgrdound-blend-mode: overlay;
    backgrdound-repeat: no-repeat;
    backgrdound-size: cover;
}
				

背景画像×背景画像


背景に画像を複数設定して、それらをブレンドすることもできます。
画像を複数設定するにはカンマ区切りでURLを書きますが、先に記述したものから上側に表示されます。一番下の画像をベースに上側の画像にブレンドモードが適用されるので、記述する順番によって見え方も変わります。

左側は花の画像を下に、クマの画像が上になるようにしてオーバーレイをかけたもの。右側は逆にクマが下、花が上になるようにしてオーバーレイをかけたものです。

mix-blend-mode

画像・テキストに関わらず、要素同士をブレンドします。

色々ブレンドしてみる

親要素と子要素や、positionで要素を重ねた時など、複数の要素間でブレンドできるので、試してみます。

ベースとなる親要素「base-container」にオーロラの背景を敷き、子要素にテキスト・背景画像・画像をそれぞれセットし、まとめてmix-blend-modeで「hard-light」を適用しました。使用画像とざっくりしたコードは以下。

親要素背景
子要素2の背景
子要素3の画像
				
					<!-- HTML -->
  
SAMPLE TEXT
  <img decoding="async" src="画像URL">

				
				
					.base-container {
  background: url(オーロラ画像URL) no-repeat;
  background-size: cover;
}
.isolate {
  isolation: isolate;
}
/* テキスト */
.blend-1 {
  color: lightcoral;
}
/* 背景 */
.blend-2 {
  content: "";
  height: 150px;
  background: url(花の画像URL) no-repeat;
  background-size: cover;
}
/* 子要素にimg */
.blend-3 {
    height: 150px;
}
.blend-3 img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}
.blend-type {
  mix-blend-mode: hard-light;
}
				

SAMPLE TEXT

親要素にはisolateを

上のサンプルにも記述していますが、ブレンドをするさい親要素にisolation:isolate; を指定しないと、更にその下に背景を設定していた場合透過されてブレンドされます。

イメージとしては以下のような感じ。

全体を囲う要素「wrap-stripe」にストライプの背景を敷いておき、「container」には特に背景等は指定しません。「container」の中にimgをpositionで重ね、それぞれオーバーレイのブレンドを適用しています。

isolateクラスのついているコンテナには isolation:isolate; を適用し、下のストライプ背景にまでブレンドが適用されないように設定。

				
					
  <!-- isolateを適用(左) -->
    <img decoding="async" src="イメージ1">
    <img decoding="async" src="イメージ2">
  <!-- isolateを非適用(右) -->  
    <img decoding="async" src="イメージ1">
    <img decoding="async" src="イメージ2">

				

こんな感じになります。
blend-modeを適用した要素の親要素にisolateを指定しておかないと、思っていたのと違う見た目になる場合があるので注意が必要です。

Posted in CSS

カーテンを開くようなテキストアニメーション

びよんとバーが伸びて、消えていくのに合わせてテキストが現われるアレ。
使う機会がないけれど、どこかで使ってみたいのでテストがてらメモしておきます。

以下サンプル。(’Rerun’でアニメーション再スタート)

See the Pen カーテンanimation by uta (@utamaro) on CodePen.

サンプルのコード説明

HTML

htmlの記述はこれだけ。ポイントはcurtainクラスをつけた要素の中に、テキストが入った要素を入れ子にする点。

<p class="curtain"><span>SAMPLE CODE SAMPLE CODE</span></p> 

CSS

アニメーション部分の動きはcssで制御します。
それぞれの記述説明はコメントアウトに。使用する際に消してください。

.curtain {
  position: relative;
	display:inline-block;
  font-size: 30px;
}
/* span要素 最初は非表示 */
.curtain span {
  transition: all 0s 1s ease;
  opacity: 0;
  padding: 0 0.2em;
}
/* .curtainに.activeがついたらspanを表示(1s後に0sかけて透明度を0→1に) */
.curtain.active span {
  opacity: 1;
  color:#333;
}
/* .curtainに擬似要素(カーテン部分)を追加して、transformで横幅を0にしておく scaleX(0) */
.curtain:after {
  display: inline;
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  transform: scaleX(0);
  background: #333;
}
/* .curtainに.activeがついたら擬似要素のアニメーションを開始させる */
/* アニメーション名,アニメーション完了までの所要時間,変化の度合い,遅延時間,回数,再生方向,アニメーション前後のスタイル,アニメーションの再生・停止 */
.curtain.active:after {
  animation: curtainEffect 1s ease-in-out 0.5s 1 normal both running;
}
@keyframes curtainEffect {
  0% {
    transform-origin: left center;
    transform: scaleX(0);
  }
  49.999% {
    transform-origin: left center;
    transform: scaleX(1);
  }
  50% {
    transform-origin: right center;
    transform: scaleX(1);
  }
  100% {
    transform-origin: right center;
    transform: scaleX(0);
  }
}
/*
* transform-originで変形における原点を設定(最初は左端・天地中央にセット)
* そのままscaleX(1)で右側いっぱいまで要素を伸ばし、
* 伸ばした状態で原点を右・上下中央にセットし直す。
* 原点が右に変わったことでscaleX(0)に戻る際、右側に消えるように流れる
*/
 

動きとしては、.curtainに疑似要素を追加してそれをカーテン部分とします。
span部分は最初は透明にしておき、カーテンが開ききったタイミングで表示。
カーテンが再度開くのに合わせて、下に表示させておいたspan要素が現われる、という流れです。

javascript

.curtain要素に.activeをつけることで、アニメーション開始の合図とします。
全てのhtmlが読み込まれたタイミングで実行させます。

<script>
window.onload = function() {
  var curtainElements = document.getElementsByClassName('curtain');
  [].forEach.call(curtainElements, function(elem) {
      elem.classList.add('active');
  })
};
</script> 

htmlに直接記述する用に<script>タグをつけています。</body>直前あたりに記述してください。

HTML実体参照文字

コーディングのときに、テキストとテキストの間に隙間を空けたい!ってとき、そのままスペースを入れても画面上には反映されず…というのがあって、毎回スペースの実体参照を調べていたのですが、探すのも手間なのでまとめました。ついでに他の記号も調べました。

ちなみに実体参照文字というのは、特殊文字や記号を正確にブラウザ上に表示させるため、別の書き方で書き表す方法です。「&」から始まり「;」で終わる文字列となります。

実例としては、ブラウザ上に<div></div>という文字列を表示させる場合、そのまま書くとhtmlタグと認識されてブラウザ上には表示されません。この場合「<」を「&lt;」、「>」を「&gt;」という実体参照文字を使い&lt;div&gt;&lt;/div&gt; と書くことで、ブラウザ上に文字列として表示することができます。

以下はボタンになっているので、クリックすると実体参照文字がコピーされます。

&

アンパサンド

©

コピーライト

®

登録商標

商標

ダブルクォーテーション

シングルクォーテーション

 

改行なし空白

“m”幅空白

“n”幅空白

狭い空白

<

小なり

>

大なり

¥

¦

縦破線

§

節記号

¨

ウムラウト

«

二重山括弧(左)

»

二重山括弧(右)

¯

マクロン

°

摂氏温度

リットル

±

プラスマイナス

¹

上付き数字の1

²

上付き数字の2

³

上付き数字の3

½

分数1/2

¾

分数3/4

¼

分数1/4

¡

逆さ感嘆符

¿

逆さ疑問符

´

アキュートアクセント

·

中点

二重矢印 (左)

二重矢印 (上)

二重矢印 (右)

二重矢印 (下)

二重矢印 (左右)

矢印 (左)

矢印 (上)

矢印 (右)

矢印 (下)

矢印 (左右)

黒リターン

白リターン

ローマ数字1

ローマ数字2

ローマ数字3

ローマ数字4

ローマ数字5

ローマ数字6

ローマ数字7

ローマ数字8

ローマ数字9

ローマ数字10

ローマ数字11

ローマ数字12

丸つき数字1

丸つき数字2

丸つき数字3

丸つき数字4

丸つき数字5

丸つき数字6

丸つき数字7

丸つき数字8

丸つき数字9

丸つき数字10

丸つき数字11

丸つき数字12

丸つき数字13

丸つき数字14

丸つき数字15

丸つき数字16

丸つき数字17

丸つき数字18

丸つき数字19

丸つき数字20

黒四角

白四角

黒三角

白三角

逆黒三角

逆白三角

黒ひし形

白ひし形

菱形

白丸

黒丸

ビュレット

黒スペード

白スペード

黒クラブ

白クラブ

黒ハート

白ハート

黒ダイヤ

白ダイヤ

温泉

括弧1

括弧2

括弧3

括弧4

括弧5

括弧6

括弧7

括弧8

括弧9

括弧10

括弧 月曜日

括弧 火曜日

括弧 水曜日

括弧 木曜日

括弧 金曜日

括弧 土曜日

括弧 日曜日

括弧 株式会社

括弧 有限会社

括弧 社

No.

TEL

モーダルウィンドウ(アクセス時に開くやつ)

ページ遷移無しでコンテンツを表示したりしなかったり。
何かと使う機会の多いモーダルウィンドウですが、ボタンや画像をクリックして閉じたり開いたりするタイプではなく、ページを開くと同時に(アクセス時に)開いた状態にしておくタイプの作りかたです。

なお、こちらのサイトのものを参考に少し改造しています。
FEVDES BLOG | 【簡単!】ページのアクセス時にモーダル(フロート)を表示するjQuery.layerBoard.js


モーダルサンプル(画面からコンテンツがはみ出すver)


モーダルサンプル(画面内におさまるver)

作ります

用意するもの

  • jQuery
  • jquery.cookie.js
  • jquery-modalLayerBoard.js
  • layerBoard.css
  • 閉じる用のボタン画像

以下のリンクからsampleファイル一式をダウンロードできます。(※jQueryとjquery-cookieはCDNを使用しています)

modal_window-sample.zip

jQuery

まず</body>直前あたりでjQueryを読み込みます。※CDNで読み込んでいます。


					
				

jquery.cookie.js

次にこちらを読み込みます。
クッキーを使ってアクセス回数を判別し、「最初のアクセス時だけモーダルウィンドウを表示させる」といったような制御ができるようにします。

ファイルはGitHubからダウンロードできます。「src」内の「jquery.cookie.js」だけで大丈夫です。
今回はこちらのCDNを使ってなるべくダウンロードするものを少なくしたいと思います。


					
				

jquery-modalLayerBoard.js

これでモーダルウィンドウを表示させたり動きを制御します。
参考サイトのファイルを使いやすいように少しいじったものです。以下のリンクから直接ダウンロードできます。

jquery-modalLayerBoard.js

					
				

ファイルの内容は以下。外部にファイルを設置できない場合などは<script>タグで囲って直接HTML上に記述します。


					/*
 * ===================================
 *	jquery.layerBoard.js
 *	@auther:kiyoty
 *	@URI:http://www.idea-clippin.com
 *	@create:2012/12/30
 * 	@License:MIT License(X11 License、X License)
 *	@modification:uta
 * ===================================
*/
(function($) {
	$.fn.layerBoard = function(option) {
		var elements = this;
		elements.each(function(){
			option = $.extend({
				delayTime: 200,
				fadeTime : 500,
				alpha : 0.5,
				limitMin : 10,
				easing: 'linear',
				limitCookie : 3	,
				countCookie : 10000
			}, option);
			var limitSec = option.limitMin * 60; //秒数に変換
			// cookieがない場合 --------------------
			if ($.cookie('layerBoardTime') == null || $.cookie('visitCount') == null) {
				LayerBoardFunc ();
				var start = new Date();	// cookieに現在の時間をセット
				$.cookie('layerBoardTime', start.getTime(), { expires: option.limitCookie,path: '/' });
				var visitCount = 1;  //訪問回数を1回に設定
				$.cookie('visitCount', visitCount, { expires: option.limitCookie });
			} else if ($.cookie('visitCount') <= option.countCookie - 1){
			// cookieがある場合 --------------------
				//Cookie"visitCount"の値に1つ足す
				visitCount = $.cookie('visitCount');
				visitCount ++;
				$.cookie('visitCount', visitCount, { expires: option.limitCookie });
				//現在のミリ秒を取得し、秒数に変換
				var now = new Date();
				secDiff = now.getTime() - $.cookie('layerBoardTime');
				secTime = Math.floor( secDiff / 1000);
				//指定時間を経過していた場合は、LayerBoardを表示
				//cookieを削除後、再度cookieに現在のミリ秒をセット
				if (secTime >= limitSec) {
					LayerBoardFunc ();
					$.cookie('layerBoardTime', null, { expires:-1,path: '/' });
					var start = new Date();
					$.cookie('layerBoardTime', start.getTime(), { expires:option.limitCookie,path: '/' });
				}
			}
			// 表示処理 --------------------	
			function LayerBoardFunc () {
			}	
			function LayerBoardFunc () {
				$('#layer_board_area').css('display', 'block');	
				$('.layer_board_bg', elements).show().animate({opacity: 0},0).delay(option.delayTime).animate({opacity: option.alpha},option.fadeTime,function(){
					$('.layer_board', elements).fadeIn(option.fadeTime);			
					//表示した際背景のスクロール禁止
					$('html, body').css('overflow', 'hidden');		
				})				
			}
			// 非表示処理 --------------------
			$('.layer_board_bg', elements).click(function() {			
				$('.layer_board , #layer_board_area', elements).fadeOut(option.fadeTime);
				$(this).fadeOut(option.fadeTime);
				$('#layer_board_area').css('display', 'none');
				//非表示にした際背景のスクロール許可
				$('html, body').css('overflow', 'auto');
			});
			// .mdl_btn_closeをクリックした時の動作(非表示処理) --------------------
			$('.mdl_btn_close', elements).click(function() {				
				$('.layer_board , #layer_board_area', elements).fadeOut(option.fadeTime);
				$('.layer_board_bg', elements).fadeOut(option.fadeTime);
				$('#layer_board_area').css('display', 'none');
				//非表示にした際背景のスクロール許可
				$('html, body').css('overflow', 'auto');
			});
			// モーダル表示用ボタンの表示処理 --------------------
			$('.layer_board_btn').click(function() {
				$('#layer_board_area').css('display', 'block');			
				$('.layer_board_bg', elements).show().animate({opacity: 0},0).delay(option.delayTime).animate({opacity: option.alpha},option.fadeTime,function(){
					$('.layer_board', elements).fadeIn(option.fadeTime);
					//表示した際背景のスクロール禁止
					$('html, body').css('overflow', 'hidden');	
				});
			});
			// 見た目処理(コンテンツが短い場合中央表示) --------------------
			var bg_height = $('.layer_board_bg').outerHeight();
			var layer_bord_height = $('.layer_board').outerHeight();
			if(bg_height + 40 >= layer_bord_height){
				$('.layer_board').addClass('shortLayer');
			}
		});
		return this;	
	};
})( jQuery );

				

layerBoard.css

モーダルウィンドウのスタイルなど。
以下からダウンロードして<head>~</head>内に外部ファイルとして読み込んでも良いし、HTML内に直接書いても大丈夫です。

layerBoard.css

					 	<link rel="stylesheet" href="...yourDirectoryPath.../layerBoard.css">
				

ファイルの内容は以下。


					/* ---------------------------------- **
		Modal Window
** ---------------------------------- */
#layer_board_area {
	display: none;
	position: fixed;
	top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: 0 3vw;
    overflow-y: auto;
    box-sizing: border-box;
    -ms-overflow-style: none;
    scrollbar-width: none; /*スクロールバーを非表示*/
    z-index: 2;
}
#layer_board_area::-webkit-scrollbar {
	display:none; /*スクロールバーを非表示*/
}
.layer_board_bg {
	display: none;
	position: fixed;
	width: 100%;
	height: 100%;
	top: 0;
	bottom: 0;
	right: 0;
	left: 0;
	cursor: pointer;
	background: #000;
	z-index: 0;
}
/* --modalWindow ポップアップ部分-- */
.layer_board {
	display: none;
	position: relative;
	width: 80%;
	max-width: 800px;
	margin: 3em auto;
	padding: 4em;
	border-radius: 5px;
	box-sizing: border-box;
	background: #fff;
	z-index: 10;
}
.layer_board.shortLayer {
	margin: 0;
	top: 50%;
	left: 50%;
	transform: translate(-50%,-50%);
}
/* --close ボタン-- */
.layer_board .mdl_btn_close.circle_btn {
	position: absolute;
	top: 10px;
	right: 15px;
	width: 30px;
	height: 30px;
	background-color: #000;
	background-image: url("btn_close.png");
	background-repeat: no-repeat;
	background-size: 18px;
	background-position: 50%;
	border-radius: 50%;
	border: 1px solid #ccc;
	transition: .15s;
}
.layer_board .mdl_btn_close.circle_btn:hover {
	background-color: #FDB53F;
	border: 1px solid #FDB53F;
}
@media screen and (max-width:480px) {
	.layer_board {
		width: 90%;
		margin: 3em auto;
		padding: 1.5em;
	}
	.layer_board .mdl_btn_close.circle_btn {
		width: 26px;
		height: 26px;
		background-size: 14px;
	}
}
/* --コンテンツ部分の装飾-- */
.layer_borad_title {
	font-size: 200%;
	font-weight: 200;
	color: #ED344E;
}
.layer_borad_content {
	margin: 1em auto 1.5em;
}
.layer_board .square_btn {
	display: block;
    position: relative;
    width:160px;
    margin: 0 auto;
    padding: 10px;
    border:2px solid #111;
    border-radius: 2px;
    font-size: 1.2em;
    font-weight: 300;
    color: #111;
    text-align: center;
    letter-spacing: 1px;
    text-decoration: none;
    transition: .15s;
}
.layer_board .square_btn:hover {
	background: #111;
	color: #fff;
}
				

スクリプトを実行させるコードを書く

「jquery-modalLayerBoard.js」を実行させるために、以下のコード(どちらか)をhtmlに記述します。
<script>タグで囲って、読み込んだ「jquery-modalLayerBoard.js」よりも下に記述してください。


					//デフォルト設定のまま動かす場合はこれ
$(function(){
	$('#layer_board_area').layerBoard();
})
//動きやアクセス回数を制御する場合は以下のように記述して数値を変える
$(function(){
	$('#layer_board_area').layerBoard({
		delayTime: 200,		//表示までの待ち時間
		fadeTime : 500,		//表示開始から表示しきるまでの時間
		alpha : 0.8,		//背景レイヤーの透明度
		limitMin : 0,		//何分経過後に再度表示するか/分(0で再表示なし)
		easing: 'linear',		//イージング
		limitCookie : 0	,	//cookie保存期間/日(0で開くたび毎回表示される)
		countCookie : 1000	//何回目のアクセスまで適用するか(cookie保存期間でリセット)
	});
})
				

たとえば、毎日最初のアクセス時だけモーダルウィンドウを開く場合は
limitCookie: 1, countCookie: 1
と設定します。

モーダルウィンドウを設置する

<body>タグ直後にモーダルウィンドウとなる部分のコードを書きます。

モーダルウィンドウ全体を囲う「#layer_board_area」、モーダル背景部分となる「.layer_board_bg」、モーダルコンテンツ部分となる「.layer_board」は除かないでください。


					
	<section>
			<!-- 
				ここに内容
			 -->
		<a href="#">閉じる</a>
	</section><!-- layer_board -->
<!-- layer_board_area -->
				

上記のコードではコンテンツ内容を囲う.layer_borad_contentを追加し、さらにモーダル上の四角い閉じるボタン(.square_btn)と右上の閉じるボタン(.circle_btn)を追加しています。背景をクリックしても閉じるので、不要であれば外して大丈夫。

モーダルウィンドウを手動で再表示させるボタンを設置するには、「.layer_board_btn」クラスをつけたボタンを設置してください。


					<button>モーダルウィンドウボタン</button>