在 ReactJS 环境中设置复选框样式

Posted

技术标签:

【中文标题】在 ReactJS 环境中设置复选框样式【英文标题】:Styling a checkbox in a ReactJS environment 【发布时间】:2017-07-26 08:32:47 【问题描述】:

我正在尝试在 IE11 的 ReactJS 环境中设置复选框的样式,但似乎没有取得多大成功。有人可以请教吗?代码如下:

CSS:

 .squared  
      input[type=checkbox] 
        border-radius: 4px;
        background: #ff0000;
        width:100px;
    

html

<Col numCol=2 className="col-w-select squared">
  <input style=float: 'left', borderColor: 'red', border: '3px' type="checkbox" checked=isChecked /> <span className=(String(currentlyClicked) !== String(item[idField])) ? 'l-collapse-icon' : 'l-expand-icon'>&nbsp;</span>
</Col>

请注意,在输入标签中应用样式属性 本身好像没有影响!?

谢谢

【问题讨论】:

1. CSS 语法不支持嵌套。你使用像 LESS/SASS 这样的预处理器吗? 2.内联样式应该可以工作,但是速记border会覆盖borderColor,并且对复选框应用边框可能确实没有效果。 float 工作正常。这和 React 关系不大,在纯 HTML+CSS 中效果也是一样的。 @jnoweb,我的回答对你有用吗?如果是,请考虑将其标记为“已接受”。 【参考方案1】:

这里的环境基本上与 CSS 样式元素无关。 真正的问题是你试图设置一个在浏览器中不起作用的复选框。

MDN says 对此有何评论:

单独设置复选框或单选按钮的样式有点麻烦。例如,复选框和单选按钮的大小并不是真的要更改,如果您尝试这样做,浏览器的反应可能会非常不同。

解决方法是创建一个“假”复选框并按照您想要的方式设置样式,同时隐藏“真实”复选框。

以下是我在项目中使用的实现。上面的 MSN 链接也提供了一些替代 (CSS) 解决方案...

var Demo = React.createClass(
  getInitialState() 
    return isChecked: false;
  ,
  
  toggleCheck() 
    this.setState(isChecked: !this.state.isChecked);
  ,
  
  render: function() 
    return (
      <span onClick=this.toggleCheck>
        <input type="checkbox" checked=this.state.isChecked />
        <span></span>
      </span>
    );
  
);

ReactDOM.render(
  <Demo />,
  document.getElementById('container')
);
input[type="checkbox"] 
  display: none;

input[type="checkbox"] + span 
  display: inline-block;
  position: relative;
  top: -1px;
  width: 12px;
  height: 12px;
  margin: -1px 0px 0 0;
  vertical-align: middle;
  background: white left top no-repeat;
  border: 1px solid #ccc;
  cursor: pointer;

input[type="checkbox"]:checked + span 
  background: #D9534F -19px top no-repeat;


input[type="checkbox"] + span 
  margin-right: 4px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="container"></div>

如果您使用的是react-bootstrap,只需将上面的 JSX 位替换为:

<Checkbox onChange=this.toggleCheck checked=this.toggleCheck inline>
  <span></span>
</Checkbox>

祝你好运。

【讨论】:

令人惊讶的是,我在收听onChange 事件时无法获得e.target.namee.target.id。它返回未定义,因为输入不在 DOM 中。那么在这种情况下我们该怎么办呢?【参考方案2】:

只需将此代码添加到您的 CSS,您就可以设置复选框的样式!

input[type=checkbox] 
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    /* create custom checkbox appearance */
    display: inline-block;
    width: 25px;
    height: 25px;
    padding: 6px;
    /* background-color only for content */
    background-clip: content-box;
    border: 1.5px solid #bbbbbb;
    border-radius: 6px;
    background-color: #e7e6e7;
    margin-left: 15px;
    margin-right: 15px;

    &:checked
        background-color: #ff0000;
    

    &:focus
        outline: none !important;
    

【讨论】:

【参考方案3】:

在@Chrisanswer 之后,我已经更改了一些样式以满足我的需要,分享以防其他人正在寻找类似的东西。没有在IE11中测试过。

谢谢!

var Demo = React.createClass(
  getInitialState() 
    return isChecked: false;
  ,
  
  toggleCheck() 
    this.setState(isChecked: !this.state.isChecked);
  ,
  
  render: function() 
    return (
      <span className="checkbox">
        <input type="checkbox" checked=this.state.isChecked />
        <span className="wrapper" onClick=this.toggleCheck>
            <span className="knob"></span>
        </span>
      </span>
    );
  
);

ReactDOM.render(
  <Demo />,
  document.getElementById('container')
);
.checkbox input[type="checkbox"] 
    display: none;

.checkbox input[type="checkbox"]:checked + .wrapper 
    background-color: #8cde95;

.checkbox input[type="checkbox"]:checked + .wrapper .knob 
    left: 20px;

.checkbox .wrapper 
    background-color: #666;
    border: 1px solid #666;
    border-radius: 10px;
    width: 42px;
    height: 20px;
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    outline: none;

.checkbox .knob 
    background-color: white;
    border: 1px solid #666;
    border-radius: 100%;
    display: inline-block;
    margin-left: 2px;
    position: relative;
    width: 16px;
    height: 16px;
    left: 0;
    transition: left 100ms ease-in-out 0s;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

【讨论】:

以上是关于在 ReactJS 环境中设置复选框样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在引导表中设置单选按钮或复选框的样式?

在 React JS 中设置复选框值

如何在剃须刀 CheckBoxFor() 中设置引导复选框

如何使用样式化组件在 reactjs 中设置 svg 样式

如何使用类对象在 Reactjs 中设置功能性无状态组件的样式

ReactJS - CSS:在样式对象中设置 trasitionProperty 不起作用