侧边栏导航(移动端商品--评论--详情)随楼层滑动高亮显示

demo下载地址

接触前端一年时间,开始还能感觉到自己的进步,随着时间的推移,开始不知道方向。因为各种前端的框架和插件在网上都能够找到现成的,直接下载下来用就好了。

从来不考虑其中的实现原理什么的,即便是去看了其中的源代码,也是知其然而不知其所以然。举一个简单的例子:去年圣诞公司要求页面上要有雪花飘落的效果,当时的第一想法,就是canvas绘图制作这个动画(必定培训的时候学的飞机大战有类似的效果),后来发现很难实现,于是就在网上找了一个jquery.snow.js的插件,发现原理很简单,

(一个div中加入html的雪花----设置初始的css----执行从上到下的飘落动画同时雪花在过程中透明----动画完成移除该div),克隆多个div执行前边的过程,看着是不是很简单。

我当时也这么认为,于是我就自己仿着做了一个(当时自己认为),其实就是照个抄了一遍,加了一点自己需要的功能(例如:随机雪花的颜色),然后我就认为这是自己的,在jquery的插件网站去发布,结果被拒绝了,我当时很失望但是没有找自己的原因(因为那是抄的),后来也写了一些轮播,导航点击页面滑动等(自己认为的插件),后来发现可复用性的很差,没有起到插件的作用。通过看别人的,学习了一段时间,才决定再次写一个,检验一下。


# 1.extend扩展方法

 

- iquery的extend方法,这是jquery插件常用的扩展方法方法,将插件的默认参数和用户自定义参数合并为一个新参数的对象。

 

 

var defaults = {
	floorClass : '.scroll-floor',
	navClass : '.scroll-nav',
	activeClass : 'active',
	activeTop : 100,
	scrollTop : 100,
	delayTime : 200
};
var newOptions = $.extend({}, defaults, options);

# 2.建立'获取每个楼层的jquery对象,以及该楼层滑动到窗口某位置导航高亮的TOP值,点击导航页面对应楼层滑动到窗口的某位置的TOP值'的函数

function getItem(_list,newOptions){
	_list.each(function() {
        var item = {};
        item.$obj = $body.find(this);
        item.$activeTop = $body.find(this).offset().top - newOptions.activeTop;
        item.$scrollTop = $body.find(this).offset().top + newOptions.scrollTop;
        
        data.push(item);
    });
}

# 3.建立'滚动监听函数,同时激活侧边栏导航高亮显示'的函数

function scrollActive(_list,newOptions){
	var nowScrollTop = $(window).scrollTop();
	$.each(data,function(i,item){
		if(nowScrollTop > item.$activeTop){
			_list.removeClass(newOptions.activeClass).eq(i).addClass(newOptions.activeClass);
		}
	});
}

# 4.建立'点击激活侧边栏导航高亮显示'的函数

function clickActive(_index,newOptions){
	$('html,body').animate({'scrollTop' : data[_index].$scrollTop},newOptions.delayTime);
}

# 5.插件接口的制作

var scroll_floor = window.scrollFloor = function(options){
	var newOptions = $.extend({}, defaults, options);
	var floorList = $body.find(newOptions.floorClass),navList = $body.find(newOptions.navClass);
	
	getItem(floorList,newOptions);
	scrollActive(navList,newOptions);
	
    $(window).bind('scroll',function(){scrollActive(navList,newOptions);});
    navList.bind('click',function(){
        var _index = $body.find(this).index();
        clickActive(_index,newOptions);
    });
}

# 6.完整插件的代码

