You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何将垂直排列的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%);
    }
}

关键改动说明

  1. 容器.x设置弹性布局:添加display: flex实现水平排列,gap控制元素间距,flex-wrap: wrap保证小屏幕下自动换行,同时扩大max-width避免空间不足。
  2. 调整.radiobtn的显示方式:将display: block改为display: inline-block,配合flex布局实现水平排列。
  3. 修正样式错误:原代码中font-weight: 400px是无效值,改为font-weight: 400;去掉label的margin-bottom,避免垂直间距影响水平布局。
  4. 保留原有交互效果:所有单选按钮的选中动画、样式变化完全保留,仅修改布局方式。

内容的提问来源于stack exchange,提问作者DeepMagic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:30:20