css - 100% 高垂直选取框与 CSS 以固定滚动速度
问题描述
出于合规性原因,我需要用等效的 CSS 替换垂直滚动条。替换需要是 100% 高的选取框,以固定的速度垂直滚动。
这个例子做了我需要的三个例外:https ://codepen.io/strongpom/pen/qmooZe
我尝试使用上面链接的代码,但找到了一种方法来满足以下三个要求:
(1) 我需要它是 100% 高,并且文本从顶部滚动到底部。
(2) 我无法指定滑块 div 的长度,因为它将由(变量)内容确定。这意味着我不能设置绝对滚动位置,除了 div 的顶部应该从视口的底部开始,并继续滚动直到该 div 的底部到达视口的顶部。
和
(3) 滚动速度不能固定为例如15秒,因为如果内容多,则滚动太快,而如果内容少,则滚动太慢。我需要能够指定一个固定的滚动速度,与长度无关。
.container {
width: 20em;
height: 10em;
margin: 2em auto;
overflow: hidden;
background: #ffffff;
position: relative;
}
.slider {
top: 1em;
position: relative;
box-sizing: border-box;
animation: slider 15s linear infinite;
list-style-type: none;
text-align: center;
}
.slider:hover {
animation-play-state: paused;
}
@keyframes slider {
0% { top: 10em }
100% { top: -14em }
}
.blur .slider {
margin: 0;
padding: 0 1em;
line-height: 1.5em;
}
.blur:before, .blur::before,
.blur:after, .blur::after {
left: 0;
z-index: 1;
content: '';
position: absolute;
width: 100%;
height: 2em;
background-image: linear-gradient(180deg, #FFF, rgba(255,255,255,0));
}
.blur:after, .blur::after {
bottom: 0;
transform: rotate(180deg);
}
.blur:before, .blur::before {
top: 0;
}
p {
font-family: helvetica, arial, sans serif;
}
<div class="container blur">
<ul class="slider">
<li><p> Hello, it's me</p></li>
<li><p> I was wondering if after all these years you'd like to meet</p></li>
<li><p>To go over everything</p></li>
<li><p> They say that time's supposed to heal ya</p></li>
<li><p> But I ain't done much healing</p></li>
</ul>
</div>
解决方案
我找不到一种纯粹的 CSS 方式来获得一致的速度,但是通过一点数学和小 javascript,您可以通过可变高度项目实现固定速度。下面的关键因素是 / 500,以每秒像素为单位。无论项目的长度如何,下面的代码将以每秒约 500 像素的速度滚动。
- 高度可以适应您的设计。
- 这将根据您的要求顺利循环。
- 无论长度如何,滚动速度都是您确定的。
为了便于阅读,javascript/css 很冗长。
CodePen - 如果仍然可用,否则代码如下。
HTML
<ul class=slider>
<li>Item</li>
...
</ul>
CSS
* { padding: 0; margin: 0; box-sizing: border-box; }
body { overflow: hidden; height: 100%; }
.slider {
position: absolute;
list-style-type: none;
text-align: center;
animation: slider linear infinite;
}
.slider li { line-height: 50px; width: 100vw; }
@keyframes slider {
0% { transform: translateY(100vh) }
100% { transform: translateY(-100%) }
}
JS
window.onload = function() {
var lineHeight = document.querySelector(".slider li").clientHeight;
var viewHeight = window.innerHeight;
var slider = document.querySelector(".slider");
var time = (slider.offsetHeight * 2.0 + viewHeight * 2) / 500.0;
slider.style.animationDuration = time + "s";
}
推荐阅读
- javascript - 如何修复 React Native setState 错误?
- c++ - Qt用另一个类方法连接信号
- mongodb - 在 MongoDB 中,如何在使用 $lookup 的聚合管道中执行 $geoWithin 查询?
- python - tf.EagerTensor 如何被强制转换为 ndarray?
- python - 显示错误。行:1,列:1,Flask 中的语法错误
- java - Android:包 android.support.v7.app.AlertDialog 不存在
- c# - .NET 核心依赖注入与静态
- angular - 确保多次订阅会产生预期的行为
- go - 如何在 Go 中访问弹性响应值
- typescript - 在一个变量中调用多个中间件/参数 - deno Oak 框架