(function(window){
	var defaults = {
		floorClass : '.scroll-floor',
		navClass : '.scroll-nav',
		activeClass : 'active',
		activeTop : 100,
		scrollTop : 100,
		delayTime : 200
	};
	
	var $body = $('body'),data = [];
	function getItem(_list,newOptions){
		_list.each(function() {
            var item = {};
            item.$obj = $body.find(this);
            item.$activeTop = $body.find(this).offset().top - newOptions.activeTop;
            item.$scrollTop = $body.find(this).offset().top + newOptions.scrollTop;
            
            data.push(item);
        });
	}
	
	function scrollActive(_list,newOptions){
		var nowScrollTop = $(window).scrollTop();
		$.each(data,function(i,item){
			if(nowScrollTop > item.$activeTop){
				_list.removeClass(newOptions.activeClass).eq(i).addClass(newOptions.activeClass);
			}
		});
	}
	
	function clickActive(_index,newOptions){
    	$('html,body').animate({'scrollTop' : data[_index].$scrollTop},newOptions.delayTime);
    }
	
	var scroll_floor = window.scrollFloor = function(options){
		var newOptions = $.extend({}, defaults, options);
		var floorList = $body.find(newOptions.floorClass),navList = $body.find(newOptions.navClass);
		
		getItem(floorList,newOptions);
		scrollActive(navList,newOptions);
		
        $(window).bind('scroll',function(){scrollActive(navList,newOptions);});
        navList.bind('click',function(){
            var _index = $body.find(this).index();
            clickActive(_index,newOptions);
        });
	}
})(window);

# 7.总结
该插件参考了会找人web端首页动画的js,就是先将所有楼层查找出来,然后将其需要的各个参数放入一个对象,滚动的监听的时候对该数组循环比对的思路。
思路对一个插件的制作很重要,就像我开始第一次制作这个插件的时候,就是将所有楼层的参数放到一个数组,然后对各个区间判断,这样就会使问题复杂话,同时还不好控制。
程序员的思路很重要,最开始可以很死板的按照步骤来,但是当我们慢慢的进化,就需要不断的对代码优化,每次优化都是一次学习,慢慢的不知不觉就会发现原来你会的雪莱越多。
例如:

 

 

if(nowScrollTop > item.$activeTop){
	_list.removeClass(newOptions.activeClass).eq(i).addClass(newOptions.activeClass);
}

替换为:

nowScrollTop > item.$activeTop&&_list.removeClass(newOptions.activeClass).eq(i).addClass(newOptions.activeClass);

开始都一样,但是它培养了我们写代码的习惯,越写越简单。不对的地方敬请指正!!!

类似京东(商品----详情----评论)页面

wap效果地址:https://rattenking.github.io/demo/06/scrollFloorWap.html

wap效果图:

下载wap的demo:

http://www.jq22.com/jquery-info15387

 

类似京东首页楼层

web效果地址:https://rattenking.github.io/demo/06/scrollFloorWeb.html

web效果图:

下载web的demo:

http://www.jq22.com/jquery-info15387

其他

