可滚动区域中的中心元素

时间:2018-12-30 16:21:47

标签: html css scroll flexbox centering

如何在可滚动的水平伸缩容器中居中对齐第一个和最后一个伸缩项目?

使滚动工作变得容易。

我的容器有:

scroll-snap-type: x mandatory;
overflow-x: scroll;

项目包括:

scroll-snap-align: center;

滚动可以工作,但是列表中最左边和最右边的项目始终始终分别向左和向右对齐。

我想使第一个和最后一个项目能够在可滚动元素列表中居中。

如果我们查看this示例,则“首页”标签是最左侧的项目。我想将其集中在可滚动区域中。

可滚动区域的左侧和右侧是否需要空白选项卡?

谢谢您的任何建议。

div.scrollmenu {
  background-color: #333;
  overflow: auto;
  white-space: nowrap;
}

div.scrollmenu a {
  display: inline-block;
  color: white;
  text-align: center;
  padding: 14px;
  text-decoration: none;
}

div.scrollmenu a:hover {
  background-color: #777;
}
<div class="scrollmenu">
  <a href="#home">Home</a>
  <a href="#news">News</a>
  <a href="#contact">Contact</a>
  <a href="#about">About</a>
  <a href="#support">Support</a>
  <a href="#blog">Blog</a>
  <a href="#tools">Tools</a>
  <a href="#base">Base</a>
  <a href="#custom">Custom</a>
  <a href="#more">More</a>
  <a href="#logo">Logo</a>
  <a href="#friends">Friends</a>
  <a href="#partners">Partners</a>
  <a href="#people">People</a>
  <a href="#work">Work</a>
</div>

2 个答案:

答案 0 :(得分:0)

  

可滚动区域的左侧和右侧是否需要空白选项卡?

这不是一个坏主意。

您可以在两端创建一堆“假”元素,然后将其赋予visibility: hidden

div.scrollmenu {
  background-color: #333;
  overflow: auto;
  white-space: nowrap;
}

div.scrollmenu a {
  display: inline-block;
  color: white;
  text-align: center;
  padding: 14px;
  text-decoration: none;
}

div.scrollmenu a:hover {
  background-color: #777;
}

/* NEW */
a:nth-child(-n + 5),
a:nth-last-child(-n + 5) {
  background-color: green;
  visibility: hidden;
<div class="scrollmenu">
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#news">News</a>
  <a href="#contact">Contact</a>
  <a href="#about">About</a>
  <a href="#support">Support</a>
  <a href="#blog">Blog</a>
  <a href="#tools">Tools</a>
  <a href="#base">Base</a>
  <a href="#custom">Custom</a>
  <a href="#more">More</a>
  <a href="#logo">Logo</a>
  <a href="#friends">Friends</a>
  <a href="#partners">Partners</a>
  <a href="#people">People</a>
  <a href="#work">Work</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
  <a href="#home">Home</a>
</div>

但是,有一个更简单且在语义上更有价值的解决方案:使用CSS伪元素

由于您只关注布局的外观,因此您不应篡改HTML。您应该坚持使用纯CSS。

pseudo-elements on a flex container are treated as flex items起,您可以使用::before(自然流中的第一项)和::after(自然流中的最后一项)来创建所需的居中效果

div.scrollmenu {
  background-color: #333;
  overflow: auto;
  white-space: nowrap;
  display: flex;
}

div.scrollmenu a {
  color: white;
  text-align: center;
  padding: 14px;
  text-decoration: none;
}

div.scrollmenu a:hover {
  background-color: #777;
}

/* NEW */
.scrollmenu::before,
.scrollmenu::after {
  content: "";
  flex: 0 0 50%;
}
<div class="scrollmenu">
  <a href="#home">Home</a>
  <a href="#news">News</a>
  <a href="#contact">Contact</a>
  <a href="#about">About</a>
  <a href="#support">Support</a>
  <a href="#blog">Blog</a>
  <a href="#tools">Tools</a>
  <a href="#base">Base</a>
  <a href="#custom">Custom</a>
  <a href="#more">More</a>
  <a href="#logo">Logo</a>
  <a href="#friends">Friends</a>
  <a href="#partners">Partners</a>
  <a href="#people">People</a>
  <a href="#work">Work</a>
</div>

答案 1 :(得分:0)

我将其与transform3D一起使用。我将所有内容放入Flex容器中,并使用transform3D和一些JavaScript滚动了整个容器。 我计算屏幕尺寸并获得屏幕中心,并进行了一些数学运算并计算了容器中每个项目的宽度,并且知道每个项目的索引都给了我一个偏移量,然后我进行了动画处理,使用transform3d向左或向右滚动内容。