console
var div = document.getElementById("chessboard");
let value = 50
div.setAttribute("style",`--w:${Math.min(value++,50)}px`);
function a(){
value = 20
setInterval(()=>{
div.setAttribute("style",`--w:${Math.min(value++,50)}px`);
},100)
}
console.log("棋盘创建完毕")
const pieceAll = [
{type:'车',posi:[[0,0],[8,0]]},
{type:'马',posi:[[1,0],[7,0]]},
{type:'相',posi:[[2,0],[6,0]]},
{type:'士',posi:[[3,0],[5,0]]},
{type:'将',posi:[[4,0]]},
{type:'炮',posi:[[1,2],[7,2]]},
{type:'兵',posi:[[0,3],[2,3],[4,3],[6,3],[8,3]]}
];
const posiStr = function(p){
let [x,y] = p;
return `--x:${x*(value-1)}px;--y:${y*(value-1)}px`
}
const reflect = function(p){
let [x,y] = p;
return posiStr([x,9-y])
}
let pieceAll_dom = document.getElementById("pieceAll");
function player(group=0){
let player = new Object;
player.group = group;
player.toName = function(type){
let names = {'车':['車','俥'],'马':['马','馬'],'相':['象','相'],'士':['士','仕'],'将':['將','帥'],
'炮':['炮','炮'],'兵':['兵','卒']}
return names[type][this.group];
}
return player;
}
let playerAll = [];
playerAll.push(new player(),new player(1));
console.log(playerAll)
playerAll.forEach(user=>{
pieceAll.forEach(item=>{
let posi = item.posi
posi.forEach(p=>{
let newPiece = document.createElement("div")
let name = user.toName(item.type);
let cla = user.group ? 'piece red' : 'piece';
let posi = user.group ? reflect(p) : posiStr(p)
newPiece.setAttribute("data-name",name);
newPiece.setAttribute('class',cla);
newPiece.setAttribute("style",posi);
pieceAll_dom.appendChild(newPiece);
newPiece.onclick = function(e,newPiece,cla){
console.log(e,newPiece,this,event,cla)
}
})
})
})
console.log("棋子布置完毕")
<div style="position: relative;height: max-content;width: max-content;margin: auto;">
<div id="chessboard" class="half" data-title="楚 河 汉 界" style="--w:50px"></div>
<div id="pieceAll">
</div>
</div>
:root{
--c:#fff;
}
body{
height: 100vh;
display: flex;
background: var(--c);
}
#chessboard {
--w:var(--w,50px);
--w4:calc(var(--w)*4);
--w5:calc(var(--w)*5);
--w2:calc(var(--w)*2);
--w3:calc(var(--w)*3);
--x:calc(var(--w)*1.44);
--xm:calc(var(--x)*2/21);
width: calc(var(--w)*8 + 1px);
height: calc(var(--w)*9 + 1px);
display:flex;justify-content:center;align-items:center;
}
#chessboard::after {
content: attr(data-title);
background:var(--c);
line-height: 110%;
font-size: calc(var(--w)/50*28);
text-align: center;
}
.half {
background:
repeating-linear-gradient(#000, #000 1px, transparent 1px, transparent var(--w)),
repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent var(--w)),
repeating-linear-gradient(90deg, #000, #000 1px, transparent 1px, transparent calc(100% - 1px)),
repeating-linear-gradient(to left bottom,transparent,transparent var(--xm),var(--c) var(--xm),var(--c) calc(var(--xm)*2)),
linear-gradient(to right bottom,transparent calc(var(--x) - 2px),#333 var(--x), transparent calc(var(--x) - 2px)),
repeating-linear-gradient(to right bottom,transparent,transparent var(--xm),var(--c) var(--xm),var(--c) calc(var(--xm)*2)),
linear-gradient(to left bottom,transparent calc(var(--x) - 2px),#333 var(--x), transparent calc(var(--x) - 2px)),
repeating-linear-gradient(to left bottom,transparent,transparent var(--xm),var(--c) var(--xm),var(--c) calc(var(--xm)*2));
background-repeat: no-repeat;
background-size:100% 50%, 100% var(--w4),100% var(--w5),
var(--w2) var(--w2),var(--w2) var(--w2),
var(--w2) var(--w2),var(--w2) var(--w2);
background-position: 0 0, 0 0, 0 0,
var(--w3) 0,var(--w3) 0,var(--w3) 0,var(--w3) 0;
outline: 1px solid #000;
outline-offset: 5px;
position: relative;
-webkit-box-reflect: below -100%;
}
#chessboard::before {
--l:calc(var(--w)/5);
--left:calc(var(--l)*-1.5 + 1px);
--l1:calc(var(--l));
--l2:calc(var(--l)*2);
--l3:calc(var(--l)*3);
--l4:calc(var(--l)*4);
--w2:calc(var(--w)*2);
--w3:calc(var(--w)*3);
--w6:calc(var(--w)*6);
--lb:calc(var(--l)/2);
--lt1:calc(var(--w2) - var(--lb));
--lt1e:calc(var(--w2) + var(--lb));
--lt2:calc(var(--w3) - var(--lb));
--lt2e:calc(var(--w3) + var(--lb));
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
repeating-linear-gradient(to right,#000, #000 var(--l1), transparent var(--l1), transparent var(--w6)),
repeating-linear-gradient(to right, #000, #000 1px, transparent 1px, transparent var(--w6)),
repeating-linear-gradient(to right,#000, #000 var(--l1), transparent var(--l1), transparent var(--w6)),
repeating-linear-gradient(to right, #000, #000 1px, transparent 1px, transparent var(--w6)),
repeating-linear-gradient(to right,#000, #000 var(--l1), transparent var(--l1), transparent var(--w2)),
repeating-linear-gradient(to right, #000, #000 1px, transparent 1px, transparent var(--w2)),
repeating-linear-gradient(to right,#000, #000 var(--l1), transparent var(--l1), transparent var(--w2)),
repeating-linear-gradient(to right, #000, #000 1px, transparent 1px, transparent var(--w2));
background-repeat: no-repeat;
background-position:
calc(var(--w) + var(--left)) var(--lt1),calc(var(--w) - var(--lb)) calc(var(--lt1) - var(--l)),
calc(var(--w) + var(--left)) var(--lt1e),calc(var(--w) - var(--lb)) calc(var(--lt1e)),
var(--left) var(--lt2),var(--lb) calc(var(--lt2) - var(--l)),
var(--left) var(--lt2e),var(--lb) calc(var(--lt2e));
background-size:
calc(100% - var(--left)) 1px, calc(100% - var(--left)) var(--l),
calc(100% - var(--left)) 1px, calc(100% - var(--left)) var(--l),
calc(100% - var(--left)) 1px, calc(100% - var(--left)) var(--l),
calc(100% - var(--left)) 1px, calc(100% - var(--left)) var(--l);
-webkit-box-reflect: right -100%
}
pieceAll{
position: absolute;
top: 0;
width: 100%;
height: 100%;
}
.piece{
--c: #461600;
width: 40px;
height: 40px;
position: absolute;
top:calc(var(--y,0px) - 20px);
left: calc(var(--x,0px) - 20px);
border-radius: 100%;
box-shadow: 2px 2px 4px 1px #999;
display:flex;justify-content:center;align-items:center;
font-size: 28px;
font-weight: bold;
font-family: cursive;
color:transparent;
background: radial-gradient(#ffefe0,#ffd0a3 55%,#b32400 90%,#000 1%);
transition: all 0.05s
}
.piece:hover{
transform: scale(1.3)
}
.piece::after{
content: attr(data-name);
position: absolute;
background:black;
-webkit-background-clip: text;
margin-left: 1px;
}
.piece.red::after{
background:
linear-gradient(to bottom,#6e0000,#6e0000 2%,transparent 20%,transparent 86%,#ff7a2a 96%),
linear-gradient(to right,#6e0000,#6e0000 2%,#e10000 20%,#e10000 86%,#ff7a2a 96%);
-webkit-background-clip: text;
}
.piece.red::before{
content: attr(data-name);
position: absolute;
text-shadow: -0.5px -0.5px 0px var(--c),-1px -1px 0px var(--c),-1.5px -1px 0px var(--c);
margin-left: 1px;
}