[我的博客,欢迎交流!](http://rattenking.gitee.io/stone/index.html)

[我的CSDN博客,欢迎交流!](https://blog.csdn.net/m0_38082783)

[微信小程序专栏](https://blog.csdn.net/column/details/18335.html)

[前端笔记专栏](https://blog.csdn.net/column/details/18321.html)

[微信小程序实现部分高德地图功能的DEMO下载](http://download.csdn.net/download/m0_38082783/10244082)

[微信小程序实现MUI的部分效果的DEMO下载](http://download.csdn.net/download/m0_38082783/10196944)

[微信小程序实现MUI的GIT项目地址](https://github.com/Rattenking/WXTUI-DEMO)

[微信小程序实例列表](http://blog.csdn.net/m0_38082783/article/details/78853722)

[前端笔记列表](http://blog.csdn.net/m0_38082783/article/details/79208205)

[游戏列表](http://blog.csdn.net/m0_38082783/article/details/79035621)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关于Vue· 美籍华人尤雨溪所作,文档健全,生态完整,与脸谱的React各领前半边天下;· 相对于React,Vue相对于初学者更容易上手;· 目前统治C市场的跨平台框架uni-app也是基于Vue的基础技术栈进行开发;· Vue与React在框架设计上有极的相似度,上手Vue以后,我们可以轻松过渡到React学习;课程特色· 零基础教学,由浅入深,轻松诙谐,物超所值;· 基于官方文档教学,在学习Vue的同时学习阅读文档的方式,授人以鱼更授人以渔;· 课程包含Vuex和Vue-Router最新版内容,即所谓【Vue全家桶开发】;· 完整包含Vue3全部内容;· 含京东商城完整项目从零到一开发过程;· 含最新版@vue/cli的开发和生产环境打包流程;· 含Vite两套脚手架的开发和生产环境打包流程;· 含项目部署上线全流程;· 含自定义组件库阶课程,带你从零到一完成电梯组件开发与发布;· 附Vue频面试题50余道,OFFER轻松斩获;课程收益· 掌握Vue2+Vue3的框架基础知识;· 掌握Vue全家桶项目开发+打包+上线全流程;· 掌握自定义组件库技巧;· 掌握Vue频面试题回答技巧;课程关键词Vue2 Vue3 Vuex Vue-RouterVue项目 Vue全家桶@vue/cli Vite 项目打包 项目上线 自定义组件库 Vue面试题写在最后就连太阳光照到地球都需要8分钟,所以,你也需要时间,耐心一点,持续修炼。 
Ionic侧边是一个非常实用的组件,可以让用户轻松地在不同的页面之间进行导航。ion-side-menus是Ionic中用于创建侧边的指令,它提供了多个选项来控制侧边的外观和功能。 要使用ion-side-menus指令,需要在HTML中创建一个包含ion-side-menus指令的容器元素。然后,在容器中定义一个ion-side-menu-content指令,用于指定主要内容区域。在主要内容区域中,可以使用ion-nav-view指令来显示不同的页面。 在侧边中,可以使用ion-side-menu指令来定义侧边的内容。可以在侧边中包含任意数量的元素,包括列表、按钮和链接等。 当用户在侧边中选择一个项目时,可以使用ion-tap指令来处理点击事件。ion-tap指令可以与ng-click指令一起使用,用于在视图中触发特定的函数或操作。 下面是一个示例代码,展示了如何使用ion-side-menus和ion-tap指令来创建一个具有侧边导航的Ionic应用: ``` <ion-side-menus> <!-- 左侧侧边 --> <ion-side-menu side="left"> <ion-header-bar class="bar-dark"> <h1 class="title">菜单</h1> </ion-header-bar> <ion-content> <ion-list> <ion-item ng-click="openPage('home')">首页</ion-item> <ion-item ng-click="openPage('about')">关于</ion-item> <ion-item ng-click="openPage('contact')">联系我们</ion-item> </ion-list> </ion-content> </ion-side-menu> <!-- 主要内容区域 --> <ion-side-menu-content> <ion-header-bar class="bar-dark"> <button class="button button-icon ion-navicon" ng-click="toggleLeft()"> </button> <h1 class="title">我的应用</h1> </ion-header-bar> <ion-nav-view></ion-nav-view> </ion-side-menu-content> </ion-side-menus> ``` 在上面的代码中,我们创建了一个包含ion-side-menus指令的容器元素。在容器中,我们定义了一个包含ion-side-menu指令的左侧侧边,并在其中添加了一些项目。在主要内容区域中,我们使用ion-nav-view指令来显示不同的页面,并使用ion-header-bar指令来添加导航。在导航中,我们添加了一个按钮,用于打开左侧侧边,并使用ion-tap指令来处理点击事件。 最后,我们还需要在控制器中定义一个openPage函数,用于在点击侧边中的项目时导航到不同的页面。 ``` .controller('MyCtrl', function($scope, $ionicSideMenuDelegate, $state) { $scope.openPage = function(page) { $ionicSideMenuDelegate.toggleLeft(false); $state.go(page); }; $scope.toggleLeft = function() { $ionicSideMenuDelegate.toggleLeft(); }; }); ``` 在上面的代码中,我们定义了一个openPage函数,用于在点击侧边中的项目时导航到不同的页面。我们还定义了一个toggleLeft函数,用于打开或关闭左侧侧边。在openPage函数中,我们通过$state.go函数来导航到不同的页面,并在导航完成后关闭左侧侧边。在toggleLeft函数中,我们使用$ionicSideMenuDelegate.toggleLeft函数来打开或关闭左侧侧边。 总之,使用ion-side-menus和ion-tap指令可以轻松创建具有侧边导航的Ionic应用,并实现侧边中项目的点击事件处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值