【问题标题】:How to apply CSS transition on hide?如何在隐藏上应用 CSS 过渡?
【发布时间】:2021-08-14 05:08:24
【问题描述】:

我有一个引导程序navbar,它在折叠时会显示它之外的项目。折叠时,我有一个div,它作为覆盖整个页面的覆盖层,因此navbar 菜单不会停留在页面的任何内容之上。当我隐藏菜单时会出现问题:div 立即消失,并且在菜单的隐藏过渡期间它停留在页面内容的顶部。

我想保留菜单过渡,那么如何在 div 隐藏时应用过渡?我尝试了很多方法,但它们都只在 div 显示时应用过渡,而不是在隐藏时应用。

请查看此演示:https://codesandbox.io/s/d31eo

反应(演示):

import React, { Component } from "react";

import { Container, Nav, Navbar } from "react-bootstrap";

import "./styles.css";
import "bootstrap/dist/css/bootstrap.min.css";

export default class NavBar extends Component {
  constructor(props) {
    super(props);
    this.state = {
      open: false,
      data: []
    };
  }

  componentDidMount() {
    this.setState({
      data: [
        { name: "Test1" },
        { name: "Test2" },
        { name: "Test3" },
        { name: "Test4" }
      ]
    });
  }

  onClick = () => {
    this.setState({ open: !this.state.open });
  };

  render() {
    return (
      <>
        <Navbar
          className={`nav ${this.state.open ? "open" : ""}`}
          expand="lg"
          sticky="top"
        >
          <Container>
            <Navbar.Toggle aria-controls="navbar-menu" onClick={this.onClick} />
            <Navbar.Collapse id="navbar-menu">
              <Nav className="ml-auto">
                {this.state.data.map((category) => (
                  <Nav.Link href="#" key={`category-${category.name}`}>
                    <span className="link">{category.name}</span>
                  </Nav.Link>
                ))}
              </Nav>
            </Navbar.Collapse>
          </Container>
        </Navbar>
        <div className={`overlay ${this.state.open ? "open" : ""}`} />
        <img src="https://images.unsplash.com/reserve/bOvf94dPRxWu0u3QsPjF_tree.jpg?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxMjA3fDB8MXxzZWFyY2h8Nnx8bmF0dXJhbHx8MHx8fA&ixlib=rb-1.2.1&q=80&w=1080" />
      </>
    );
  }
}

CSS(演示):

.nav {
  min-height: 55px;
  width: 100%;
  background-color: white;
  border-bottom: 1px solid #979797;
}

.link {
  font-size: 14px;
  color: #3e433e;
  line-height: 17px;
  padding: 5px;
  text-transform: uppercase;
}

.link:hover {
  color: #000000;
  text-decoration: none;
}

.overlay {
  position: fixed;
}

@media (max-width: 1170px) {
  .collapsing {
    position: absolute !important;
    z-index: 3;
    width: 100%;
    top: 75px;
  }

  .collapse.show {
    display: block;
    position: absolute;
    z-index: 3;
    width: 100%;
    top: 75px;
  }

  .overlay.open {
    height: 100%;
    width: 100%;
    position: fixed;
    z-index: 2;
    top: 55px; /* navbar min-heigth */
    left: 0;
    background-color: white;
  }
}

【问题讨论】:

  • 引导页面上的第一个演示是否与您想要的输出不同? getbootstrap.com/docs/4.0/components/navbar
  • 是的!我想在导航栏之外显示可折叠的内容。您可以查看演示以了解我在说什么:)
  • 好的!我想你可以从上面复制演示代码
  • 如果答案不起作用,则不确定问题是否清楚。你能试着更简洁地总结一下吗?为什么导航栏项目显示在外面?为什么会有 div 覆盖?你能对你想要达到的目标给出一个简单的非技术解释吗?
  • 我不知道如何更简洁,真诚。我只想修复 CSS 过渡。简明扼要。导航栏项目显示在外部,因为这是设计的先决条件。 div 覆盖只是我的一个想法,我想应该有一种方法来实现我想要的没有它。我能想到的最简单的解释:添加一个过渡,以便在我切换菜单时导航栏项目不会与页面内容重叠。

