ソースコード
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Modal</title>
<link rel="shortcut icon" href="img/favicon.png">
<link rel='stylesheet' href='modal.css'>
<script type='text/javascript' src='modal.js'></script>
</head>
<body>
<h1>Modal</h1>
<a class="modal-switch" href="#" data-target-selector="#modal">Modal-view</a>
<div id="modal">
<div class="modal-window">
Modal-window-sample<br>
</div>
</div>
</body>
</html>
html,body{
height:100%;
margin:0;
padding:0;
border:0;
}
body{
padding:20px;
}
*, *:before, *:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-o-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
#modal{
position:absolute;
display:none;
top:0;
left:0;
width:100%;
height:100%;
background-color:rgba(0,0,0,0.7);
border:0;
margin:0;
padding:0;
}
#modal[data-view="1"]{
display:block;
animation: modal-bg-view 0.3s linear forwards;
}
#modal[data-view="0"]{
display:block;
animation: modal-bg-hidden 0.3s linear forwards;
}
#modal > .modal-window{
position:absolute;
top:100px;
left:150px;
display:block;
border:1px solid #CCC;
border-top:20px solid #CCC;
border-radius:4px;
padding:10px 20px;
background-color:white;
white-space:nowrap;
}
#modal[data-view="1"] > .modal-window{
animation: modal-window-view 0.3s linear forwards;
}
#modal[data-view="0"] > .modal-window{
animation: modal-window-hidden 0.3s linear forwards;
}
@keyframes modal-bg-view{
0%{
opacity:0.0;
visibility:hidden;
}
100%{
opacity:1.0;
visibility:visible;
}
}
@keyframes modal-bg-hidden{
0%{
opacity:1.0;
visibility:visible;
}
100%{
opacity:0.0;
visibility:hidden;
}
}
@keyframes modal-window-view{
0%{
transform:translate(0,-50%);
}
100%{
transform:translate(0,0);
}
}
@keyframes modal-window-hidden{
0%{
transform:translate(0,0);
}
100%{
transform:translate(0,-50%);
}
}
;(function(__w,__d){
var $$event = function(e, m, f){
if (typeof e.addEventListener !== "undefined"){
e.addEventListener(m, f, false);
}
else if(typeof e.attachEvent !== "undefined"){
e.attachEvent('on' + m, function(){f.call(e , __w.event)});
}
};
var $$error = function(m){
console.log("[Modal] Error : "+m);
};
var $$ = function(){
// start
if(__d.readyState === "complete"){
this.start();
}
else if(__d.readyState === "interactive"){
$$event(window , "DOMContentLoaded" , (function(e){this.start(e)}).bind(this));
}
else{
$$event(window , "load" , (function(e){this.start(e)}).bind(this));
}
};
$$.prototype.start = function(){
var switches = __d.querySelectorAll(".modal-switch");
for(var i=0; i<switches.length; i++){
$$event(switches[i] , "click" , (function(e){this.click_modalSwitch(e)}).bind(this));
}
};
$$.prototype.click_modalSwitch = function(e){
if(!e || !e.currentTarget){
$$error("Not event");
return;
}
var selector = e.currentTarget.getAttribute("data-target-selector");
if(!selector){
$$error("Not selector");
return;
}
var target = __d.querySelector(selector);
if(!target){
$$error("Not target");
return;
}
this.toggle_modalSwitch(target);
return false;
};
$$.prototype.toggle_modalSwitch = function(element){
if(!element){
$$error("Not switch-element");
return;
}
var currentValue = element.getAttribute("data-view");
if(!currentValue){
$$event(element , "click" , (function(e){this.toggle_modalSwitch(e.currentTarget)}).bind(this));
}
if(currentValue === "1"){
element.setAttribute("data-view","0");
}
else{
element.setAttribute("data-view","1");
}
};
new $$;
})(window,document);
サンプル
画面イメージ
Modal-viewリンクをクリックすると・・・
解説
HTMLに事前に埋め込んだモーダルウィンドウのエレメントをcssアニメを使って表示させるというコードですが、JSでページ読み込み時に#modalを検索してイベント登録する仕様にしています。 "#modal > .modal-window"の構成が保たれていれば、内容はいかようにでも変更して使えるので、ページに組み込むのも簡単に行えます。 cssコードも、アニメ部分や属性セットの箇所を変更しなければ、デザインを大幅に変えても使えます。 肝心のjsコードは、jQueryなどは一切不要で、それぞれのエレメントのスイッチを切り替えるように処理していますが、ここはあまりいじらなくても使えるでしょう。 もっとコピペしやすい様に、codepenにもcreateしておきました。See the Pen Modal window by YugetaKoji (@geta1972) on CodePen.
モーダルウィンドウとは
ちなみに、気になったのでモーダルウィンドウという言葉を調べておきました。 wikipediaでは、コンピュータアプリケーションソフトウェアのユーザインタフェース設計において、何らかのウィンドウの子ウィンドウとして生成されるサブ要素のうち、ユーザーがそれに対して適切に応答しない限り、制御を親ウィンドウに戻さないもの。https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6 まさにalert関数のダイアログが意味どおりなのですが、こうしたデザインも進化していてニュアンスが変わってきている様にも思えますね。 もはやWEBデザインにおいてモーダルウィンドウと聞くと、ブラウザネイティブのダイアログではなく、html内で表示させる要素の方が意味が通ることが多い気もします。 これって職業病ですか???
0 件のコメント:
コメントを投稿