求助:如何将垂直排列的Radio Button改为水平排列
解决自定义单选按钮垂直转水平布局问题
原代码中单选按钮默认垂直排列,核心问题在于容器和单选按钮元素的块级布局设置,以下是修改方案:
原问题代码
HTML代码
<div class="x"> <div class="radiobtn"> <input type="radio" id="huey" name="drone" value="huey" checked /> <label for="huey">Word</label> </div> <div class="radiobtn"> <input type="radio" id="dewey" name="drone" value="dewey" /> <label for="dewey">Powerpoint</label> </div> <div class="radiobtn"> <input type="radio" id="louie" name="drone" value="louie" /> <label for="louie">Speech</label> </div> <div class="radiobtn"> <input type="radio" id="suey" name="drone" value="suey" /> <label for="suey">Youtube</label> </div> </div>
原SCSS代码
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500&family=Roboto:wght@300;400&display=swap'); $accentcolor: #fcae2c; $lightcolor: #fff; $darkcolor: rgb(110, 110, 110); .x { max-width: 250px; position: relative; margin: 50px auto 0; font-size: 15px; } .radiobtn { position: relative; display: block; label { display: block; background: lighten($accentcolor, 30%); color: $darkcolor; border-radius: 5px; padding: 10px 20px; border: 2px solid lighten($accentcolor, 20%); margin-bottom: 5px; font-family: "Montserrat", sans-serif; font-weight: 400px; font-size: 16px; cursor: pointer; &:after, &:before { content: ""; position: absolute; right: 11px; top: 11px; width: 20px; height: 20px; border-radius: 3px; background: lighten($accentcolor, 15%); } &:before { background: transparent; transition: 0.1s width cubic-bezier(0.075, 0.82, 0.165, 1) 0s, 0.3s height cubic-bezier(0.075, 0.82, 0.165, 2) 0.1s; z-index: 2; overflow: hidden; background-repeat: no-repeat; background-size: 13px; background-position: center; width: 0; height: 0; background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNS4zIDEzLjIiPiAgPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE0LjcuOGwtLjQtLjRhMS43IDEuNyAwIDAgMC0yLjMuMUw1LjIgOC4yIDMgNi40YTEuNyAxLjcgMCAwIDAtMi4zLjFMLjQgN2ExLjcgMS43IDAgMCAwIC4xIDIuM2wzLjggMy41YTEuNyAxLjcgMCAwIDAgMi40LS4xTDE1IDMuMWExLjcgMS43IDAgMCAwLS4yLTIuM3oiIGRhdGEtbmFtZT0iUGZhZCA0Ii8+PC9zdmc+); } } input[type="radio"] { display: none; position: absolute; width: 100%; appearance: none; &:checked + label { background: lighten($accentcolor, 15%); animation-name: blink; animation-duration: 1s; border-color: $accentcolor; &:after { background: $accentcolor; } &:before { width: 20px; height: 20px; } } } } @keyframes blink { 0% { background-color: lighten($accentcolor, 15%); } 10% { background-color: lighten($accentcolor, 15%); } 11% { background-color: lighten($accentcolor, 20%); } 29% { background-color: lighten($accentcolor, 20%); } 30% { background-color: lighten($accentcolor, 15%); } 50% { background-color: lighten($accentcolor, 20%); } 45% { background-color: lighten($accentcolor, 15%); } 50% { background-color: lighten($accentcolor, 20%); } 100% { background-color: lighten($accentcolor, 15%); } }
修改后的SCSS代码
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500&family=Roboto:wght@300;400&display=swap'); $accentcolor: #fcae2c; $lightcolor: #fff; $darkcolor: rgb(110, 110, 110); .x { max-width: 800px; // 扩大容器宽度,避免水平排列空间不足 position: relative; margin: 50px auto 0; font-size: 15px; display: flex; // 开启弹性布局,让子元素水平排列 gap: 10px; // 控制单选按钮之间的间距 flex-wrap: wrap; // 空间不足时自动换行 } .radiobtn { position: relative; display: inline-block; // 改为行内块级元素,配合flex布局 label { display: block; background: lighten($accentcolor, 30%); color: $darkcolor; border-radius: 5px; padding: 10px 20px; border: 2px solid lighten($accentcolor, 20%); margin-bottom: 0; // 去掉垂直间距 font-family: "Montserrat", sans-serif; font-weight: 400; // 修正原代码错误:400px改为400 font-size: 16px; cursor: pointer; &:after, &:before { content: ""; position: absolute; right: 11px; top: 11px; width: 20px; height: 20px; border-radius: 3px; background: lighten($accentcolor, 15%); } &:before { background: transparent; transition: 0.1s width cubic-bezier(0.075, 0.82, 0.165, 1) 0s, 0.3s height cubic-bezier(0.075, 0.82, 0.165, 2) 0.1s; z-index: 2; overflow: hidden; background-repeat: no-repeat; background-size: 13px; background-position: center; width: 0; height: 0; background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNS4zIDEzLjIiPiAgPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE0LjcuOGwtLjQtLjRhMS43IDEuNyAwIDAgMC0yLjMuMUw1LjIgOC4yIDMgNi40YTEuNyAxLjcgMCAwIDAtMi4zLjFMLjQgN2ExLjcgMS43IDAgMCAwIC4xIDIuM2wzLjggMy41YTEuNyAxLjcgMCAwIDAgMi40LS4xTDE1IDMuMWExLjcgMS43IDAgMCAwLS4yLTIuM3oiIGRhdGEtbmFtZT0iUGZhZCA0Ii8+PC9zdmc+); } } input[type="radio"] { display: none; position: absolute; width: 100%; appearance: none; &:checked + label { background: lighten($accentcolor, 15%); animation-name: blink; animation-duration: 1s; border-color: $accentcolor; &:after { background: $accentcolor; } &:before { width: 20px; height: 20px; } } } } @keyframes blink { 0% { background-color: lighten($accentcolor, 15%); } 10% { background-color: lighten($accentcolor, 15%); } 11% { background-color: lighten($accentcolor, 20%); } 29% { background-color: lighten($accentcolor, 20%); } 30% { background-color: lighten($accentcolor, 15%); } 50% { background-color: lighten($accentcolor, 20%); } 45% { background-color: lighten($accentcolor, 15%); } 50% { background-color: lighten($accentcolor, 20%); } 100% { background-color: lighten($accentcolor, 15%); } }
关键改动说明
- 容器
.x设置弹性布局:添加display: flex实现水平排列,gap控制元素间距,flex-wrap: wrap保证小屏幕下自动换行,同时扩大max-width避免空间不足。 - 调整
.radiobtn的显示方式:将display: block改为display: inline-block,配合flex布局实现水平排列。 - 修正样式错误:原代码中
font-weight: 400px是无效值,改为font-weight: 400;去掉label的margin-bottom,避免垂直间距影响水平布局。 - 保留原有交互效果:所有单选按钮的选中动画、样式变化完全保留,仅修改布局方式。
内容的提问来源于stack exchange,提问作者DeepMagic
相关产品推荐
相关产品推荐

