- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用了修改后的 jQuery 脚本,以便能够滚动浏览没有 ID 的部分,并在到达文档末尾时返回到顶部。
由于我是 JS 新手,并尝试改进和学习,所以我想摆脱 jQuery 依赖。
我已经设法让它部分工作,但失败了,并且在寻找 jQueries Offset 方法的替代方法时感到困惑。
This is the modified jQuery script:
// scoll to next section and back to top
var $scrollSection = $('section');
var $scrollTrigger = $('.section_trigger');
var nextSection = 1;
$scrollTrigger.on('click', function() {
$(this).removeClass('go-to-top');
// If reached the last section, scroll back to the top on the next click:
if (nextSection >= $scrollSection.length) {
$('html, body').animate({
scrollTop: 0
}, 1000);
nextSection = 0;
return;
}
// if we scroll down increment section counter
while ($('body').scrollTop() > $($scrollSection[nextSection]).offset().top) {
nextSection++;
}
// If next section is the last, add class to rotate arrow:
if (nextSection === ($scrollSection.length - 1)) {
$(this).addClass('go-to-top');
}
// Move to next section and increment counter
$('html, body').animate({
scrollTop: $($scrollSection[nextSection]).offset().top
}, 1000);
nextSection++;
});
// turn arrow when scrolled to footer
$(window).scroll(function() {
if ($(window).scrollTop() + $(window).height() == $(document).height()) {
$(".section_trigger--side").addClass('go-to-top');
} else {
$(".section_trigger--side").removeClass('go-to-top');
}
});
.box_0 {
background-color: grey;
height: 100vh;
width: 100vw;
}
.box_1 {
background-color: green;
height: 50vh;
width: 100vw;
}
.box_2 {
background-color: blue;
height: 50vh;
width: 100vw;
}
.box_3 {
background-color: yellow;
height: 20vh;
width: 100vw;
}
footer {
background-color: pink;
height: 40vh;
width: 100vw;
}
/* styling for the section trigger */
.section_trigger svg {
height: 60%;
left: 20%;
position: absolute;
top: 20%;
width: 60%;
}
/** @define c-scroll-nav */
.section_trigger {
background: hsla(0, 0%, 0%, 0.45);
border: 0;
border-radius: 50%;
cursor: pointer;
height: 50px;
width: 50px;
}
.section_trigger:hover {
background: black;
}
.section_trigger--center {
position: absolute;
left: 50%;
transform: translate(0, -50%);
bottom: 12px;
transform: rotate(270deg);
}
.section_trigger--side {
bottom: 12px;
position: fixed;
right: 12px;
transform: rotate(270deg);
}
.go-to-top {
transform: rotate(90deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="section_trigger section_trigger--center">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<span class="section_trigger section_trigger--side">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<section>
<div class="box_0"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<section>
<div class="box_1"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<footer></footer>
This is my Vanilla JS approach:
// Debuging
window.onscroll = function() {
//console.log('top: ' + (window.pageYOffset || document.documentElement.scrollTop));
// console.log('section: ' + (window.pageYOffset || document.scrollSection[nextSection].scrollTop));
// console.log(nextSection);
// console.log(scrollSection[0]);
}
/*
* Helper Function: Vanilla version of jQuery scrollTop
*/
function scrollTo(element, to, duration) {
if (duration <= 0) return;
let difference = to - element.scrollTop;
let perTick = difference / duration * 50;
setTimeout(() => {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop == to) return;
scrollTo(element, to, duration - 10);
}, 10);
}
/*
* Main Function: Scroll to section elements and back to top
*/
const scrollSection = document.getElementsByTagName('section');
const scrollTrigger = document.getElementsByClassName('section_trigger')[1];
let nextSection = 0;
// turn arrow back arround after clicked to return to top
scrollTrigger.addEventListener('click', () => {
scrollTrigger.classList.remove('go-to-top');
console.log('removed class `go-to-top`');
// If reached the last section, scroll back to the top on the next click:
if (nextSection >= scrollSection.length) {
function runScroll() {
scrollTo(document.body, 0, 1000);
nextSection = 0;
console.log('Scrolled back to Top');
}
}
// if we scroll down increment section counter
while (document.body.scrollTop > document.scrollSection[nextSection].getBoundingClientRect().scrollTop) { //doesnt work , cant next section scrollSection undefined
nextSection++;
console.log('incremented counter to' + nextSection);
}
// If next section is the last, add go-to-top class to rotate arrow:
if (nextSection === (scrollSection.length - 1)) {
scrollTrigger.classList.add('go-to-top');
console.log('added class `go-to-top`');
}
// Move to next section and increment counter
function runScroll() {
scrollTo(document.scrollSection[nextSection].getBoundingClientRect().scrollTop, 0, 1000); //doesnt work , cant next section scrollSection undefined
nextSection++;
console.log('Scrolled one section down');
}
});
/*
* Helper Function: vanilla JS get document height and window width and height
*/
const body = document.body;
const html = document.documentElement;
// document height
const documentHeight = Math.max(body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight);
// window width and height
const windowWidth = window.innerWidth || document.documentElement.clientWidth || body.clientWidth;
const windowHeigth = window.innerHeight || document.documentElement.clientHeight || body.clientHeight;
// turn arrow when scrolled to footer
window.onscroll = function() {
if (window.getBoundingClientRect() + windowHeigth == documentHeight) { // not sure if getBoundingClientRect is the right choice since its relative to the viewport
scrollTrigger.classList.add('go-to-top');
} else {
scrollTrigger.classList.remove('go-to-top');
}
};
.box_0 {
background-color: lightgreen;
height: 100vh;
width: 100vw;
}
.box_1 {
background-color: magenta;
height: 50vh;
width: 100vw;
}
.box_2 {
background-color: blue;
height: 50vh;
width: 100vw;
}
.box_3 {
background-color: yellow;
height: 20vh;
width: 100vw;
}
footer {
background-color: pink;
height: 40vh;
width: 100vw;
}
/* styling for the section trigger */
.section_trigger svg {
height: 60%;
left: 20%;
position: absolute;
top: 20%;
width: 60%;
}
/** @define c-scroll-nav */
.section_trigger {
background: hsla(0, 0%, 0%, 0.45);
border: 0;
border-radius: 50%;
cursor: pointer;
height: 50px;
width: 50px;
}
.section_trigger:hover {
background: black;
}
.section_trigger--center {
position: absolute;
left: 50%;
transform: translate(0, -50%);
bottom: 12px;
transform: rotate(270deg);
}
.section_trigger--side {
bottom: 12px;
position: fixed;
right: 12px;
transform: rotate(270deg);
}
.go-to-top {
transform: rotate(90deg);
}
<span class="section_trigger section_trigger--center">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<span class="section_trigger section_trigger--side go-to-top">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<section>
<div class="box_0"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<section>
<div class="box_1"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<footer></footer>
我认为我没有正确使用 getBoundingClientRect() 方法,我也不确定是否应该相对于视口(viewport)使用它。
除此之外,我不知道它是否有效以及我通常采用的正确方法,我还读到可以使用 throttle 来提高性能?方法......非常感谢,非常感谢你们。
最佳答案
抱歉,我没有时间完成,但我已经做了一些更新。单击中心滚动触发器时,该代码不会触发错误,但它也不起作用。我现在发帖是为了保存我的答案,并将根据需要进行更新。
在做这类事情时,我的建议是分段实现。例如,使用有效的 jQuery 代码,然后用纯 JS 一次替换一个函数或一小部分。调试起来会更容易。
一些变化:
if (window.pageYOffset + windowHeight == documentHeight) {
const scrollTrigger = document.getElementsByClassName('section_trigger')[0];
代码:
// Debuging
window.onscroll = function() {
// console.log('top: ' + (window.pageYOffset || document.documentElement.scrollTop));
// console.log('section: ' + (window.pageYOffset || document.scrollSection[nextSection].scrollTop));
// console.log(nextSection);
// console.log(scrollSection[0]);
}
/*
* Helper Function: Vanilla version of jQuery scrollTop
*/
function scrollTo(element, to, duration) {
if (duration <= 0) return;
let difference = to - element.scrollTop;
let perTick = difference / duration * 50;
setTimeout(() => {
element.scrollTop = element.scrollTop + perTick;
if (element.scrollTop == to) return;
scrollTo(element, to, duration - 10);
}, 10);
}
/*
* Main Function: Scroll to section elements and back to top
*/
const scrollSection = document.getElementsByTagName('section');
const scrollTrigger = document.getElementsByClassName('section_trigger')[0];
let nextSection = 0;
// turn arrow back arround after clicked to return to top
scrollTrigger.addEventListener('click', () => {
scrollTrigger.classList.remove('go-to-top');
console.log('removed class `go-to-top`');
// If reached the last section, scroll back to the top on the next click:
if (nextSection >= scrollSection.length) {
function runScroll() {
scrollTo(document.body, 0, 1000);
nextSection = 0;
console.log('Scrolled back to Top');
}
}
scrollTo(document.body, 0, 1000);
// if we scroll down increment section counter
while (document.body.scrollTop > scrollSection[nextSection].getBoundingClientRect().scrollTop) { //doesnt work , cant next section scrollSection undefined
nextSection++;
console.log('incremented counter to' + nextSection);
}
// If next section is the last, add go-to-top class to rotate arrow:
if (nextSection === (scrollSection.length - 1)) {
scrollTrigger.classList.add('go-to-top');
console.log('added class `go-to-top`');
}
// Move to next section and increment counter
function runScroll() {
scrollTo(document.scrollSection[nextSection].getBoundingClientRect().scrollTop, 0, 1000); //doesnt work , cant next section scrollSection undefined
nextSection++;
console.log('Scrolled one section down');
}
});
/*
* Helper Function: vanilla JS get document height and window width and height
*/
const body = document.body;
const html = document.documentElement;
// document height
const documentHeight = Math.max(body.scrollHeight, body.offsetHeight,
html.clientHeight, html.scrollHeight, html.offsetHeight);
// window width and height
const windowWidth = window.innerWidth || document.documentElement.clientWidth || body.clientWidth;
const windowHeight = window.innerHeight || document.documentElement.clientHeight || body.clientHeight;
// turn arrow when scrolled to footer
window.onscroll = function() {
if (window.pageYOffset + windowHeight == documentHeight) { // not sure if getBoundingClientRect is the right choice since its relative to the viewport
scrollTrigger.classList.add('go-to-top');
} else {
scrollTrigger.classList.remove('go-to-top');
}
};
.box_0 {
background-color: lightgreen;
height: 100vh;
width: 100vw;
}
.box_1 {
background-color: magenta;
height: 50vh;
width: 100vw;
}
.box_2 {
background-color: blue;
height: 50vh;
width: 100vw;
}
.box_3 {
background-color: yellow;
height: 20vh;
width: 100vw;
}
footer {
background-color: pink;
height: 40vh;
width: 100vw;
}
/* styling for the section trigger */
.section_trigger svg {
height: 60%;
left: 20%;
position: absolute;
top: 20%;
width: 60%;
}
/** @define c-scroll-nav
*/
.section_trigger {
background: hsla(0, 0%, 0%, 0.45);
border: 0;
border-radius: 50%;
cursor: pointer;
height: 50px;
width: 50px;
}
.section_trigger:hover {
background: black;
}
.section_trigger--center {
position: absolute;
left: 50%;
transform: translate(0, -50%);
bottom: 12px;
transform: rotate(270deg);
}
.section_trigger--side {
bottom: 12px;
position: fixed;
right: 12px;
transform: rotate(270deg);
}
.go-to-top {
transform: rotate(90deg);
}
<span class="section_trigger section_trigger--center">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<span class="section_trigger section_trigger--side go-to-top">
<svg viewBox="0 0 100 100"><path d="M 10,50 L 60,100 L 70,90 L 30,50 L 70,10 L 60,0 Z" fill="white" class="arrow"></path></svg>
</span>
<section>
<div class="box_0"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<section>
<div class="box_1"></div>
</section>
<section>
<div class="box_2"></div>
</section>
<section>
<div class="box_3"></div>
</section>
<footer></footer>
关于javascript - 在 Vanilla JS 中滚动到下一部分并返回到顶部而无需 ID - 无 JQUERY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42406287/
我正在尝试向图像顶部和底部的 ImageView 添加渐变。我不想在 ImageView 之上添加 TextView 。我该如何实现? 最佳答案 看来您简单而干净的解决方案是用 FrameLayout
我可以寻求帮助吗, 我有日期 - “公司名称”和“日期”,例如 $value |"Comp Name"| "Date" | |:----------|----------:| |computer
我有两个表,我试图从中运行查询以返回每个人的最大(或最高)交易。我应该注意,我无法更改表结构。相反,我只能拉数据。 人 +-----------+| id | name |+-----------+|
所以我有一个用管道打开的 n 个流的数组,但是使用 gdb,我发现当我尝试关闭流或管道的写入端时程序失败。我可以很好地写入管道,但关闭它们不起作用。我在程序上运行 valgrind,它所做的只是打印出
大家好,这是我的难题。我正在尝试创建一个标签栏,该标签栏从上到下锚定在左侧,而不是从左到右锚定在底部。我创建了一个工具栏项目,将栏准确地放置在我想要的位置,但我希望选项卡栏相同,具有相同的功能,当然除
http://jsfiddle.net/GuXQZ/3/ header slideshow lates Content
我的图片出了点问题,我无法解决这个问题。这是我的代码.. HTML HIDE CSS #ads { -webkit-border-bottom-right-r
我有一个包含 3(css 网格)列的设计。第二列有嵌套的网格内容需要垂直滚动,而其他两列保持各自的高度。我给第二个嵌套列一个溢出,但我还需要给它一个顶部和底部填充或边距。我的解决方案没有顶部/底部填充
我在 View 中有两个 UIToolbar,分别在顶部和底部。我正在尝试在 iOS 版本中一致地应用外观。从 iOS5 开始有这个 setBackgroundImage: forToolbarPos
一个 div 我使用 top:-26px; 在 css 中设置高度。我有其他 div 其他地方我想与那个 div 对齐。我注意到在 jquery 中编写 .css('top') 得到了我的 css 而
我有这个无序列表 two three 有没有一种方法可以将无序列表添加到无序列表的前面,使其像这样结束? ONE two three 请注意“ONE”已添加到列表
我想检测鼠标何时离开顶部的视口(viewport)(可以说是向北)。我在网上搜了下How can I detect when the mouse leaves the window? .是一个好的开始
运行顶级命令top -c在 Ubuntu 服务器上显示当前正在运行的所有命令。关于 PostgreSQL 命令,括号中的值是什么意思?我说的是图片中红色框旁边的值。 最佳答案 我找不到任何文档来支持这
我想知道将顶部和底部边距添加到 GtkTextView 的正确且普遍接受的方法位于 GtkScrolledWindow 内.有设置左右边距的功能,我正在使用: gtk_text_view_set_le
作为很多“初学者”,我认为使用 TOP_OF_PIPELINE 作为 dst 和 BOTTOM_OF_PIPELINE 作为 src 意味着 ALL_COMMANDS 两者。 Here Nicol B
我正在尝试使用 jQuery/Javascript 解决这个问题: 当浏览器向下滚动且窗口底部到达页脚 DIV 顶部时,执行 CSS 代码更改。 问题示例: https://elodywedding.
我想使用范围 slider 来选择一个值并将该值呈现在 Angular 中的范围选择器顶部。我的html代码是: Raio: {{raio}} metros 在我的 co
我想将手的图片放在靠近脸部的黑色 Canvas 上。这可以吗?有没有办法确定图片的位置? 这是我的代码: var canvas; var canvasContext; window
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我是一名优秀的程序员,十分优秀!