精华内容
下载资源
问答
  • 从效果图上我们还看到有几点重要信息: 点赞动画图片大小不一,运动轨迹也是随机的 点赞动画图片都是先放大再匀速运动。 快到顶部的时候,是渐渐消失。 收到大量的点赞请求的时候,点赞动画不扎堆,井然有序持续出现...
  • 合并方式文本与数值互换】将选区的数字瞬间转换成文本;将选区的文本型数字瞬间转换成数值 【复选框工具】批量生成复选框(方框中打勾的工具),批量选定、取消复选框。且可以定义复框是否可以打印、与...
  • 实现一段文本垂直上下居中有几种方式? 假如设计稿的文字有6px,浏览器最小字体12px,怎么实现,(transform:scale 产生位置偏移怎么解决) 用css实现一个动画,点击元素宽度从100px变成200px 回流和重绘,有什么...

    一、HTML+CSS

    1. 实现左侧固定宽度,右侧自适应的布局,有几种方式?如果用display:inline-block可以实现么?有什么问题?
    2. 实现一段文本垂直上下居中有几种方式?
    3. 假如设计稿的文字有6px,浏览器最小字体12px,怎么实现,(transform:scale 产生位置偏移怎么解决)
    4. 用css实现一个动画,点击元素宽度从100px变成200px
    5. 回流和重绘,有什么关系?
    6. position有几个属性值
    7. position:absolute是相对谁定位的
    8. 移动端适配怎么做的?
    9. 苹果1像素的问题
    10. css优化有了解过么

    二、JavaScript

    1. js的基本类型
    2. 数组的方法有哪些?push、pop、shift、unshift、slice、splice、sort、reverse、foreach、filter、map、some、every、reduce等等都表示什么作用
    3. 与字符串方法split相对应数组中的方法是什么
    4. 翻转字符串的实现
    5. 手写代码多维数组降维(flat)
    6. this的指向有哪几种
    7. 接第6题引申出call、bind、apply的区别,手写call或者bind方法
    8. 防抖节流,手写防抖
    9. 事件循环eventLoop,为什么要有宏任务和微任务
    10. 函数去重有几种方法
    11. 深浅拷贝
    12. 怎样判断数组的类型,有几种方式,instanceof判断的返回值是什么类型
    13. 算法有了解过么?时间复杂度?
    14. 排序算法有了解过几种,冒泡排序,插入排序,快速排序等等,讲一讲其中某个排序的思路
    15. 函数柯里化有了解么,手写一段柯里化代码,(实现add(1)(2)的函数)
    16. new 做了什么
    17. var let const的区别
    18. 原型链的指向
    19. script标签中sync和defer的作用
    20. 构造函数的继承

    ES6

    1. es6有了解过哪些?用到过什么
    2. 箭头函数和普通函数有什么区别
    3. 箭头函数this的指向,为什么不能用new
    4. for…in 和 for…of 的区别
    5. set 和 map 数据结构

    三、 vue相关

    1. vue双向绑定的原理,包括vue 2.x和3.x
    2. 2.x和3.x版本有什么区别
    3. vue中如何检测数组变化,(延伸出)改写了哪些数组方法?
    4. diff算法的原理,比较方式
    5. 组件中的data为什么是一个函数
    6. vue的生命周期有哪些
    7. vue父子组件生命周期的调用顺序
    8. vue中key的作用
    9. 组件间通信的方式
    10. 当我们封装一个组件的时候怎么进行组件传参的?
    11. vue为什么是单向数据流
    12. vuex中actions和mutations的区别
    13. 有看过elementui的样式封装么?element-ui的原理,你是如何封装弹框中嵌套弹框这种样式的组件?
    14. 路由的原理,两种方式的区别
    15. 路由history需要后端配置什么?为什么需要后端配置
    16. vue什么地方用到了watch
    17. v-show和v-if的区别
    18. nextTick的原理
    19. 登录页的角色权限配置
    20. vue的性能优化
    21. 路由懒加载的原理
    22. 封装axios
    23. vue中.sync

    Promise

    1. promise的原理?
    2. promise.all怎么实现的,为什么要用for循环?
    3. promise的应用场景
    4. promise与async/await有什么区别
    5. await后面的代码可以怎么改写?
    6. 由上一题引申出 generator,了解generator么?
    7. 编程题,promise实现间隔2s打印出对应的结果,最后输出done,
    8. 假如有两个模块,都请求同样的接口,如何设计promise只请求一次

    webpack

    1. 项目中用webpack做了什么
    2. 怎么理解webpack的热更新 热替换
    3. loader和plugin的区别
    4. webpack的性能优化

    微信小程序

    1. 微信小程序的生命周期
    2. 页面跳转的几种方式,有什么区别,页面栈怎么变化的
    3. 项目开发遇到过什么问题
    4. 你觉得在开发微信小程序,H5,pc端项目有什么不同

    性能优化

    1. 性能优化都有用过哪些?
    2. 了解过cdn的原理么,cdn回源的原理
    3. 用chorme浏览器开发,network里你都会关注什么?
    4. 是怎么进行前端页面性能监控的,假如用户端产生bug要怎么定位到?
    5. 如何去排查页面中一些性能问题?
    6. 移动端首屏加载的时间过慢怎么处理?
    7. 大文件上传的解决方式

    git相关的一些命令

    git reset git rebase git revert

    浏览器缓存和一些零散知识点

    1. 用chorme浏览器开发,network里你都会关注什么?
    2. localstorage和sessionstorage的区别,cookie中有什么?同一个浏览器打开两个同源页面,其中一个网页修改了localstorage,另一个网页怎么进行监听?
    3. 了解过indexdb么?
    4. 强缓存和协商缓存
    5. http的状态码
    6. 接口是用post请求,前端用get请求,返回什么状态码
    7. get和post的区别
    8. 了解过Nginx么
    9. xss攻击
    10. https的原理
    11. 后台管理系统,左侧有一级导航,二级导航,在地址栏输入对应地址如何定位到左侧导航栏
    12. 正则表达式有了解过么
    13. 视频加密,文件加密,md5?这个我没懂
    14. http2.0复用
    15. 网络安全有了解过么

    编程题

    1. 给定起⽌日期,返回中间所有的月份; 参数是字符串格式,格式固定用-分割; 比如输入 2018-09 2019-01 ; 返回数组【2018-10 2018-11 2018-12】
    2. 给定一个只包括’(’,’)’,’{’,’}’,’[’,’]'的字符串,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合 2.左括号必须以正确的顺序闭合
    3. 获取 url 中的参数。输入 http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key 输出 [1, 2, 3]
    4. 统计数组中每个字符串出现次数
     /**
      * 统计数组中每个字符串出现次数
      * @param string[] strs: 字符串数组, 例如 ['aa', 'ab', 'ab', 'cc', 'cba']
      * @return {[key: string]: number} 出现次数对象, 例如 { aa: 1, ab: 2, cc: 1, cba: 1 }
    */
    
    1. 处理给定字符串
    /**
       * 请处理给定字符串:
       *   - 去掉无用字符和乱码, 只保留大小写英文字母, 单引号, 和空格
       *   - 把一个或多个连续无用字符和乱码换成一个空格. 注意多个乱码只替换成一个空格
       * @param str: 字符串, 例 "I'm我我我driving是to乱乱Beijing码after breakfast88"
       * @return str: 例 "I'm driving to Beijing after breakfast "
     */
    
    1. 会议室 输入是一个数组, 所有会议的开始和结束时间. 输出一共需要多少个会议室
    /**
        * 会议室, 输入是一个数组, 所有会议的开始和结束时间. 输出一共需要多少个会议室
        * @param meetings: 二维数组, 例 [[10, 20], [20, 30]],
        * @return int: 需要的会议室的个数, 例 1
        * 另一个测试用例: [[10,20], [19,30]] => 2
    */
    
    1. 部门安排组合
     /**
         * 部门安排所有组合
         * @param departments: dict, key是部门名, value是每个部门对应所有员工ID数组
         *   例 {'frontend': [1, 2], 'backend': [3, 4], 'devops': [5]}
         * @param required_department: dict, 该任务需要参与的部门和需要的人数
         *   例 {'frontend': 2, 'backend': 1}
         * @return 所有可能的员工组合, 例 [[1, 2, 3], [1, 2, 4]]. 按员工ID升序排序
     */
    

    写在最后,暂时整理到这么多,后续会继续来更新

    展开全文
  • 对于这种效果的实现方式,大概以下几种方式: 1.多个UITextField组成 这种方式好处是光标闪烁、但是在处理删除和动画效果时,就会显得有点笨拙,OFO应该是这样实现的,要严格处理好每个UITextField的First...
  • 文章目录赋值和获取值创建标签插入标签删除标签克隆标签替换标签遍历标签修改css事件响应页面加载事件事件绑定的几种方式事件的移除手动触发事件事件参数阻止冒泡和默认行为动画效果显示和隐藏淡入淡出效果滑动显示...

    这里记录一下JQuery中对元素的一些基本操作以及事件响应,便于以后查找。

    我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

    赋值和获取值

    • 文本内容

    text()用来获取,text(value)用来设置。设置是对匹配的全部元素,获取只是获取第一个元素。需要注意,设置的内容会替换掉原本的所有子元素,即使在设置的内容中包含html标签也不会解析为标签。

    • html内容

    html()html(value)分别来获取和设置,和文本不同的就是可以对内容进行html解析。

    • input表单值

    val()val(value)只用于表单中的input标签,值得注意的就是给多选框、单选框和下拉选框设置默认值,需要用数组,例如

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>	
    	<input type="checkbox" name="test" id="" value="a" />a
    	<input type="checkbox" name="test" id="" value="b" />b
    	<input type="checkbox" name="test" id="" value="c" />c
    	<script type="text/javascript">
    		var $test=$('[name=test]');
    		$test.val(['b']) 
    	</script>
    	</body>
    </html>
    

    创建标签

    创建标签类似于转换,直接用$()即可,比原生的document.createElement()要简洁的多

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>	
    	<div id="box1">
    		
    	</div>
    	<div id="box2">
    		
    	</div>
    	<script type="text/javascript">
    		var $test=$('<h3></h3>');
    		$test.text('This is a test')
    		$('div').append($test);
    	</script>
    	</body>
    </html>
    

    插入标签

    除了上面的append(),还有另外三种插入标签的方式

    • append(content) - 将内容追加到元素的子元素中
    • appendTo(content) - 将元素添加到内容的子元素中
    • prepend(content) - 将内容插入为元素的第一个子元素
    • prependTo(content) - 将元素插入为内容的第一个子元素

    上面这4种方法都是在元素的内容插入,下面的4种方法是在元素的外部插入

    • after(content) - 将内容追加到元素后面
    • insertAfter(content) - 将元素追加到内容后面
    • before(content)
    • insertBefore(content)

    删除标签

    3种方法用于删除或者清空标签

    • remove() - 从DOM中彻底删除元素及其子元素
    • detach() - 同样是删除元素,但是于remove不同的是JQ对象后续还可用
    • empty() - 并不删除元素,只是将元素内容清空

    克隆标签

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>	
    	<p>hello</p>
    	<script type="text/javascript">
    		var $hello=$('p');
    		$hello.click(()=>{
    			$hello.clone(true).insertAfter($hello);
    		})
    	</script>
    	</body>
    </html>
    

    注意这里的clone(true)的true表示连带克隆标签的事件响应,不加true则只是克隆标签本身。

    添加事件还可以用bind方法,类似于原生的addEventListener

    替换标签

    • replaceWith(content) - 将元素用内容进行替换
    • replaceAll(selector) - 用元素去替换所有的selector的元素

    遍历标签

    通过each(function)去便利每个元素,例如

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>	
    	<p>hello</p>
    	<p>hello</p>
    	<p>hello</p>
    	<script type="text/javascript">
    		$('p').each(function(index){
    			$(this).attr('title','我是第'+(index+1)+'个p标签');
    		})
    	</script>
    	</body>
    </html>
    

    注意两点

    • 这里的计算要加小括号,不然会从左到右执行,将两个数字都以字符串的形式拼接
    • 经过测试发现,用function(){}的匿名函数形式可以用this指代当前元素,但是用()=>{}的匿名函数形式就不可以

    修改css

    可以直接事先写好类的css,然后直接去修改标签的类即可达到修改css的目的

    • addClass()
    • removeClass()
    • toggleClass()

    也可以通过直接修改css样式达到目的

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>	
    	<p>hello</p>
    	<p>hello</p>
    	<p>hello</p>
    	<script type="text/javascript">
    		$('p').each(function(index){
    			$(this).css('font-size',(index+1)*20+'px');
    		})
    	</script>
    	</body>
    </html>
    

    注意这里的css属性既支持camel case也支持css字段,同时传递两个参数就是赋值,只传递前面的一个参数就是获取值。

    事件响应

    JQ中的事件和原生的名字基本一致,例如mousedownclickdblclick等等,主要是绑定的方式不太一样

    页面加载事件

    $(document).ready(function),页面所有DOM元素加载完以后出发函数,可以简写为$(function)。JQ的这种方式和原生的window.onload()有一些区别,首先是可以有多个,会按照顺序触发,而window.onload()只会触发最后一个。然后是window.onload()需要等页面所关联的文件图片等全部下载完毕才会触发,而JQ只需要DOM元素加载完毕就会触发,会快很多。所以也需要注意,对于一些需要等待下载完成才能执行的才做,例如获取图片的宽高,就只能用window.onload()

    事件绑定的几种方式

    • bind
    $('p').bind('click',function(){
    	console.log($(this).text());
    })
    

    这里对所有的p标签都绑定了一个点击事件,点击就会打印出该p标签的内容。但是bind方法的缺点也很明显,首先,bind方法采用隐式迭代,有多少个标签就会绑定多少次,当JQ匹配的元素多了以后性能会下降。其次,bind方法对尚未存在的标签无效,也就是说页面加载完毕后,又通过某事件在页面中新建一个p标签,这个新的p标签没有绑定点击事件。所以bind方法通常用于用id去查找得到的元素

    • on

    on方法可以很好的解决上面bind方法遇到的两个问题

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>
    		<button type="button">New P</button>
    		<div id="">
    			<p>hello1</p>
    			<p>hello2</p>
    			<p>hello3</p>
    		</div>
    	
    	<script type="text/javascript">
    		$('div').on('click','p',function(){
    			console.log($(this).text());
    		})
    		$('button').click(function(){
    			$('div').append($('<p>I am new</p>'))
    		})
    		
    	</script>
    	</body>
    </html>
    

    这里用on方法对p元素的父元素添加事件,当点击p元素的时候事件冒泡到父元素,然后执行对应的执行函数。这里on方法的第二个参数是一个选择器,是选择添加事件的元素的子元素,如果省略就是添加事件的元素本身。即使是新建的p元素因为同样会冒泡到父元素,所以依然会响应事件。但是on方法的缺点就是在DOM层级较深的时候效率不高

    事件的移除

    与上面两种绑定方式对应的移除分别是

    • unbind()
    $('p').unbind('click')
    
    • off()
    $('div').off('click','p')
    

    手动触发事件

    通过事件的trigger方法来手动触发事件

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<body>
    		<button type="button">New P</button>
    		<div id="">
    			<p>hello1</p>
    			<p>hello2</p>
    			<p>hello3</p>
    		</div>
    	
    	<script type="text/javascript">
    		var a=$('button').bind('click',function(){
    			$('div').append($('<p>I am new</p>'))
    		});
    		a.trigger('click');	
    	</script>
    	</body>
    </html>
    

    同时trigger方法还可以用数组去传递参数给回调函数

    var a=$('button').bind('click',function(e,para1,para2){
    	$('div').append($('<p>'+para1+' '+para2+'</p>'))
    });
    a.trigger('click',['hello','world']);
    

    不过要注意,因为和原生js一样,本身处理函数就有一个参数,所以,其余参数只能是从第二个开始

    事件参数

    和原生js一样,事件处理函数默认也有一个event参数

    var a=$('button').bind('click',function(e){
    	console.log(e)
    });
    a.trigger('click',['hello','world']);
    

    打印的内容基本和原生的一样,使用起来也是用点号

    console.log(e.pageX,e.pageY);
    

    阻止冒泡和默认行为

    和原生js一样也可以用event参数来进行操作

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<style type="text/css">
    		#box1 {
    			width: 300px;
    			height: 300px;
    			background-color: red;
    		}
    	</style>
    	<body>
    		<div id="box1">
    			
    		</div>
    	
    	<script type="text/javascript">
    		$('#box1').bind('click',function(e){
    			$(this).css('background-color','yellow');
    			e.stopPropagation();
    		})
    		$('body').bind('click',function(){
    			$(this).css('background-color','yellow');
    		})
    	</script>
    	</body>
    </html>
    

    不过JQ中可以将两者统一操作如下

    $('#box1').bind('click',function(e){
    	$(this).css('background-color','yellow');
    	// e.stopPropagation();
    	return false;
    })
    

    只需要在深层次的元素的处理函数中返回false就可以达到阻止冒泡和默认行为的目的

    动画效果

    显示和隐藏

    直接用JQ元素的hide()show()方法即可,可以不加参数,也可以加一个以毫秒为单位的时间,表示动画执行的时长,以及第二个参数做为回调函数。或者用toggle()方法自动去切换显示和隐藏的状态

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>				
    	</head>
    	<script src="js/jquery-3.5.1.js" type="text/javascript" charset="utf-8"></script>
    	<style type="text/css">
    		#box1 {
    			width: 300px;
    			height: 300px;
    			background-color: red;
    		}
    	</style>
    	<body>
    		<div id="box1">
    			
    		</div>
    		<button type="button" id="btn1">Hide</button>
    		<button type="button" id="btn2">Show</button>
    		<button type="button" id="btn3">Change</button>
    		
    	<script type="text/javascript">
    		$('#btn1').bind('click',function(){
    			$('#box1').hide(2000);
    		})
    		$('#btn2').bind('click',function(){
    			$('#box1').show(2000);
    		});
    		$('#btn3').bind('click',function(){
    			$('#box1').toggle(1000);
    		});
    	</script>
    	</body>
    </html>
    

    淡入淡出效果

    效果和上面的显示隐藏类似,不过在动画过程中只是元素的透明度发生了,也是有下面3种方法

    • fadeIn()
    • fadeOut()
    • fadeToggle()

    滑动显示效果

    • slideUp()
    • slideDown()
    • slideToggle()

    自定义动画

    自定义动画格式如下

    $(selector).animate({params},speed,callback);
    

    例如

    $('#btn1').bind('click',function(){
    	$('#box1').animate({height: '100px',width: '100px'},1000);
    })
    

    animate方法几乎可以操作所有的css,除了颜色需要插件。同时需要注意所有的属性要用camelCase才行。

    除了使用绝对值来设定动画的最终状态,还可以使用相对值,例如

    $('#btn1').bind('click',function(){
    	$('#box1').animate({height: '+=100px',width: '+=100px'},1000);
    })
    

    这样每次点击按钮宽和高都会增加100px。

    同时JQ还提供动画的队列功能,也就是依次执行多个动画

    $('#btn1').bind('click',function(){
    	$('#box1').animate({height: '-=50px',width: '-=50px'},1000);
    	$('#box1').animate({left: '+=100px',top: '+=100px'},1000);
    })
    

    如果要中途停止动画可以对同一个元素使用stop方法

    $('#btn2').bind('click',function(){
    	$('#box1').stop();
    });
    

    其中stop方法还可以传递两个布尔值的参数,分别表示是否清空动画队列,和是否跳到队列尽头,默认都是false。

    展开全文
  • 简介 如今我们经常能见到全屏网站,尤其是国外网站。这些网站用幅很大的图片...可设置滚动宽度、背景颜色、滚动速度、循环选项、回调、文本对齐方式等等 使用方法 1、引入文件 是自己下载他的jq包放在你的

    简介

    如今我们经常能见到全屏网站,尤其是国外网站。这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次
    fullPage.js 是一个基于 jQuery 的插件,它能够很方便、很轻松的制作出全屏网站,主要功能有:
    支持鼠标滚动
    支持前进后退和键盘控制
    多个回调函数
    支持手机、平板触摸事件
    支持 CSS3 动画
    支持窗口缩放
    窗口缩放时自动调整
    可设置滚动宽度、背景颜色、滚动速度、循环选项、回调、文本对齐方式等等

    使用方法

    1、引入文件
    有两种
    一种是自己下载他的jq包放在你的文件夹下面 然后引用
    css:

      <link rel="stylesheet" href="css/jquery.fullPage.css">
    

    js:

     <script src="js/jquery-1.8.3.min.js"></script>
     <script src='js/jquery.fullPage.min.js'></script>
     <script>
            $('#dowebok').fullpage({
                sectionsColor:['red','green','blue','#5e5e5e'],
                afterLoad:function(anchor,index){
                    //某一页切换到眼前执行
                    console.log('load',index);
                },
                onLeave:function(index,nextIndex,direction){
                    // 某一页要离开时候,会执行
                    console.log('leave',index,nextIndex,direction);
                }
    
            });
        </script>
    

    第二种是:
    引入地址:

    <link rel="stylesheet" href="css/jquery.fullPage.css">
    <script src="js/jquery.min.js"></script>
    
    <!-- jquery.easings.min.js 用于 easing 参数,也可以使用完整的 jQuery UI 代替,如果不需要设置 easing 参数,可去掉改文件 -->
    <script src="js/jquery.easings.min.js"></script>
    
    <!-- 如果 scrollOverflow 设置为 true,则需要引入 jquery.slimscroll.min.js,一般情况下不需要 -->
    <script src="js/jquery.slimscroll.min.js"></script>
    
    <script src="js/jquery.fullPage.js"></script>
    
     <script>
            $('#dowebok').fullpage({
                sectionsColor:['red','green','blue','#5e5e5e'],
                afterLoad:function(anchor,index){
                    //某一页切换到眼前执行
                    console.log('load',index);
                },
                onLeave:function(index,nextIndex,direction){
                    // 某一页要离开时候,会执行
                    console.log('leave',index,nextIndex,direction);
                }
    
            });
        </script>
    
    

    html:

    <div id="dowebok">
            <div class="section">
                <h3>第一屏</h3>
            </div>
            <div class="section">
                <h3>第二屏</h3>
            </div>
            <div class="section">
                <div class="slide">第三屏的第一屏</div>
                <div class="slide">第三屏的第二屏</div>
                <div class="slide">第三屏的第三屏</div>
                <div class="slide">第三屏的第四屏</div>
            </div>
            <div class="section">
                <h3>第四屏</h3>
            </div>
        </div>
    

    效果:
    在这里插入图片描述
    下面是底层代码 自己写的
    js:

    $.fn.extend({
        myFullPage:function(config){
            //初始化数据
            //把常用的数据且又要通过函数才能返回提前准备好了
            var $W = $(this);
            var $Section = $W.find('.section');
            var clientWidth = $(window).outerWidth();
            var clientHeight =$(window).outerHeight();
            //数组颜色
            var colorArray = config.colorArray;
            var commonstyle = {
                width:'100%',
                height:'100%'
            }
            $('html').add('body')
            .css({
                position:'relative',
                overflow:'hidden',
                margin:0
            })
            .add($W)
            .add($Section)
            .css(commonstyle);
            $W.css({
                position:'absolute',
                left:0,
                top:0
            }).find('.section')
            .each(function(index,ele){
                $(ele).css({
                    backgroundColor:colorArray[index],
                    position:'relative'
                }).find('.slide').css({//二级横向切屏
                    height:clientHeight,
                    width:clientWidth
                }).wrapAll($('<div class="sliderWarpper"></div>'))
            });
            //横向切屏样式
            $Section.find('.sliderWarpper').each(function(index,ele){
                $(ele).css({
                    display:'flex',
                    width:$(ele).find('.slide').size()*clientWidth,
                    height:clientHeight,
                    position:'absolute',
                    left:0,
                    top:0,
                })
            })
            $Section.eq(0).addClass('active')
            .end()
            .find('.sliderWarpper')
            .each(function(index,ele){
                $(ele).find('.slide').eq(0).addClass('innerActive');
            });
            var curIndex = 0;
            var lock = true;
            $(document).on('keydown',function(e){
                if( e.which == 38 || e.which == 40){
                    if(lock){
                        lock=false;
                        var direction = null;
                        var newTop = $W.offset().top;
                        if(e.which == 38 && curIndex!=0){
                            //top
                            direction = 'top';
                            newTop+=clientHeight;
                            config.onLeave(curIndex,direction);
                            curIndex--;
                        }else if(e.which == 40 && curIndex != ($Section.size()-1)){
                            //buttom
                            direction = 'buttom';
                            newTop -= clientHeight;
                            curIndex++;
                        }
        
                        $W.animate({
                            top:newTop,
                        },300,'swing',function(){
                            lock=true;
                            $Section.eq(curIndex).addClass('active');
                            //删除之前的 active 官方用了一个参数 direction
                            if(direction=='top'){
                                $Section.eq(curIndex+1).removeClass('active');
                            }else if(direction=='buttom') {
                                $Section.eq(curIndex-1).removeClass('active');
                            }
                        })
                        
                    }
                }
                if(e.which == 37 || e.which == 39){
                    if (lock) {
                        lock=false;x
                        var $SW=$('.active').find('.sliderWarpper');
                        var curShowDom = $SW.find('.innerActive');
                        console.log(curShowDom.index());
                        var newLeft = $SW.offset().left;
                        var direction = null;
                        if(e.which == 37 && curShowDom.index()!=0){
                            //left
                            console.log('1')
                            direction = 'left';
                            newLeft += clientWidth;
                        }else if(e.which == 39 && curShowDom.index() != $SW.find('.slide').size() -1 ){
                            //right
                            direction = 'right';
                            newLeft -= clientWidth;
                        }
                        $SW.animate({
                            left:newLeft,
                        },300,'swing',function(){
                            lock=true;  
                            direction != null ? curShowDom.removeClass('innerActive') : '';
                            console.log(direction);
                            console.log(direction != null ? curShowDom.removeClass('innerActive') : '');
                            //删除之前的 active 官方用了一个参数 direction
                            if(direction =='left'){
                                curShowDom.prev().addClass('innerActive');
                            }else if(direction=='right') {
                                curShowDom.next().addClass('innerActive');
                            }
                        })
                    }
                }
            })
        }
      
    })
    

    html:

     <div class="warpper">
            <div class="section">
               1
            </div>
            <div class="section">
                <div class="slide">1-1</div>
                <div class="slide">1-2</div>
                <div class="slide">1-3</div>
                <div class="slide">1-4</div>
            </div>
            <div class="section">3</div>
        </div>
        <script src="js/jquery-1.8.3.min.js"></script>
        <script src="js/MyFullPage.js"></script>
        <script>
            $('.warpper').myFullPage({
                colorArray:['red','green','blue','#5e5e5e'],
                onLeave:function(curIndex,direction){
                    console.log(curIndex,direction);
                }
            });
        </script>
    
    展开全文
  • 文本核心学习自文章: 一个Demo带你彻底掌握View的滑动冲突 修改相应代码,拓展原文只能下拉不能拖动上下滑动的问题。 下面先上效果图: ...实现滑动效果的方式我知道的以下几种,1.动画实现,2,使用Scr

    文本核心学习自文章:
    一个Demo带你彻底掌握View的滑动冲突
    修改相应代码,拓展原文只能下拉不能拖动上下滑动的问题。
    下面先上效果图:
    这里写图片描述
    整体可以滑动,下拉图片放大,上拉缩小,拉动过程中释放,布局自动回弹,子控件可滑动,不会跟最外层的控件产生冲突,大概的效果就是这样。
    下面我们一步一步来做,
    一、实现下拉回弹效果
    实现滑动效果的方式我知道的有以下几种,1.动画实现,2,使用Scroller(scrollBy,scrollTo),3,使用layout实时绘制
    那本文是使用的最后一种方式,就是利用layout(int l, int t, int r, int b)重新布局。
    首先我们先创建一个MyParentView继承自LinearLayout,因为我们这里使用到了LinearLayout的竖列排列特性。我们这个类要重写onTouchEvent方法,来处理相应的滑动逻辑,这里的滑动逻辑比较简单,直接看代码:

    @Override
        public boolean onTouchEvent(MotionEvent event) {
            int y = (int) event.getY();
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    yDown = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    yMove = y;
                    if (getTop() >= 0) {
                        mMove = yMove - yDown;
                        i += mMove;
                        layout(getLeft(), getTop() + mMove, getRight(), getBottom() + mMove);
                        if (listener != null) {
                            listener.onScroll(i);
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    layout(getLeft(), getTop() - i, getRight(), getBottom() - i);
                    i = 0;
                    break;
            }
            return true;
        }

    我们重点关注MotionEvent.ACTION_MOVE跟MotionEvent.ACTION_UP的处理,MotionEvent.ACTION_MOVE是滑动的过程中对布局进行重绘,MotionEvent.ACTION_UP是用来出来我们手指离开屏幕之后布局的回弹效果的,
    在MotionEvent.ACTION_DOWN中我们记录下开始按下的Y坐标值,
    在MotionEvent.ACTION_MOVE中我们根据滑动情况,计算出滑动的距离以及从按下到手指离开的总距离。这个地方我加了一个边界限制,getTop() >= 0,不允许拖动到屏幕上方去。
    在MotionEvent.ACTION_UP中,利用layout(int l, int t, int r, int b)将view的位置(移动)绘制到初始位置,实现了回弹效果,注意这里我说的是绘制而不是直接说的移动,因为我们利用的是layout(int l, int t, int r, int b)来实现回弹效果,所以这里没有滑动的过渡效果,如果要过渡效果,可以使用Scroller实现。本文重点还是放在处理view冲突上面。
    下面贴上xml布局代码

     <com.csf.custonviewdemo.view.MyParentView
            android:id="@+id/p_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent"
            android:paddingTop="200dp"
            android:orientation="vertical"
            android:visibility="visible">
    
    
    
                <LinearLayout
                    android:id="@+id/ly_child"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
    
                    <include layout="@layout/item" />
                </LinearLayout>
    
    
        </com.csf.custonviewdemo.view.MyParentView>

    把他当成一个线性布局去使用就好了,接下来我们在MyParentView下增加可滑动的控件,这里放置一个ScrollView

    二.子View的滚动实现
    我们用一个ScrollView将ly_child的控件包裹起来,运行一下效果看看,这个时候大家会发现什么情况呢?没错,ly_child可以自由滑动了,可是我们给MyParentView做的拖动效果在点击ScrollView区域上面失效了,这个是为什么?
    这是因为我们的滑动事件被ScrollView消费了,当我们在MyParentView跟ScrollView中的滑动方向一致的时候,由于系统没办法知道我们的滑动逻辑,所以就会出现上述问题,这个就是我们常说的布局冲突了,那怎么解决冲突了,这里我们利用外部拦截法
    什么是外部拦截法?
    我们的触摸事件是从外层布局向子布局传递的,那我们在MyParentView中重写onInterceptTouchEvent方法进行滑动拦截

       @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            int y = (int) ev.getY();
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    yDown = y;
                    break;
                case MotionEvent.ACTION_MOVE:
                    yMove = y;
                    if (yMove - yDown > 0 || getTop() > 0) {
                        return true;
                    } else {
                        return false;
                    }
            }
            return super.onInterceptTouchEvent(ev);
        }

    我们在MotionEvent.ACTION_MOVE的时候判断,如果滑动方向是向下,我们MyParentView就拦截掉,自己处理了。我们运行下代码看下效果,发现,果然,在ScrollView区域,我们下拉MyParentView的滑动效果就出来了,可是随之问题又出现了,我们的ScrollView中的内容如果要往回滚就不行了,只有按住下滑之后才能回滚,这就很尴尬了。
    我们再重新梳理下思路,我们上面的要实现的效果,冲突的地方就是MyParentView跟ScrollView重叠的区域,我们在ScrollView中只有下拉这个动作会跟MyParentView有冲突,而ScrollView中我们只有当ScrollView中的内容有滑动的情况下才需要响应下拉动作,就是说当ScrollView的滚动距离(垂直方向)getScrollY()为0的时候,我们将下拉的动作交给MyParentView不就好了。那思路缕清了,那怎么做呢?
    这里就需要用到内部拦截法了。
    内部拦截法:就是在ScrollView中自己做处理,

    public class MyScrollView extends ScrollView {
    
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (getScrollY() == 0) {
                getParent().requestDisallowInterceptTouchEvent(false);
            } else {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            return super.onInterceptTouchEvent(ev);
        }
    }

    在getScrollY() == 0的情况下,设置getParent().requestDisallowInterceptTouchEvent(false);运行父布局进行事件拦截,就是说父布局的外部拦截法处理能够生效,如果getScrollY() 不等于0,就是说ScrollView 还需要消费滑动事件,这个时候,在ScrollView 区域的滑动都交给它自己,即使外部布局设置了外部拦截,设置了getParent().requestDisallowInterceptTouchEvent(true);之后外部拦截都会失效。
    现在布局的冲突已经解决了,那我们接着往下看
    三、图片根据滑动距离放大缩小,透明度改变
    直接上代码:

     float scale = 1 + offset / (float) height;
            Matrix matrix = new Matrix();
            matrix.setScale(scale, scale, height / 2, height / 2);
            float alpha = 0.5f + offset / (float) height;
            alpha = alpha > 1.0f ? 1.0f : alpha;
            imageView.setAlpha(alpha);
            imageView.setImageMatrix(matrix);

    根据滑动的偏移量进行计算得出scale来改变,这里imageView记得设置属性android:scaleType=”matrix”。
    如果代码中有什么Bug或者文章中有什么讲解不到位或者错误的地方,请指正,谢谢!
    附上Demo地址:
    http://download.csdn.net/download/q919233914/9707467
    那本文就到此结束!

    展开全文
  • 学习Web 2.0 (五)

    2006-01-23 14:27:00
    Web 2.0阶段的一个重要特征是开放,和Web初期的开放很大不同,以下几种突出的表现:内容方面。- 内容的创作共用授权。它的广谱和可选择性,让它具有了足够的生命力。CC先是在网志圈中广泛采用,后来许多商业公司...
  • flash shiti

    2014-03-14 10:32:41
    40.Number将参数转换成数值其返回值几种情况? A. 如果X为一数字,则返回值即为该数字; B. 如果X为一布尔数,则返回0或1; C. 如果X为一字符串,则函数将X解释为一个指数形式的十进制数; D. 如果X未定义,...
  • 【生成数据列】 生成发票号码序列的得力助手,可以生成任意的奇偶数列,差值或倍值或者递增、递减的任意有理数数据序列,支持先行后列与先列后行两种方式,支持瞬时恢复清除。 【取RMB张数】 根据员工的工资计算需要...
  • 模拟电梯系统程序设计

    热门讨论 2010-07-12 17:28:06
    如果输入从数据文件中取得,则程序的运行应该种方式动画方式、快速方式和完全方式。如果输入从键盘获得,那么只能采用动画方式或完全方式,不能使用快速方式。 a.动画方式花费较长的时间来直观地模拟电梯...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    【选区背景选择】 进行着色功能切换,支持行着色、列着色、行与列同时着色、智能着色、选区着色、反向着色共6种方式供选择,可以自定义56种基本及颜色板任意着色颜色。 【条件背景】 默认启动智能着色方式,此功能...
  • 【生成数据列】 生成发票号码序列的得力助手,可以生成任意的奇偶数列,差值或倍值或者递增、递减的任意有理数数据序列,支持先行后列与先列后行两种方式,支持瞬时恢复清除。 【取RMB张数】 根据员工的工资计算...
  • 【生成数据列】 生成发票号码序列的得力助手,可以生成任意的奇偶数列,差值或倍值或者递增、递减的任意有理数数据序列,支持先行后列与先列后行两种方式,支持瞬时恢复清除。 【取RMB张数】 根据员工的工资计算...
  • 【生成数据列】 生成发票号码序列的得力助手,可以生成任意的奇偶数列,差值或倍值或者递增、递减的任意有理数数据序列,支持先行后列与先列后行两种方式,支持瞬时恢复清除。 【取RMB张数】 根据员工的工资计算...
  • 图片(图片/flash/文字/代码四类型)(弹出、漂浮、页面固定三显示方式)广告、文本广告、代码广告等,生成js,可在任何地方调用。 4.留言系统 留言配置、查看留言、签写留言、留言过滤字符设置、前台管理、...
  • css入门笔记

    2018-05-15 14:58:57
    使用css样式方式 1.内联样式 行内样式 特点:将css样式定义在HTML标记中 语法: 样式声明:用样式属性和值组成(属性:值;) 常用的样式属性: 1.颜色 属性 :color 颜色 取值:颜色英文名 2.背景颜色 ...
  • GSP5.exe

    2020-04-01 09:16:40
    几何画板中的对象“动”的方法3,前面学习过一是:拖动对象的某一部分(或一点、一线),使得由于各种几何关系连接起来的图形整体一起变化。还有两就是对象的移动与动画。 移动 [例]制作“两圆的位置关系”...
  • SkinSE只用到了windows个底层的核心库,没有用到(MFC/ATL等第三方库),采用纯API编写,采用C语言导出方式,增强可移植性,可以用于多种计算机语言。 1.SKINSE界面库内部没有完全采用HOOK拦截窗口的机制,主要采用...
  • Tcl_TK编程权威指南pdf

    热门讨论 2011-03-25 09:30:55
    跨平台的文件命名方式 操作文件和目录 文件属性 对i/o命令的总结 打开文件用于i/o操作 读写操作 当前目录-cd和pwd 使用glob来匹配文件名 exit和pid命令 环境变量 registry命令 第2部分tcl高级特性 第10...
  • 有些专家会告诉你,CSS3现在还用不上,甚至年之后都不会成熟的规范发布。 目前为止CSS3还没有一套成熟的规范,其中的模块也在不断更新,特别是浏览器对CSS3特性的支持也在不断变化,同时没有足够的时间去学习...
  • Microsoft C# Windows程序设计(上下册)

    热门讨论 2011-08-05 10:28:13
    1.18 句题外话 .第二章 欢迎使用windows forms 2.1 消息框 2.2 窗体 2.3 显示窗体 2.4 它是一个应用程序,我们想要运行它 2.5 主题的多种形式 2.6 窗体的属性 2.7 事件驱动的输入 2.8 处理...
  • 实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同显示...
  • 图片(图片/flash/文字/代码四类型)(弹出、漂浮、页面固定三显示方式)广告、文本广告、代码广告等,生成js,可在任何地方调用。 4.留言系统 留言配置、查看留言、签写留言、留言过滤字符设置、前台管理、...
  • 实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同...
  • C++范例大全(400)

    2013-06-29 21:23:07
    实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同显示...
  • 实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同显示...
  • VC++6.0示例程序光盘

    热门讨论 2012-03-18 13:40:03
    实例066——创建带有文本指示的自定义进度条 实例067——动态创建和删除编辑控件 实例068——在视图中创建和使用控件 第4章 实例069——使用列表控件添加和选择数据项 实例070——动态设置列表控件的不同显示...
  • 实例241 设置RichTextBox控件中的文本对齐方式 11.5 ListBox控件应用 实例242 在ListBox控件中实现选择项功能 实例243 选中ListBox控件中全部条目 实例244 对ListBox控件中的数据进行排序 实例245 在ListBox...
  • 输入方式可以采用两方法: a.从键盘输入。例如:可以在程序刚开始运行时,先提示用户从键盘输入初始化信息;运行中从键盘接受小火车的控制信号。以A车示例,可以设定初始化信息的输入顺序如下: [A Speed] //A...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

动画文本有几种方式