ボタンを押すと、ダイアログウィンドウが表示されます。タイトルバーをマウスドラッグしてダイアログウィンドウを移動できます。
ダイアログ表示1 ダイアログ表示2 ダイアログ表示1
この中は自由に記述
ダイアログ1のタイトル
この中は自由に記述
ダイアログ2のタイトル
閉じるソースコード
<div>
<button onclick="mamdlg.show('dlg1')" data-inline="true">ダイアログ表示1</button>
<br>
<br>
<button onclick="mamdlg.show('dlg2')" data-inline="true">ダイアログ表示2</button>
<br>
<br>
<button onclick="mamdlg.show('dlg1')" data-inline="true">ダイアログ表示1</button>
</div>
<div class="mamDlg" id="dlg1">
<div>
この中は自由に記述
<h3>ダイアログ1のタイトル</h3>
<input type="radio" id="rd1" name="rd"><label for="rd1">選択1</label>
<input type="radio" id="rd2" name="rd"><label for="rd2">選択2</label>
<input type="radio" id="rd3" name="rd"><label for="rd3">選択3</label>
</div>
</div>
<div class="mamDlg" id="dlg2">
<div>
この中は自由に記述
<h3>ダイアログ2のタイトル</h3>
<input type="checkbox" id="ch1"><label for="ch1">選択1</label>
<input type="checkbox" id="ch2"><label for="ch2">選択2</label>
<input type="checkbox" id="ch3"><label for="ch3">選択3</label>
<button onclick="mamdlg.close()">閉じる</button>
</div>
</div>
<script>
function TMamDlg(){
let i;
this.moving=false;
let style = document.createElement("style");
document.head.appendChild(style);
style.sheet.insertRule(".mamDlg{position:absolute;border:1px solid #666;margin:0;padding:0em;box-shadow:8px 16px 28px 0 rgba(0,0,0,0.5);background:#FFF;display:none;z-index:1000;}",0);
style.sheet.insertRule(
".mamDlg>div:nth-child(1){margin:0;padding:2px;height:16px;border-bottom:1px solid #666;background:linear-gradient(0deg,#DDD,#FFF);cursor:pointer;}",0
);
style.sheet.insertRule(
".mamDlg>div:nth-child(1)>a{display:inline-block;border-radius:50%;width:10px;height:10px;margin:2px;padding:0;border:1px solid #AAA;cursor:pointer;}",0
);
style.sheet.insertRule(
".mamDlgBackground{position:none;display:block;left:0;top:0;right:0;bottom:0;marigin:0;padding:0;background:rgba(0,0,0,0.3);display:block;}",0
);
style.sheet.insertRule(".mamDlg>div:nth-child(1)>a:nth-child(1){background:red;}",0);
style.sheet.insertRule(".mamDlg>div:nth-child(1)>a:nth-child(2){background:orange;}",0);
style.sheet.insertRule(".mamDlg>div:nth-child(1)>a:nth-child(3){background:green;}",0);
style.sheet.insertRule(".mamDlg>div:nth-child(2){display:block;background:none;padding:0em;margin:0.5em;font-size:16px;}",0);
this.dlg=document.querySelectorAll(".mamDlg");
for(i=0;i<this.dlg.length;i++){
this.dlg[i].addEventListener("mousedown",function(){event.stopPropagation();});
this.dlg[i].addEventListener("mouseup",function(){event.stopPropagation();});
this.dlg[i].addEventListener("touchstart",function(){event.stopPropagation();},{passive: true});
this.dlg[i].addEventListener("touchend",function(){event.stopPropagation();},{passive: true});
}
this.x=0;
this.y=0;
this.obj=null;//現在開いているdlg
this.down=function(event){
event.stopPropagation();
if(event.type=='mousedown'){
this.dlg.x=event.pageX-event.target.parentNode.offsetLeft;
this.dlg.y=event.pageY-event.target.parentNode.offsetTop;
}else if(event.type='touchstart'){
this.dlg.x=event.touches[0].pageX-event.target.parentNode.offsetLeft;
this.dlg.y=event.touches[0].pageY-event.target.parentNode.offsetTop;
}
this.dlg.obj=event.target.parentNode;
this.dlg.bar=event.target;
event.target.style.cursor='move';
this.dlg.moving=true;
}
this.move=function(event){
if(this.dlg.obj!==null && this.dlg.moving){
event.stopPropagation();
let xx,yy;
if(event.type=='mousemove'){
xx=(event.pageX - this.dlg.x);
yy=(event.pageY - this.dlg.y);
}else if(event.type='touchmove'){
xx=(event.touches[0].pageX - this.dlg.x);
yy=(event.touches[0].pageY - this.dlg.y);
}
window.getSelection().removeAllRanges();
if(xx<1){xx=1;}
if(yy<1){yy=1;}
if((window.innerWidth-90)<xx){xx=window.innerWidth-90;}
this.dlg.obj.style.left= xx+"px";
this.dlg.obj.style.top = yy+"px";
}
}
this.up=function(event){
if(this.dlg.obj!==null && this.dlg.moving){
event.stopPropagation();
this.dlg.bar.style.cursor=undefined;
this.dlg.bar.removeAttribute("style");
this.dlg.moving=false;
}
}
this.close=function(event){
this.obj=null;
for(i=0;i<this.dlg.length;i++){
this.dlg[i].style.display="none";
}
}
this.closew=function(event){
this.dlg.obj=null;
for(i=0;i<this.dlg.dlg.length;i++){
this.dlg.dlg[i].style.display="none";
}
}
this.show=function(dlg_id){
let r=event.target.getBoundingClientRect();
let dlg=document.getElementById(dlg_id);
dlg.style.display="block";
dlg.style.left=(r.left+window.pageXOffset+2)+"px";
dlg.style.top=(r.bottom+window.pageYOffset+2)+"px";
dlg.scrollIntoView({behavior:'smooth', block:'nearest', inline:'nearest'});
}
this.init=function(){
//init dialog
for(i=0;i<this.dlg.length;i++){
if(this.dlg[i].children.length==1){
let bd=this.dlg[i].children[0];
let bar=document.createElement("div");
let btn1=document.createElement("a");
let btn2=document.createElement("a");
let btn3=document.createElement("a");
btn1.addEventListener('click',{handleEvent:function(event){this.dlg.dlg[this.i].style.display="none";},dlg:this,i:i});
btn2.addEventListener('click',{handleEvent:function(event){this.dlg.dlg[this.i].style.display="none";},dlg:this,i:i});
btn3.addEventListener('click',{handleEvent:function(event){this.dlg.dlg[this.i].style.display="none";},dlg:this,i:i});
bar.appendChild(btn1);
bar.appendChild(btn2);
bar.appendChild(btn3);
this.dlg[i].insertBefore(bar,bd);
bar.addEventListener("mousedown",{handleEvent:this.down,dlg:this});
bar.addEventListener("touchstart",{handleEvent:this.down,dlg:this},{passive: true});
bar.addEventListener('mouseup',{handleEvent:this.up,dlg:this});
bar.addEventListener('touchend',{handleEvent:this.up,dlg:this},{passive: true});
}
}
}
window.addEventListener('mousedown',{handleEvent:this.closew,dlg:this});
window.addEventListener('touchstart',{handleEvent:this.closew,dlg:this});
window.addEventListener('mousemove',{handleEvent:this.move,dlg:this});
window.addEventListener('touchmove',{handleEvent:this.move,dlg:this});
window.addEventListener('mouseup',{handleEvent:this.up,dlg:this});
window.addEventListener('touchend',{handleEvent:this.up,dlg:this});
this.init();
}
window.addEventListener('DOMContentLoaded',function(){
mamdlg=new TMamDlg;
});
</script>
