多行文字、多行不同长度的文字同步滚动样式实现html+js+css

2 篇文章 0 订阅
1 篇文章 0 订阅

/**
   * 实现原理: 整体所用时间必须一致,即为最长的移动时间
   *                    计算最长的移动到 99%。 每百分之一 移动的长度。
   *                    后面所有的内容都按照此百分比进行移动。
   *                    最长的移动至末端。其余的短的也都移动到末端了
   *                    计算其余短的百分比,
   *                    等待最长的移动结束,移动完即可,再从头开始  
   * 
*/


<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>多行不同长度文字滚动</title>
	<style>
		.content-scroll-box {
			overflow-y: hidden;
			margin: 0 20px;
		}
		.content-scroll-item {
			font-size: 50px;
			/* white-space: nowrap; */
		}
	</style>
</head>
<body>
	<div class="a">
		<div id="content-scroll-box" class="content-scroll-box">
			<div id="content-scroll-item" class="content-scroll-item">多行文字、多行abcbd不同长度的文字同步滚动样式实现</div>
			<div class="content-scroll-item">多行文字、多行不同长@度的文d字同步滚动样式实现</div>
			<div class="content-scroll-item">多行文字、多行不d同长度的文字同12步滚动样式实现同12步!#¥%式实同12步滚动样式实</div>
			<div class="content-scroll-item">多行文字、多行不@同长度E的文字同步滚g动样式实现n多行文字、多行不同长度的文字同步滚动样式实现。</div>
		</div>
	</div>
	<script type="text/javascript">
		// 获取文本框
		let contentBox = document.getElementById("content-scroll-box");
		contentBox.style.overflowY = 'hidden';
		// 获取每行内容
		let contentItems = contentBox.querySelectorAll(".content-scroll-item");
		if (contentItems && contentItems.length) {
			// 区分添加动太 @keyframes 名称区分 scrall-sync-[index]
			let index = 1;
			// 记录影藏部分的文字最大宽度 = 文字总宽度 - 一屏文字显示
			let maxSubWidth = 0;
			// 记录文字总宽度 : 显示的文字宽度 + 隐藏在滚动条内的宽度
			let maxScrollWidth = 0;
			// 文字移动的速度 【可理解为 100 px/s】
			let speed = 100;
			/**
			 * 记录显示屏幕的宽度; 
			 * 可以利用外部容器 document.getElementById("content-scroll-box").offsetWidth 计算得出
			 * 本文通过 内容的宽度计算了8
			 */
			let width = 0;  
			// 第一遍 遍历内容。找到最长的单行文字。 并记录显示屏幕宽度
			for (let contentItem of contentItems) {
				contentItem.style.whiteSpace = 'nowrap';
				// 获取显示文字宽度
				let offsetWidth = contentItem.offsetWidth;
				width = offsetWidth;
				// 获取元素包含滚动条的宽度
				let scrollWidth = contentItem.scrollWidth;
				// 设置文字总宽度 含滚动条隐藏的宽度
				if (maxScrollWidth < scrollWidth) {
					maxScrollWidth = scrollWidth;
				}
			}
			// 计算未显示出来内容的最大宽度 【滚动条内的宽度】
			maxSubWidth = maxScrollWidth - width;
		    // 计算 最长滚动时间 【按照 指定 speed[最长内容 - 显示屏幕大小]需要滑动多少秒】
			let maxSeconde = maxSubWidth / speed;
			/**
			 * 实现原理: 整体所用时间必须一致,即为最长的移动时间
			 * 		     计算最长的移动到 99%。 每百分之一 移动的长度。
			 * 			 后面所有的内容都按照此百分比进行移动。
			 *           最长的移动至末端。其余的短的也都移动到末端了
			 *           计算其余短的百分比,
			 *           等待最长的移动结束,移动完即可,再从头开始  
			 * 计算 滚动百分比。设置固定比例 【@keyframes 的 99% 除以 最长的未显示出来内容的最大宽度】 
			 */
			let precentage = 99 / maxSubWidth;
			// 循环添加样式
			for (let contentItem of contentItems) {
				// 获取当前元素在屏幕显示的宽度
				let offsetWidth = contentItem.offsetWidth;
				// 获取元素包含滚动条的宽度
				let scrollWidth = contentItem.scrollWidth;
				// 计算未显示出来的宽度内容
				let subWidth = scrollWidth - offsetWidth > 0 ? scrollWidth - offsetWidth : 0;
				/**
				 * 计算未显示出来的内容全部显示。要移动到百分比
				 * 计算移动到百分之多少,移动结束 
				 * 计算公式 99 / maxSubWidth = itemPrecentage / subWidth
				 */
				let itemPrecentage = precentage * subWidth; 
				/**
				 * 指定百分比。将未显示的移动距离全部显示出来既可以,
				 * 到100%时。也为未显示距离。可控制文字滚动到最后停止不同,不显示空白
				 */
				const my = `@keyframes my`+ index +  `{
						0% {
							transform: translateX(0%);
						}
						`+ itemPrecentage + `%{
							transform: translateX(-`+ subWidth +`px);
						}
						100% {
							transform: translateX(-`+subWidth+`px);
						}
					}`
				const style = document.createElement('style')
				style.setAttribute('type', 'text/css')
				document.head.appendChild(style)
				style.sheet.insertRule(my, 0)
				// 添加动画。指定每行文字不同的动画。播放完成时长指定为最长的时间
				contentItem.style.animation = 'my' + index + ' ' + maxSeconde +'s linear infinite';
				// 移动结束后不变化
				contentItem.style.animationFillMode = 'forwards';
				index++;
			}
		}
		console.log(contentBox);
	</script>
