javascript - 使用 jQuery 在滚动条上绘制 SVG 线条

标签 javascript css svg scroll draw

我如何使用 CSS 为 SVG“线”元素创建绘制动画。我想在滚动上画线,效果流畅。有人有什么想法吗?我试着搜索这个,但我找不到线元素的这种效果。 这是我的 html 和 svg:

<div class="box">
<svg width="100%" height="100%">
  <line x1="0" y1="0" x2="0" y2="100%" stroke="gray" stroke-width="2"  />
  <line x1="0" y1="100%" x2="100%" y2="100%" stroke="gray" stroke-width="2"  />
</svg>
</div>
<div class="box2">
<svg width="100%" height="100%">
  <line x1="100%" y1="100%" x2="100%" y2="0" stroke="gray" stroke-width="2"  />
  <line x1="0" y1="100%" x2="100%" y2="100%" stroke="gray" stroke-width="2"  />
</svg>
</div>
<div class="box">
<svg width="100%" height="100%">
  <line x1="0" y1="0" x2="0" y2="100%" stroke="gray" stroke-width="2"  />
  <line x1="0" y1="100%" x2="100%" y2="100%" stroke="gray" stroke-width="2"  />
</svg>
</div>
<div class="box2">
<svg width="100%" height="100%">
  <line x1="100%" y1="100%" x2="100%" y2="0" stroke="gray" stroke-width="2"  />
  <line x1="0" y1="100%" x2="100%" y2="100%" stroke="gray" stroke-width="2"  />
</svg>
</div>

和CSS:

.box{
    width: 100%;
    height: 300px;
    position: relative;
}
.box2{
    width: 100%;
    height: 300px;
    position: relative;
}

Demo

最佳答案

我只知道您可以通过带有自定义 javascript 的路径运行,也许您也可以将其用于一行:)

滚动功能的新编辑

// Get a reference to the <path>
var path = document.querySelector('#star-path');

// Get length of path... ~577px in this case
var pathLength = path.getTotalLength();

// Make very long dashes (the length of the path itself)
path.style.strokeDasharray = pathLength + ' ' + pathLength;

// Offset the dashes so the it appears hidden entirely
path.style.strokeDashoffset = pathLength;

// Jake Archibald says so
// https://jakearchibald.com/2013/animated-line-drawing-svg/
path.getBoundingClientRect();

// When the page scrolls...
window.addEventListener("scroll", function(e) {
 
  // What % down is it? 
  // https://stackoverflow.com/questions/2387136/cross-browser-method-to-determine-vertical-scroll-percentage-in-javascript/2387222#2387222
  // Had to try three or four differnet methods here. Kind of a cross-browser nightmare.
  var scrollPercentage = (document.documentElement.scrollTop + document.body.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight);
    
  // Length to offset the dashes
  var drawLength = pathLength * scrollPercentage;
  
  // Draw in reverse
  path.style.strokeDashoffset = pathLength - drawLength;
    
  // When complete, remove the dash array, otherwise shape isn't quite sharp
 // Accounts for fuzzy math
  if (scrollPercentage >= 0.99) {
    path.style.strokeDasharray = "none";
    
  } else {
    path.style.strokeDasharray = pathLength + ' ' + pathLength;
  }
  
});
body {
  /* feel free to change height */
  height: 5000px;
}

#star-svg {
  position: fixed;
  top: 50%;
  left: 50%;
  width: 150px;
  height: 150px;
  margin: -75px 0 0 -75px;
}
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100.6 107.6" id="star-svg">
	<path fill="none" stroke="black" stroke-width="2" id="star-path" d="M43.7,65.8L19.9,83.3c-2.9,1.9-5.1,3.2-7.9,3.2c-5.7,0-10.5-5.1-10.5-10.8
		c0-4.8,3.8-8.2,7.3-9.8l27.9-12L8.8,41.4c-3.8-1.6-7.3-5.1-7.3-9.8c0-5.7,5.1-10.5,10.8-10.5c2.9,0,4.8,1,7.6,3.2l23.8,17.4
		l-3.2-28.2c-1-6.7,3.5-12,9.8-12c6.3,0,10.8,5.1,9.8,11.7L57,41.8l23.8-17.4c2.9-2.2,5.1-3.2,7.9-3.2c5.7,0,10.5,4.8,10.5,10.5
		c0,5.1-3.5,8.2-7.3,9.8L63.9,53.8l27.9,12c3.8,1.6,7.3,5.1,7.3,10.1c0,5.7-5.1,10.5-10.8,10.5c-2.5,0-4.8-1.3-7.6-3.2L57,65.8
		l3.2,28.2c1,6.7-3.5,12-9.8,12c-6.3,0-10.8-5.1-9.8-11.7L43.7,65.8z"/>
</svg>

来源:https://css-tricks.com/scroll-drawing/

关于javascript - 使用 jQuery 在滚动条上绘制 SVG 线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36314155/

相关文章:

css - 时间字段的 webkit css 伪元素

javascript - 如何使用 AMPLE SDK 缩放和平移嵌入 XHTML 页面的 SVG 文档

json - 将SVG转换为JSON

java - 不覆盖现有形状的绘图路径?

javascript - 通过单击背景区域关闭灯箱窗口?

javascript - JS 中的 native OS X 应用程序?

css - 如何制定基于 EM 的媒体查询

javascript - 从 html 表格单元格内的文本框中读取值

javascript - 检查 json 对象是否存在并保存到本地存储中

html - Bullet Point 在我的导航菜单上