响应式水平页面滑动
Posted
技术标签:
【中文标题】响应式水平页面滑动【英文标题】:Responsive horizontal page sliding 【发布时间】:2014-08-16 08:51:22 【问题描述】:我想创建 水平响应式页面导航,如下图所示:
这就是我设法做到的:DEMO
$(document).ready(function ()
var slideNum = $('.page').length,
wrapperWidth = 100 * slideNum,
slideWidth = 100/slideNum;
$('.wrapper').width(wrapperWidth + '%');
$('.page').width(slideWidth + '%');
$('a.scrollitem').click(function()
$('a.scrollitem').removeClass('selected');
$(this).addClass('selected');
var slideNumber = $($(this).attr('href')).index('.page'),
margin = slideNumber * -100 + '%';
$('.wrapper').animate(marginLeft: margin,1000);
return false;
);
);
html, body
height: 100%;
margin: 0;
overflow-x:hidden;
position:relative;
nav
position:absolute;
top:0; left:0;
height:30px;
.wrapper
height: 100%;
background: #263729;
.page
float:left;
background: #992213;
min-height: 100%;
padding-top: 30px;
#page-1
background: #0C717A;
#page-2
background: #009900;
#page-3
background: #0000FF;
a
color:#FFF;
a.selected
color: red;
.simulate
height:2000px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div class="wrapper">
<nav>
<a href="#page-1" class="scrollitem selected">page 1</a>
<a href="#page-2" class="scrollitem">page 2</a>
<a href="#page-3" class="scrollitem">page 3</a>
</nav>
<div id="page-1" class="page">
<h3>page 1</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
<div id="page-2" class="page">
<h3>page 2</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
<div id="page-3" class="page">
<h3>page 3</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
</div>
然而,我遇到了几堵砖墙,因为我的反应在一定程度上,就像你缩放它需要坚持到它所在的页面而不显示其他页面。
此外,如果页面很长,它会显示一个完美的滚动条,但在最后一张幻灯片上,有一个与滚动条一样宽的间隙。
我有以下要求:
-
需要响应
页面需要能够很长(800 像素)并且仍然可以滚动,并且与最后一个页面没有间隙。
需要在最低 ie9 上工作
【问题讨论】:
你的 jsFiddle 坏了 只是过渡效果不好,所以看不到幻灯片效果..不知道为什么坏了..目前设置为960,只需展开预览窗口跨度> 我想你想要这个效果:api.jquery.com/slidetoggle 更新的问题(这个 jsfiddle 确实有效) 这是浏览器特有的东西吗?我只是看了看,没有问题(至少在 chrome 上) 【参考方案1】:水平页面滑动
带有左边距动画
这个 jQuery sn-p :
-
计算幻灯片的数量并相应地设置包装的宽度。
根据单击的链接,
left-margin
在包装器上以动画方式显示相应的幻灯片并平滑过渡
切换点击链接的类别以突出显示活动链接
注意这个解决方案:
-
仅使用一个菜单项来最小化标记并防止内容重复。
仅需要 jQuery 库
适用于动态数量的幻灯片
$(document).ready(function()
var slideNum = $('.page').length,
wrapperWidth = 100 * slideNum,
slideWidth = 100 / slideNum;
$('.wrapper').width(wrapperWidth + '%');
$('.page').width(slideWidth + '%');
$('a.scrollitem').click(function()
$('a.scrollitem').removeClass('selected');
$(this).addClass('selected');
var slideNumber = $($(this).attr('href')).index('.page'),
margin = slideNumber * -100 + '%';
$('.wrapper').animate(
marginLeft: margin
, 1000);
return false;
);
);
html,
body
height: 100%;
margin: 0;
overflow-x: hidden;
position: relative;
nav
position: absolute;
top: 0;
left: 0;
height: 30px;
.wrapper
height: 100%;
background: #263729;
.page
float: left;
background: #992213;
min-height: 100%;
padding-top: 30px;
#page-1
background: #0C717A;
#page-2
background: #009900;
#page-3
background: #0000FF;
a
color: #FFF;
a.selected
color: red;
.simulate
height: 2000px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="wrapper">
<nav>
<a href="#page-1" class="scrollitem selected">page 1</a>
<a href="#page-2" class="scrollitem">page 2</a>
<a href="#page-3" class="scrollitem">page 3</a>
</nav>
<div id="page-1" class="page">
<h3>page 1</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
<div id="page-2" class="page">
<h3>page 2</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
<div id="page-3" class="page">
<h3>page 3</h3>
<div class="simulate">Simulated content heigher than 100%</div>
</div>
</div>
【讨论】:
这是一个更好的方法。滚动很麻烦 这好多了,谢谢!最后一个问题,我看到页面宽度和包装器宽度取决于有多少页面,不幸的是,正在加载的内容是完全动态的..有什么推荐的解决方法吗? @DawidvanderHoven BTW 你能改变 HTML 吗? @DawidvanderHoven 更好,只有一个菜单出现:jsfiddle.net/webtiki/wtvaJ/2 哇,再次感谢您的帮助,从您那里学到了很多...我会奖励您 50 分,但显然必须等待 11 小时【参考方案2】:“当你缩放时,它需要粘在它所在的页面上,而不是显示其他页面”
要实现这一点,请保留对当前页面元素的引用,然后在调整窗口大小时无延迟地滚动到该元素:
var currentPage; //here is where we will hold the reference
jQuery('a.scrollitem').click(function ()
var targetPage = $(jQuery(this).attr('href'));
jQuery('a.scrollitem').removeClass('selected');
jQuery(this).addClass('selected');
jQuery('.toggle').css('display':'none');
jQuery('.wrapper').scrollTo(targetPage, 1200, function()
jQuery('.toggle').css('display':'block');
);
currentPage = targetPage; //here is where we set the reference
return false;
);
//and here we do a no-delay scrollTo
$(window).resize(function()
if(!!currentPage)
console.log('window resized. scrolling to: ', currentPage.attr('id'));
jQuery('.wrapper').scrollTo(currentPage);
);
在我看来,这使它反应灵敏。
页面需要能够很长(800 像素)并且仍然可以滚动,并且与最后一个页面没有间隙。
为了消除这个差距,我只是让所有page
s 比他们需要的时间长一点。滚动不受此影响,因为页面左对齐 left:0;
。我怀疑其他页面有相同的间隙,并且这些页面上的间隙被滚动条覆盖。
.page
width: 110%;
需要使用最低 ie9
这方面我恐怕帮不上忙;我只安装了 IE11。但是,嘿,它在 IE11 中效果很好。
Working fiddle
【讨论】:
感谢您的回答,它有效,但是...当您慢慢缩小窗口时,是否无法解决抖动问题。如果我将其设为 110% 宽度,它会在屏幕变小了…… 至于急躁……那是因为它一直在滚动!你可以添加一个延迟,这样它就不会那么频繁地更新,但你会看到差距。以上是关于响应式水平页面滑动的主要内容,如果未能解决你的问题,请参考以下文章