【问题标题】:CSS in React makes all buttons disappear?React 中的 CSS 让所有按钮消失?
【发布时间】:2022-01-20 01:38:27
【问题描述】:

我在 NavBar 中的按钮的 css 应用于每个按钮,但它不应该这样做。这会导致我实际上想要保持可见的名为“搜索”的按钮(参见图片1)消失,因为 NavBar.css 中有一个媒体查询。 NavBar.css 仅适用于 NavBar.js,为什么会导致每个按钮都消失?

窗口大时的图片: 窗口小的时候的图片。 “搜索”按钮消失了,这不是本意。

//App.js
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import './App.css';
import Home from './Home';
import NavBar_ from './NavBar_';

function App() {
  return (
    <>
      <Router>
        <NavBar_ />
        <Routes>
          <Route path='/' exact element={<Home />} />
        </Routes>
      </Router>
    </>
  );
}
export default App;

//NavBar_.js
import React from 'react'
import Button from './Button'
import './NavBar_.css'

const NavBar_ = () => {
    return (
        <div>
            <Button />
        </div>
    )
}
export default NavBar_

//Home.js
import React from 'react'
import SearchBar from './SearchBar'

const Home = () => {
    return (
        <div className='main-hero'>
            <div className='hero-bar'>
                <SearchBar />
            </div>


        </div>
    )
}

export default Home

//SearchBar.js
import React from 'react'

const SearchBar = () => {
    return (
        <>
            <form>
                <input
                    className='search-bar'
                    id='search-location'
                    type='text'
                    placeholder='Town'
                />
                <button className='submit-search' type='submit'>
                    Search
                </button>

            </form>

        </>
    )
}

export default SearchBar

//Button.js
import React from 'react'
import './Button.css'
import { Link } from 'react-router-dom'

const Button = () => {
    return (
        <Link to="/sign-up">
            <button>Sign Up</button>
        </Link>
    )
};

export default Button;

//NavBar_.css
@media screen and (max-width: 960px) {
    button {
        display: none;
    }
}

【问题讨论】:

  • CSS 仍然是 CSS,即使您将其嵌入到 react 应用程序中也是如此。您的 CSS 规则适用于所有 button 元素。如果您不希望这样,请使用 className 将其范围限定为特定按钮。
  • 那么即使 NavBar.css 只在 NavBar.js 内部使用,如果在 NavBar.css 中使用全局名称,它的 css 将全局应用?
  • 没错。 React 不会将 CSS 限定为恰好包含 CSS 规则的组件。如果你定义了一个全局规则,它将保持全局。
  • 太糟糕了。谢谢

标签: html css reactjs


【解决方案1】:

CSS 规则对于它们运行的​​页面是全局的。这意味着您包含在 NavBar 中的 CSS 仍将在范围内并在全球范围内应用。 NavBar.css 无条件地将display: none 规则应用于所有按钮。

@media screen and (max-width: 960px) {
  button {
    display: none;
  }
}

使用classid 来限制规则的范围。例如,仅具有 "signup" 类属性的 button 元素。

Class Selectors

NavBar_.css

@media screen and (max-width: 960px) {
  button.navbar {
    display: none;
  }
}

NavBar_.js

const NavBar_ = () => {
  return (
    <div>
      <Button className="navbar" />
    </div>
  )
}

按钮.css

button.signup {
  ... signup button rules ...
}

Button.js

import React from 'react'
import './Button.css'
import { Link } from 'react-router-dom'

const Button = () => {
  return (
    <Link to="/sign-up">
      <button className="signup">Sign Up</button>
    </Link>
  )
};

【讨论】:

  • NavBar_.css中的“navbar”必须改成“signup”,否则不起作用。
【解决方案2】:

当您在 React 中为组件设置样式时,实际上它适用于您拥有的每个组件。所以你应该使用 specificclassid 作为那个特殊元素,或者使用 CSS modulestyled component 作为样式。

我更喜欢css module。在此解决方案中,您将 Button.css 更改为 Button.module.css 并将其导入到 Button.js

import classes from './Button.module.css'

这样,你就有了只为Button.js的特殊风格。

【讨论】:

    【解决方案3】:

    你可以试试这两种方法。一种是通过添加符号&gt; 来添加NavBar 内部元素。像这样:

    //NavBar_.css
    @media screen and (max-width: 960px) {
      >  button {
            display: none;
        }
    }
    

    或将类名添加到导航栏并使用它

    【讨论】:

    • 这是不正确的。选择器&gt; button 永远不会匹配任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多