</body>
</html>

方式二:

 可以通过计算样式添加不同 animation-duration  实现。同事需要添加定时任务配合使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个纵向滚动导航栏,可以使用 HTMLCSS 和 JavaScript 来完成。下面是一些步骤和示例代码,可以帮助你实现这个功能。 1. 首先,我们需要创建一个 HTML 结构来定义导航栏和它的菜单项。可以使用 `<ul>` 和 `<li>` 标签来创建一个有序列表,然后在列表项中添加链接。 ```html <nav> <ul> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li><a href="#section4">Section 4</a></li> </ul> </nav> ``` 2. 接下来,我们需要使用 CSS 来设置导航栏的样式。可以给 `<nav>` 元素设置一个固定的高度和宽度,并设置其 `overflow-y` 属性为 `scroll`,以便在内容溢出时显示滚动条。然后,可以设置 `<li>` 元素的样式,例如背景颜色、字体大小和间距。 ```css nav { height: 400px; width: 150px; overflow-y: scroll; } li { background-color: #f6f6f6; font-size: 16px; margin-bottom: 10px; padding: 10px; } ``` 3. 现在,我们需要使用 JavaScript 来添加一些交互性。我们可以使用 `window.addEventListener()` 方法来监听滚动事件,并在导航栏中高亮显示当前所在的节。 ```javascript window.addEventListener('scroll', function() { var sections = document.querySelectorAll('section'); var navHeight = document.querySelector('nav').offsetHeight; var currentSectionIndex = 0; for (var i = 0; i < sections.length; i++) { if (sections[i].offsetTop - navHeight <= window.scrollY) { currentSectionIndex = i; } } var activeLink = document.querySelector('nav li.active'); if (activeLink) { activeLink.classList.remove('active'); } var newActiveLink = document.querySelectorAll('nav li')[currentSectionIndex]; newActiveLink.classList.add('active'); }); ``` 在这段代码中,我们首先获取所有的节,并获取导航栏的高度。然后,我们遍历所有的节,如果某个节的顶部位置小于或等于滚动条的位置加上导航栏的高度,就将当前节的索引设置为 `currentSectionIndex`。最后,我们移除当前激活的菜单项的 `active` 类,然后将新的激活菜单项添加 `active` 类。 4. 最后,我们可以使用 CSS 来设置渐变效果。我们可以给 `.active` 类添加一个渐变背景色,使其从浅色逐渐变成深色。这样,用户就可以很容易地看出当前所在的节。 ```css li.active { background: linear-gradient(to bottom, #f6f6f6, #ccc); } ``` 这样,我们就完成了一个纵向滚动导航栏,并添加了滚动渐变效果。完整的 HTMLCSS 和 JavaScript 代码如下所示: ```html <!DOCTYPE html> <html> <head> <style> nav { height: 400px; width: 150px; overflow-y: scroll; } li { background-color: #f6f6f6; font-size: 16px; margin-bottom: 10px; padding: 10px; } li.active { background: linear-gradient(to bottom, #f6f6f6, #ccc); } </style> </head> <body> <nav> <ul> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li><a href="#section4">Section 4</a></li> </ul> </nav> <section id="section1">Section 1</section> <section id="section2">Section 2</section> <section id="section3">Section 3</section> <section id="section4">Section 4</section> <script> window.addEventListener('scroll', function() { var sections = document.querySelectorAll('section'); var navHeight = document.querySelector('nav').offsetHeight; var currentSectionIndex = 0; for (var i = 0; i < sections.length; i++) { if (sections[i].offsetTop - navHeight <= window.scrollY) { currentSectionIndex = i; } } var activeLink = document.querySelector('nav li.active'); if (activeLink) { activeLink.classList.remove('active'); } var newActiveLink = document.querySelectorAll('nav li')[currentSectionIndex]; newActiveLink.classList.add('active'); }); </script> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值