如何用CSS实现扑克桌按钮均匀分布并支持响应式
扑克桌响应式按钮布局解决方案
问题场景
用HTML和CSS/SASS开发扑克桌,桌体样式已完成,需在桌体周围均匀分布10个按钮。此前用position固定定位无法实现响应式,窗口缩放时按钮无法保持均匀分布。
原HTML代码
<div class="game" id="game"> <div class="game-table" id="game-table"> <div class="cards"> <img class="card" src="/img/SVG-cards/ace_of_spades.svg"> <img class="card" src="/img/SVG-cards/ace_of_spades.svg"> <img class="card" src="/img/SVG-cards/ace_of_spades.svg"> <img class="card" src="/img/SVG-cards/ace_of_spades.svg"> <img class="card" src="/img/SVG-cards/ace_of_spades.svg"> </div> <div class="addplayer"> <button class="addplayer-button" id="player1">+</button> <button class="addplayer-button" id="player2">+</button> <button class="addplayer-button" id="player3">+</button> <button class="addplayer-button" id="player4">+</button> <button class="addplayer-button" id="player5">+</button> <button class="addplayer-button" id="player6">+</button> <button class="addplayer-button" id="player7">+</button> <button class="addplayer-button" id="player8">+</button> <button class="addplayer-button" id="player9">+</button> <button class="addplayer-button" id="player10">+</button> </div> </div> </div>
原CSS/SASS代码
body { margin: 0; background-color: rgb(223, 223, 223); } .game { text-align: center; } .game-table { position: absolute; display: block; box-sizing: border-box; width: 100%; height: 100vh; max-width: 1800px; min-height: 390px; max-height: 820px; background: rgb(8,128,6); background: radial-gradient(circle, rgba(8,128,6,1) 0%, rgba(38,52,38,1) 100%); border: 15px solid #595856; border-radius: 10000px; box-shadow: 0 0 15px black; } .cards { position: relative; top: 35%; } .card { display: inline-block; height: 30vh; width: 15vw; max-width: 230px; min-height: 100px; max-height: 250px; margin: 0 0; } .addplayer { button { height: 5vw; width: 5vw; min-width: 40px; max-width: 80px; min-height: 40px; max-height: 80px; background-color: rgba(128, 128, 128, 0.514); border-radius: 10000px; } } #player1 { position: absolute; top: 5px; right: 50%; }
两种响应式解决方案
方案一:CSS Grid实现矩形四周分布
适合按钮分布在桌体的上下左右及四角,响应式适配性强,窗口缩放时自动保持相对位置。
修改后的CSS/SASS代码:
body { margin: 0; background-color: rgb(223, 223, 223); } .game { text-align: center; position: relative; width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; } .game-table { position: relative; box-sizing: border-box; width: 90%; height: 90vh; max-width: 1800px; min-height: 390px; max-height: 820px; background: rgb(8,128,6); background: radial-gradient(circle, rgba(8,128,6,1) 0%, rgba(38,52,38,1) 100%); border: 15px solid #595856; border-radius: 50%; box-shadow: 0 0 15px black; } .cards { position: relative; top: 35%; } .card { display: inline-block; height: 30vh; width: 15vw; max-width: 230px; min-height: 100px; max-height: 250px; margin: 0; } .addplayer { position: absolute; inset: 0; display: grid; grid-template-columns: auto 1fr auto; grid-template-rows: auto 1fr auto; padding: 10px; } /* 为10个按钮分配网格位置 */ .addplayer-button:nth-child(1) { grid-row: 1; grid-column: 2; } /* 顶部中间 */ .addplayer-button:nth-child(2) { grid-row: 1; grid-column: 3; } /* 右上 */ .addplayer-button:nth-child(3) { grid-row: 2; grid-column: 3; } /* 右侧中间 */ .addplayer-button:nth-child(4) { grid-row: 3; grid-column: 3; } /* 右下 */ .addplayer-button:nth-child(5) { grid-row: 3; grid-column: 2; } /* 底部中间 */ .addplayer-button:nth-child(6) { grid-row: 3; grid-column: 1; } /* 左下 */ .addplayer-button:nth-child(7) { grid-row: 2; grid-column: 1; } /* 左侧中间 */ .addplayer-button:nth-child(8) { grid-row: 1; grid-column: 1; } /* 左上 */ .addplayer-button:nth-child(9) { grid-row: 1; grid-column: 2; justify-self: end; margin-right: 20%; } .addplayer-button:nth-child(10) { grid-row: 1; grid-column: 2; justify-self: start; margin-left: 20%; } .addplayer-button { height: 5vw; width: 5vw; min-width: 40px; max-width: 80px; min-height: 40px; max-height: 80px; background-color: rgba(128, 128, 128, 0.514); border-radius: 50%; border: none; cursor: pointer; }
方案二:Transform角度计算实现环形均匀分布
完美匹配圆形扑克桌,按钮围绕桌体环形均匀排列,缩放时自动适配。
修改后的CSS/SASS代码:
body { margin: 0; background-color: rgb(223, 223, 223); } .game { text-align: center; position: relative; width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; } .game-table { position: relative; box-sizing: border-box; width: 90%; height: 90vh; max-width: 1800px; min-height: 390px; max-height: 820px; background: rgb(8,128,6); background: radial-gradient(circle, rgba(8,128,6,1) 0%, rgba(38,52,38,1) 100%); border: 15px solid #595856; border-radius: 50%; box-shadow: 0 0 15px black; } .cards { position: relative; top: 35%; } .card { display: inline-block; height: 30vh; width: 15vw; max-width: 230px; min-height: 100px; max-height: 250px; margin: 0; } .addplayer { position: absolute; inset: -5vw; border-radius: 50%; } .addplayer-button { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); height: 5vw; width: 5vw; min-width: 40px; max-width: 80px; min-height: 40px; max-height: 80px; background-color: rgba(128, 128, 128, 0.514); border-radius: 50%; border: none; cursor: pointer; } /* 10个按钮,每个间隔36度(360/10) */ .addplayer-button:nth-child(1) { transform: translate(-50%, -50%) rotate(0deg) translate(calc(50vh - 2.5vw)) rotate(0deg); } .addplayer-button:nth-child(2) { transform: translate(-50%, -50%) rotate(36deg) translate(calc(50vh - 2.5vw)) rotate(-36deg); } .addplayer-button:nth-child(3) { transform: translate(-50%, -50%) rotate(72deg) translate(calc(50vh - 2.5vw)) rotate(-72deg); } .addplayer-button:nth-child(4) { transform: translate(-50%, -50%) rotate(108deg) translate(calc(50vh - 2.5vw)) rotate(-108deg); } .addplayer-button:nth-child(5) { transform: translate(-50%, -50%) rotate(144deg) translate(calc(50vh - 2.5vw)) rotate(-144deg); } .addplayer-button:nth-child(6) { transform: translate(-50%, -50%) rotate(180deg) translate(calc(50vh - 2.5vw)) rotate(-180deg); } .addplayer-button:nth-child(7) { transform: translate(-50%, -50%) rotate(216deg) translate(calc(50vh - 2.5vw)) rotate(-216deg); } .addplayer-button:nth-child(8) { transform: translate(-50%, -50%) rotate(252deg) translate(calc(50vh - 2.5vw)) rotate(-252deg); } .addplayer-button:nth-child(9) { transform: translate(-50%, -50%) rotate(288deg) translate(calc(50vh - 2.5vw)) rotate(-288deg); } .addplayer-button:nth-child(10) { transform: translate(-50%, -50%) rotate(324deg) translate(calc(50vh - 2.5vw)) rotate(-324deg); }
方案选择建议
- 若按钮只需分布在桌体的上下左右及四角,选CSS Grid方案,代码更易维护。
- 若需要按钮围绕圆形桌体环形均匀排列,选Transform角度方案,视觉效果更贴合扑克桌场景。
内容的提问来源于stack exchange,提问作者NickAutomatic
相关产品推荐
相关产品推荐

