html - 在 css 转换下消除 ul 高度的波动

标签 html css sass

以下代码用于定义我使用的侧边导航的样式。没有任何过渡效果很好。

SCSS 代码和工作 JSFiddle

.side-nav{
  position: fixed;
  z-index: 100;
  right: 0;
  margin-top: 15vh;

  ul {
    list-style: none;
    background: red;
    border-style: solid;
    border-right-style: none;
    border-width: 3px;
    border-color: blue;
    @include border-radius(20px, 0, 20px, 0);
    width: 1cm !important;
  }

  li {
    position: relative;
    display: block;
    right: 0;
    width: 1cm;

    span {
      white-space: pre;

      &.short {
        color: black;
        display: block;
      }

      &.long {
        display: none;
        color: white;
      }
    }

    &:hover {
      right:200%;
      width: 3cm;
      @include border-radius(20px, 0, 20px, 0);
      border-style: solid;
      border-right-style: none;
      border-width: 3px;
      border-color: blue;
      background: red;
      margin: -3px 0;

      span {
        &.short {
          display: none;
        }

        &.long {
          display: block;
        }
      }
    }
  }

  a {
    position: relative;
    display: block;
    text-decoration: none;

    padding: 10px 0;
    text-align: center;
  }
}

但是,当您添加转换代码时,正如您在 JSFiddle 上看到的那样,ul 的高度会波动。

SCSS 代码和 JSFiddle这说明了问题

.side-nav{
  position: fixed;
  z-index: 100;
  right: 0;
  margin-top: 15vh;

  ul {
    list-style: none;
    background: red;
    border-style: solid;
    border-right-style: none;
    border-width: 3px;
    border-color: blue;
    @include border-radius(20px, 0, 20px, 0);
    width: 1cm !important;
  }

  li {
    position: relative;
    display: block;
    right: 0;
    width: 1cm;
        @include transition(all 1s);

    span {
      white-space: pre;

      &.short {
        color: black;
        display: block;
      }

      &.long {
        display: none;
        color: white;
      }
    }

    &:hover {
          @include transition(all 1s);
      right:200%;
      width: 3cm;
      @include border-radius(20px, 0, 20px, 0);
      border-style: solid;
      border-right-style: none;
      border-width: 3px;
      border-color: blue;
      background: red;
      margin: -3px 0;

      span {
        &.short {
          display: none;
        }

        &.long {
          display: block;
        }
      }
    }
  }

  a {
    position: relative;
    display: block;
    text-decoration: none;

    padding: 10px 0;
    text-align: center;
  }
}

这是在我考虑边框并尝试在不改变高度的情况下使所有内容保持一致时引起的。为了使 li 元素的顶部和底部边框与 ul 元素的边框融为一体,我使用了代码行 margin: -3px 0。这是因为边框宽度为 3px

我的问题是如何使边距和边框的缓和使得 ul 的高度在整个过渡过程中保持不变?

最佳答案

您在悬停时添加边框,这会改变 li 的高度。

相反,给它一个默认的透明边框,只需在悬停时更改边框颜色。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
.side-nav {
  position: fixed;
  z-index: 100;
  right: 0;
  margin-top: 1vh;
}
.side-nav ul {
  list-style: none;
  background: red;
  border-style: solid;
  border-right-style: none;
  border-width: 3px;
  border-color: blue;
  -moz-border-top-left-radius: 20px;
  border-top-left-radius: 20px;
  -moz-border-top-right-radius: 0;
  border-top-right-radius: 0;
  -moz-border-bottom-left-radius: 20px;
  border-bottom-left-radius: 20px;
  -moz-border-bottom-right-radius: 0;
  border-bottom-right-radius: 0;
  width: 1cm !important;
}
.side-nav li {
  position: relative;
  display: block;
  right: 0;
  width: 1cm;
  border: 3px solid transparent;
  -webkit-transition: all 1s;
  transition: all 1s;
}
.side-nav li span {
  white-space: pre;
}
.side-nav li span.short {
  color: black;
  display: block;
}
.side-nav li span.long {
  display: none;
  color: white;
}
.side-nav li:hover {
  -webkit-transition: all 1s;
  transition: all 1s;
  right: 200%;
  width: 3cm;
  -moz-border-top-left-radius: 20px;
  border-top-left-radius: 20px;
  -moz-border-top-right-radius: 0;
  border-top-right-radius: 0;
  -moz-border-bottom-left-radius: 20px;
  border-bottom-left-radius: 20px;
  -moz-border-bottom-right-radius: 0;
  border-bottom-right-radius: 0;
  border-color: blue;
  background: red;
}
.side-nav li:hover span.short {
  display: none;
}
.side-nav li:hover span.long {
  display: block;
}
.side-nav a {
  position: relative;
  display: block;
  text-decoration: none;
  padding: 10px 0;
  text-align: center;
}
<nav id="side-nav" class="side-nav" role="navigation">
  <ul>
    <li><a href="#"><span class="short">S</span><span class="long">Long</span></a>
    </li>
    <li><a href="#"><span class="short">S</span><span class="long">Long</span></a>
    </li>
    <li><a href="#"><span class="short">S</span><span class="long">Long</span></a>
    </li>
    <li><a href="#"><span class="short">S</span><span class="long">Long</span></a>
    </li>
    <li><a href="#"><span class="short">S</span><span class="long">Long</span></a>
    </li>
  </ul>
</nav>

JSfiddle Demo

关于html - 在 css 转换下消除 ul 高度的波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936148/

相关文章:

html - 将背景扩展到 div 元素之外

html - div 之间的间距不相等

html - 当正文设置为 100% 时,部分顶部的额外空间加上垂直滚动条

jquery - 如何修复 Chrome 中的页面滚动延迟

javascript - 我正在尝试制作一个具有固定位置菜单的响应式网站。如何获得菜单 div 的大小以将容器向下推?

ruby - 我应该在 Windows 64 位上将哪个 ruby​​ 版本与 sass 一起使用

javascript - 各种脚本类型属性和 vanilla js,是什么让用户代理有所不同

css - FireBug(或任何其他方法)-如何从 DIV 和子 div 复制所有 CSS 样式?

css - 尝试使用 Grunt 为单个 sass 文件创建单个 css 文件(以及将多个 sass 文件用于一个 css 文件)

java - Vaadin 找不到我的主题文件