标签: css reactjs bootstrap-4


【解决方案1】:

你能检查下面的链接代码吗?希望它对你有用。我们已将.overlay.open 的所有声明移至.overlay 并添加transition.overlay(默认状态),我们不需要添加.overlay.open 中的strong>过渡

为了平滑过渡,我们在默认状态下添加了高度和不透明度的过渡

transition: opacity 0.4s ease-in-out, height 0.4s ease-in-out.

1.默认状态 - .overlay:

height 设置为“0px”,opacity 设置为“0”。

2。处于打开状态 - .overlay.open:

height 设置为“100%”,opacity 设置为“1”。

请参考此链接:https://codesandbox.io/s/summer-microservice-6d4c6

【讨论】:

  • 完美答案!我会接受你的,因为在我看来,这是最好的过渡。非常感谢!!
【解决方案2】:

第 1 步:

将叠加层的样式移至其基本 css 定义。在.open 中只留下应该在打开时更改的css。在我们的例子中,我们将改变高度,所以将height:0添加到基础.ovelaycss和height:100%.overlay.open

第 2 步:

向基本 css 添加一个 css 过渡(例如 transition: height .5s ease),并将 tansition: none 设置为 .overlay.open。这样,只有当它没有 .open 类时才会应用转换。所以它会立即打开,并以动画方式关闭。

希望这是期望的输出: https://codesandbox.io/s/charming-drake-dbtce?file=/src/styles.css

【讨论】:

  • 绝妙的答案和解释!我肯定从你那里学到了一些东西。谢谢你!
【解决方案3】:

覆盖全身不需要重叠的div。我们可以通过 CSS 属性来管理它。

使用以下代码解决您的问题。

反应代码:

import React, { Component } from "react";

import { Container, Nav, Navbar } from "react-bootstrap";

import "./styles.css";
import "bootstrap/dist/css/bootstrap.min.css";

export default class NavBar extends Component {
  constructor(props) {
    super(props);
    this.state = {
      open: false,
      data: []
    };
  }

  componentDidMount() {
    this.setState({
      data: [
        { name: "Test1" },
        { name: "Test2" },
        { name: "Test3" },
        { name: "Test4" }
      ]
    });
  }

  render() {
    return (
      <>
        <Navbar
          className={`nav ${this.state.open ? "open" : ""}`}
          expand="lg"
          sticky="top"
        >
          <Container>
            <Navbar.Toggle aria-controls="navbar-menu" />
            <Navbar.Collapse id="navbar-menu">
              <Nav className="ml-auto">
                {this.state.data.map((category) => (
                  <Nav.Link href="#" key={`category-${category.name}`}>
                    <span className="link">{category.name}</span>
                  </Nav.Link>
                ))}
              </Nav>
            </Navbar.Collapse>
          </Container>
        </Navbar>
        <img src="https://images.unsplash.com/reserve/bOvf94dPRxWu0u3QsPjF_tree.jpg?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxMjA3fDB8MXxzZWFyY2h8Nnx8bmF0dXJhbHx8MHx8fA&ixlib=rb-1.2.1&q=80&w=1080" />
      </>
    );
  }
}

CSS 代码:

.nav {
  min-height: 55px;
  width: 100%;
  background-color: white;
  border-bottom: 1px solid #979797;
}

.link {
  font-size: 14px;
  color: #3e433e;
  line-height: 17px;
  padding: 5px;
  text-transform: uppercase;
}

.link:hover {
  color: #000000;
  text-decoration: none;
}

@media (max-width: 991px) {
  #navbar-menu {
    position: fixed;
    top: 57px;
    left: 0;
    right: 0;
    background-color: #fff;
    padding: 0 10px;
    height: 0 !important;
    transition: height 0.3s ease-out !important;
    -webkit-transition: height 0.3s ease-out !important;
    overflow: hidden;
  }
  #navbar-menu.show {
    height: calc(100vh - 57px) !important;
  }
}

【讨论】:

  • 非常感谢您的宝贵时间!这绝对是一个很好的解决方案,唯一的问题是它破坏了菜单中项目的一些边距。也许是因为我在这个问题中没有明确分享的东西。但无论如何,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多