整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

h5微传单页面制作的4个加分项

h5微传单页面制作的4个加分项

5微传单页面制作的4个加分项!


档描述

本文是关注微信小程序的开发和面试问题,

由基础到困难循序渐进,

适合面试和开发小程序。

并有热点框架(vue react node.js 全栈)前端资源以及后端视频资源和源码

并基于前端进阶和面试的需求 总结了常用插件和js算法

以及html/css 和js热点面试题

并总结了热点React/ES6/Vue面试题

Vue面试题

生命周期函数面试题

1.什么是 vue 生命周期

2.vue生命周期的作用是什么

3.第一次页面加载会触发哪几个钩子

4.简述每个周期具体适合哪些场景

5.created和mounted的区别

6.vue获取数据在哪个周期函数

7.请详细说下你对vue生命周期的理解?

vue路由面试题

1.mvvm 框架是什么?

2.vue-router 是什么?它有哪些组件

3.active-class 是哪个组件的属性?

4.怎么定义 vue-router 的动态路由? 怎么获取传过来的值

5.vue-router 有哪几种导航钩子?

6.$route 和 $router 的区别

7.vue-router响应路由参数的变化

8.vue-router传参

9.vue-router的两种模式

10.vue-router实现路由懒加载( 动态加载路由 )

vue常见面试题

1.vue优点

2.vue父组件向子组件传递数据?

3.子组件像父组件传递事件

4.v-show和v-if指令的共同点和不同点

5.如何让CSS只在当前组件中起作用

6.<keep-alive></keep-alive>的作用是什么?

7.如何获取dom

8.说出几种vue当中的指令和它的用法?

9. vue-loader是什么?使用它的用途有哪些?

10.为什么使用key

11.axios及安装

12.axios解决跨域

13.v-modal的使用

14.scss的安装以及使用

15. 请说出vue.cli项目中src目录每个文件夹和文件的用法?

16.分别简述computed和watch的使用场景

17.v-on可以监听多个方法吗

18.$nextTick的使用

19.vue组件中data为什么必须是一个函数

20.vue事件对象的使用

21 组件间的通信

22.渐进式框架的理解

23.Vue中双向数据绑定是如何实现的

24.单页面应用和多页面应用区别及优缺点

25.vue中过滤器有什么作用及详解

26.v-if和v-for的优先级

27.assets和static的区别

28.列举常用的指令

29.vue常用的修饰符

30.数组更新检测

31.Vue.set视图更新

32.自定义指令详解

33.vue的两个核心点

34.vue和jQuery的区别

35 引进组件的步骤

36.Vue-cli打包命令是什么?打包后悔导致路径问题,应该在哪里修改

37.三大框架的对比

38. 跨组件双向数据绑定

39.delete和Vue.delete删除数组的区别

40.SPA首屏加载慢如何解决

41.Vue-router跳转和location.href有什么区别

42. vue slot

43.你们vue项目是打包了一个js文件,一个css文件,还是有多个文件?

44.vue遇到的坑,如何解决的?

45.Vue里面router-link在电脑上有用,在安卓上没反应怎么解决?

46.Vue2中注册在router-link上事件无效解决方法

47.RouterLink在IE和Firefox中不起作用(路由不跳转)的问题

48.axios的特点有哪些

49.请说下封装 vue 组件的过程?

50.vue 各种组件通信方法(父子 子父 兄弟 爷孙 毫无关系的组件)

51.params和query的区别

52. vue mock数据

53 vue封装通用组件

54.vue初始化页面闪动问题

55.vue禁止弹窗后的屏幕滚动

56.vue更新数组时触发视图更新的方法

57.vue常用的UI组件库

58. vue如何引进本地背景图片

59. vue如何引进sass

60.vue修改打包后静态资源路径的修改

vuex常见面试题

1.vuex是什么?怎么使用?哪种功能场景使用它?

2.vuex有哪几种属性

3.不使用Vuex会带来什么问题

4.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中?

5.vuex一个例子方法

6.Vuex中如何异步修改状态

7.Vuex中actions和mutations的区别

vue项目实战

1.顶部悬停效果

2.电话本列表效果( 右边字母分类 上下滑动 旁边字母显示高亮)

3.vue做代理

4.Vue路由切换时的左滑和右滑效果示例

ES6面试题

ES6新增方法面试题

1.let const var比较

2.反引号(`)标识

3.函数默认参数

4.箭头函数

5.属性简写

6.方法简写

7.Object.keys()方法,获取对象的所有属性名或方法名

8.Object.assign ()原对象的属性和方法都合并到了目标对象

9.for...of 循环

10.import和export

11.Promise对象

12.解构赋值

13.set数据结构(可用于快速去重)

14.Spread Operator 展开运算符(...)

15.字符串新增方法

ES6数组面试题

1.forEach()

2.map()

3.filter()

4.reduce()

5.some()

6.every()

7.all()方法

ES6编程题

1.使用解构,实现两个变量的值的交换

2.利用数组推导,计算出数组 [1,2,3,4] 每一个元素的平方并组成新的数组。

3.使用ES6改下面的模板

4.把以下代码使用两种方法,来依次输出0到9?

react面试题

react生命周期面试题

1.react 生命周期函数

2.react生命周期中,最适合与服务端进行数据交互的是哪个函数

3.运行阶段生命周期调用顺序

4.shouldComponentUpdate 是做什么的,(react 性能优化是哪个周期函数?)

5.指出(组件)生命周期方法的不同

react 基础面试题

1.React 中 keys 的作用是什么?

2.React 中 refs 的作用是什么?

3.React 中有三种构建组件的方式

4.调用 setState 之后发生了什么?

5.react diff 原理(常考,大厂必考)

6.为什么建议传递给 setState 的参数是一个 callback 而不是一个对象

7.除了在构造函数中绑定 this,还有其它方式吗

8.setState第二个参数的作用

9.(在构造函数中)调用 super(props) 的目的是什么

10.简述 flux 思想

11.在 React 当中 Element 和 Component 有何区别?

12.描述事件在 React 中的处理方式。

13.createElement 和 cloneElement 有什么区别?

14.如何告诉 React 它应该编译生产环境版本?

15.Controlled Component 与 Uncontrolled Component 之间的区别是什么?

react组件面试题

1.展示组件(Presentational component)和容器组件(Container component)之间有何不同

2.类组件(Class component)和函数式组件(Functional component)之间有何不同

3.(组件的)状态(state)和属性(props)之间有何不同

4.何为受控组件(controlled component)

5.何为高阶组件(higher order component)

6.应该在 React 组件的何处发起 Ajax 请求

7.react中组件传值

8.什么时候在功能组件( Class Component )上使用类组件( Functional Component )?

9.受控组件( controlled component )与不受控制的组件( uncontrolled component )有什么区别?

10.react 组件的划分业务组件技术组件?

redux面试题

1.redux中间件

2.redux有什么缺点

3.了解 redux 么,说一下 redux 把

react性能比较面试题

1.vue和react的区别

2.react性能优化的方案

3.React 项目用过什么脚手架

4.介绍一下webpack webpack

5.如果你创建了类似于下面的 Twitter 元素,那么它相关的类定义是啥样子的?

6.为什么我们需要使用 React 提供的 Children API 而不是 JavaScript 的 map?

js面试题

1.简述同步和异步的区别

2.怎么添加、移除、复制、创建、和查找节点

3.实现一个函数clone 可以对Javascript中的五种主要数据类型(Number、string、Object、Array、Boolean)进行复制

4.如何消除一个数组里面重复的元素

5.写一个返回闭包的函数

6.使用递归完成1到100的累加

7.Javascript有哪几种数据类型

8.如何判断数据类型

9.console.log(1+'2')和console.log(1-'2')的打印结果

10.Js的事件委托是什么,原理是什么

11.如何改变函数内部的this指针的指向

12.列举几种解决跨域问题的方式,且说明原理

13.谈谈垃圾回收机制的方式及内存管理

14.写一个function ,清除字符串前后的空格

15.js实现继承的方法有哪些

16.判断一个变量是否是数组,有哪些办法

17.let ,const ,var 有什么区别

18.箭头函数与普通函数有什么区别

19.随机取1-10之间的整数

20.new操作符具体干了什么

21.Ajax原理

22.模块化开发怎么做

23.异步加载Js的方式有哪些

24.xml和 json的区别

25.webpack如何实现打包的

26.常见web安全及防护原理

27.用过哪些设计模式

28.为什么要同源限制

29.offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别

30.javascript有哪些方法定义对象

31.说说你对promise的了解

32.谈谈你对AMD、CMD的理解

33.web开发中会话跟踪的方法有哪些

34.介绍js有哪些内置对象?

35.说几条写JavaScript的基本规范?

36.javascript创建对象的几种方式?

37.eval是做什么的?

38.null,undefined 的区别?

39.[“1”, “2”, “3”].map(parseInt) 答案是多少?

40.javascript 代码中的”use strict”;是什么意思 ? 使用它区别是什么?

41.js延迟加载的方式有哪些?

42.defer和async

43.说说严格模式的限制

44.attribute和property的区别是什么?

45.ECMAScript6 怎么写class么,为什么会出现class这种东西?

46.常见兼容性问题

47.函数防抖节流的原理

48.原始类型有哪几种?null是对象吗?

49.为什么console.log(0.2+0.1==0.3) //false

50.说一下JS中类型转换的规则?

51.深拷贝和浅拷贝的区别?如何实现

52.如何判断this?箭头函数的this是什么

53.==和===的区别

54.什么是闭包

55.JavaScript原型,原型链 ? 有什么特点?

56.typeof()和instanceof()的用法区别

57.什么是变量提升

58.all、apply以及bind函数内部实现是怎么样的

59.为什么会出现setTimeout倒计时误差?如何减少

60.谈谈你对JS执行上下文栈和作用域链的理解

61.new的原理是什么?通过new的方式创建对象和通过字面量创建有什么区别?

62.prototype 和 proto 区别是什么?

63.使用ES5实现一个继承?

64.取数组的最大值(ES5、ES6)

65.ES6新的特性有哪些?

66.promise 有几种状态, Promise 有什么优缺点 ?

67.Promise构造函数是同步还是异步执行,then呢 ?promise如何实现then处理 ?

68.Promise和setTimeout的区别 ?

69.如何实现 Promise.all ?

70.如何实现 Promise.finally ?

71.如何判断img加载完成

72.如何阻止冒泡?

73.如何阻止默认事件?

74.ajax请求时,如何解释json数据

75.json和jsonp的区别?

76.如何用原生js给一个按钮绑定两个onclick事件?

77.拖拽会用到哪些事件

78.document.write和innerHTML的区别

79.jQuery的事件委托方法bind 、live、delegate、on之间有什么区别?

80.浏览器是如何渲染页面的?

81.$(document).ready()方法和window.onload有什么区别?

82. jquery中$.get()提交和$.post()提交有区别吗?

83.对前端路由的理解?前后端路由的区别?

84.手写一个类的继承

85.XMLHttpRequest:XMLHttpRequest.readyState;状态码的意思

正则表达式常见面试题

1.给一个连字符串例如:get-element-by-id转化成驼峰形式。

2.匹配二进制数字

3.非零的十进制数字 (有至少一位数字, 但是不能以0开头)

4.匹配一年中的12个月

5.匹配qq号最长为13为

6.匹配常见的固定电话号码

7.匹配ip地址

8.匹配用尖括号括起来的以a开头的字符串

9.分割数字每三个以一个逗号划分

10.判断字符串是否包含数字

11.判断电话号码

12.判断是否符合指定格式

13.判断是否符合USD格式

14.JS实现千位分隔符

15.获取 url 参数

16.验证邮箱

17.验证身份证号码

18.匹配汉字

19.去除首尾的'/'

20.判断日期格式是否符合 '2017-05-11'的形式,简单判断,只判断格式

21.判断日期格式是否符合 '2017-05-11'的形式,严格判断(比较复杂)

22.IPv4地址正则

23.十六进制颜色正则

24.车牌号正则

25.过滤HTML标签

26.密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符

27.URL正则

28.匹配浮点数

浏览器/html/css面试题

1.什么是盒模型

2.行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别?

3.简述src和href的区别

4.什么是css Hack

5.什么叫优雅降级和渐进增强

6.px和em的区别

7.HTML5 为什么只写

8.Http的状态码有哪些

9.一次完整的HTTP事务是怎么一个过程

10.HTTPS是如何实现加密

11.浏览器是如何渲染页面的

12.浏览器的内核有哪些?分别有什么代表的浏览器

13.页面导入时,使用link和@import有什么区别

14.如何优化图像,图像格式的区别

15.列举你了解Html5. Css3 新特性

16.可以通过哪些方法优化css3 animation渲染

17.列举几个前端性能方面的优化

18.如何实现同一个浏览器多个标签页之间的通信

19.浏览器的存储技术有哪些

20.css定位方式

21.尽可能多的写出浏览器兼容性问题

22.垂直上下居中的方法

23.响应式布局原理

25.清除浮动的方法

26.http协议和tcp协议

27.刷新页面,js请求一般会有哪些地方有缓存处理

28.如何对网站的文件和资源进行优化

29.你对网页标准和W3C重要性的理解

30.Http和https的区别

31.data-属性的作用

32.如何让Chrome浏览器显示小于12px的文字

33.哪些操作会引起页面回流(Reflow)

34.CSS预处理器的比较less sass

35.如何实现页面每次打开时清除本页缓存

36.什么是Virtual DOM,为何要用Virtual DOM

37.伪元素和伪类的区别

38.http的几种请求方法和区别

39.前端需要注意哪些SEO

40.的title和alt有什么区别

41.从浏览器地址栏输入url到显示页面的步骤

42.如何进行网站性能优化

43.语义化的理解

44.HTML5的离线储存怎么使用,工作原理能不能解释一下?

45.浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢

46.iframe有那些缺点?

47.WEB标准以及W3C标准是什么?

48.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?

49.HTML全局属性(global attribute)有哪些

50.Canvas和SVG有什么区别?

51.如何在页面上实现一个圆形的可点击区域?

52.网页验证码是干嘛的,是为了解决什么安全问题

53.请描述一下 cookies,sessionStorage 和 localStorage 的区别?

54. CSS选择器有哪些?哪些属性可以继承?

55.CSS优先级算法如何计算?

56.CSS3有哪些新特性?

57.请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?

58.用纯CSS创建一个三角形的原理是什么?

59.常见的兼容性问题?

60.为什么要初始化CSS样式

61.absolute的containing block计算方式跟正常流有什么不同?

62.CSS里的visibility属性有个collapse属性值?在不同浏览器下以后什么区别?

63.display:none与visibility:hidden的区别?

64.position跟display、overflow、float这些特性相互叠加后会怎么样?

65.对BFC规范(块级格式化上下文:block formatting context)的理解?

66.为什么会出现浮动和什么时候需要清除浮动?清除浮动的方式?

67.上下margin重合的问题

68. 设置元素浮动后,该元素的display值是多少?

69.移动端的布局用过媒体查询吗?

70.CSS优化、提高性能的方法有哪些?

71.浏览器是怎样解析CSS选择器的?

72.在网页中的应该使用奇数还是偶数的字体?为什么呢?

73.margin和padding分别适合什么场景使用?

74.元素竖向的百分比设定是相对于容器的高度吗?

75.全屏滚动的原理是什么?用到了CSS的哪些属性?

76.什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?

77. 视差滚动效果?

78.::before 和 :after中双冒号和单冒号有什么区别?解释一下这2个伪元素的作用

79.让页面里的字体变清晰,变细用CSS怎么做?

80. position:fixed;在android下无效怎么处理?

81.如果需要手动写动画,你认为最小时间间隔是多久,为什么?

82.li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

83.display:inline-block 什么时候会显示间隙?

84. 有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度

85.png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过webp?

86.style标签写在body后与body前有什么区别?

87.CSS属性overflow属性定义溢出元素内容区的内容会如何处理?

88.阐述一下CSS Sprites

89. 一行或多行文本超出隐藏

微信小程序开发(持续更新)

?

初识小程序

1.注册小程序

2.微信开发者工具

3.小程序与普通网页开发的区别

4.小程序尺寸单位rpx

5.样式导入(WeUI for)

6.选择器

7.小程序image高度自适应及裁剪问题

8.微信小程序长按识别二维码

9.给页面加背景色

10.微信小程序获取用户信息

11.代码审核和发布

12.小程序微信认证

13.小程序申请微信支付

14.小程序的目录解构及四种文件类型

15.小程序文件的作用域

16.小程序常用组件

1.view

2.scroll-view

3.swiper组件

4.movable-view

5.cover-view

6.cover-image

小程序基础

17.授权得到用户信息

18.数据绑定

19.列表渲染

20.条件渲染

21.公共模板建立

22.事件及事件绑定

23.引用

24.页面跳转

1.wx.switchTab

2.wx.reLaunch

3.wx.redirectTo

4.wx.navigateTo

5.wx.navigateBack

25.设置tabBar

26.页面生命周期

27.转发分享

小程序高级

28.request请求后台接口

29.http-promise 封装

30.webview

31.获取用户收货地址

32.获取地里位置

33.自定义组件

34.微信小程序支付问题

小程序项目实战

35.微信小程序本地数据缓存

36.下拉刷新和下拉加载

37.列表页向详情页跳转(动态修改title)

38.客服电话

39.星级评分组件

40.小程序插槽的使用slot

41.模糊查询

42.wxs过滤

43.小程序动画

44.列表根据索引值渲染

45.小程序动态修改class

46.小程序常用框架

47.参数传值的方法

48.提高小程序的应用速度

49.微信小程序的优劣势

50.小程序的双向绑定和vue的区别

51.微信小程序给按钮添加动画

52.微信小程序的tab按钮的转换

53.微信小程序引进echarts

54.APP打开小程序流程

55.小程序解析富文本编辑器

小程序常见bug

1.域名必须是HTTPS

2. input组件placeholder字体颜色

3. wx.navigateTo无法跳转到带tabbar的页面

4. tabbar在切换时页面数据无法刷新

5.如何去掉自定义button灰色的圆角边框

6.input textarea是APP的原生组件,z-index层级最高

7.一段文字如何换行

8.设置最外层标签的margin-bottom在IOS下不生效

9.小程序中canvas的图片不支持base64格式

10.回到页面顶部

11.wx.setStorageSync和wx.getStorageSync报错问题

12.如何获取微信群名称?

13.new Date跨平台兼容性问题

14.wx.getSystemInfoSync获取windowHeight不准确

15.图片本地资源名称,尽量使用小写命名

移动端热点问题

1. 1px border问题

2.2X图 3X图适配

3.图片在安卓上,有些设备模糊问题

4.固定定位布局 键盘挡住输入框内容

5.click的300ms延迟问题和点击穿透问题

6.phone及ipad下输入框默认内阴影

7.防止手机中页面放大和缩小

8.flex布局

9.px、em、rem、%、vw、vh、vm这些单位的区别

10. 移动端适配- dpr浅析

11.移动端扩展点击区域

12 上下拉动滚动条时卡顿、慢

13 长时间按住页面出现闪退

14. ios和android下触摸元素时出现半透明灰色遮罩

15. active兼容处理 即 伪类:active失效

16.webkit mask兼容处理

17. pc端与移动端字体大小的问题

18. transiton闪屏

19.圆角bug

20.如何解决禁用表单后移动端样式不统一问题?

js常用插件

轮播图插件

二级城市插件

三级城市插件

文字滑动效果

手风琴效果

视频播放插件

弹层插件

百度编辑器

ACE编辑器(轻巧)

上传图片(裁剪)

页面加载效果

全选反选各种效果

京东楼层效果

懒加载

快速建站(全栈)

dedecms(文章累)

discuz(论坛)

ecshop(电商)

PHPEMS(考试)

SS是一个很独特的语言。看起来非常简单,但是某种特殊效果看似简单,实现起来就颇有难度。这篇文章主要是给在学习前端的童鞋分享一些新的CSS技巧,一些在前端教程和培训课堂中不会讲到的知识。第二就是让还在前端开发这条道路上的童鞋们,重新燃起对前端排版和特效的热爱和热情!

1. 固定底部内容

这种是一个非常常见的布局方式,但是对于新手来说是比较常见的难题。

这种布局方式在后台管理系统中比较常见,当我们内容不足浏览器窗口高度时,底部内容需要固定在底部。当内容超出了浏览器窗口高度,就会随着内容往后推。

在有CSS3之前,实现这个效果是颇有难度的。浏览器窗口高度是会根据不同用户打开浏览器的情况,屏幕大小的差异和浏览器的缩放比例而变。我们需要借助JavaScript来实时获取浏览器高度进行运算才能实现。虽然说标题是说“固定”底部,但是我们想要的效果不是position: fixed。使用固定定位,在内容高于窗口高度时,就会挡住我们的内容。

随着CSS3的来临,最完美的实现方式是使用Flexbox。实现的关键就是使用不太被关注的flex-grow属性,可以在我们的内容标签元素(比如div)中使用。在我们下面的例子里使用了main标签。

我来讲解一下实现原理吧。

flew-grow是用来控制一个flex元素相对它同等级flex元素的自身可扩充的空间。如果我们使用flex-grow: 0,那这个flex元素就完全不会扩展了。所以我们需要把头部和底部之间的内容标签元素设置为flex-grow: 1或者flex-grow: auto,这样内容部分就会自动填充满头部和底部之外的所有空间。

为了避免底部内容受内容部分扩充空间的影响,我们给footer底部元素flex-shrink: 0属性。flex-shrink的作用与flex-grow是恰恰相反,用来控制flex元素收缩的空间,这里我们给了flex-shrink: 0就是为了底部footer的大小不受影响。

我们直接上HTML和CSS代码看看是怎么实现的。

  • HTML
<div id="document">
	<nav>
		<h1>头部内容</h1>
	</nav>
	<main>
		<p>可以添加更多内容看看底部的变化哦!</p>
	</main>
	<footer>
		<h1>底部内容</h1>
	</footer>
</div>
  • CSS
#document {
    height: 100vh;
    display: flex;
    flex-direction: column;
    background: #202020;
    font-family: microsoft yahei,wenquanyi micro hei,sans-serif !important;
}

nav, footer {
    background: #494949;
    display: flex;
    justify-content: center;
}

main {
    color: #bdbdbd;
    flex: auto;
}

footer {
    flex-shrink: 0;
}

* {
    margin: 0;
}

h1,
p {
    padding: 15px;
}

nav > h1 {
    color: #82FCFD;
    text-shadow: 1px 1px 4px #00000080;
}

footer > h1 {
    color: #82FCFD;
    text-shadow: 1px 1px 4px #00000080;
}

知识点总结:

flex-grow --- 是用来控制一个flex元素相对它同等级flex元素的自身可扩充的空间 flex-shrink --- 作用与flex-grow是恰恰相反,用来控制flex元素收缩的空间

2. 悬停放大图片特效

悬停放大图片是一个特别吸引眼球的特效,比较常用于可点击的图片。当用户悬停鼠标在图片上,图片会稍微的放大。

其实实现这个特效是非常简单的。首先我们需要一个div包裹这img标签,这个包裹层是用来遮挡住图片,当图片放大时不会出现图片超出我们规定的宽高以外。

首先我们来讲讲div包裹的属性,我们需要给它一个固定的width宽和height高。然后我们必须给予这个元素overflow: hidden属性。让图片放大的时候不会超出这个div元素的宽高。有了这个包裹层,我们就可以编写img的各种效果了。

我的例子里面用了transform: scale(1,1)作为悬停时的图片特效,这个transform是用于改变任何元素的属性的,然后scale是用于放大(整数就会放大)或者缩小(负数就会缩小)元素的。

上代码让大家看看:

  • html body中放入
<div class="img-wrapper">
  <img src="https://img-blog.csdnimg.cn/2020032122230564.png"/>
</div>
  • CSS
.img-wrapper {
  width: 400px;
  height: 400px;
  overflow: hidden;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
}

.img-wrapper img {
  height: 400px;
  -webkit-transition: 0.3s linear;
  transition: 0.3s linear;
}

.img-wrapper img:hover {
  transform: scale(1.1);
}

.img-wrapper {
  display: inline-block;
  box-sizing: border-box;
  border: 3px solid #000;
}

如果你们想让图片更加炫酷可以加上图片过滤属性filter,让图片变灰或者变深褐色,然后悬停时候出现更加炫酷的颜色变幻。灰化的属性是filter: grayscale(100%);,然后深褐色化的属性是filter: sepia(100%)。其实图片还有很多过滤属性的,大家有兴趣也可以去尝试一下哦!

加入特殊效果的代码如下:

  • HTML
<!-- 灰度过滤 -->
<div class="img-wrapper">
  <img
    class="grayscale-img"
    src="https://img-blog.csdnimg.cn/2020032211021728.png"
  />
</div>

<!-- 深褐色过滤 -->
<div class="img-wrapper">
  <img
    class="sepia-img"
    src="https://img-blog.csdnimg.cn/2020032122230564.png"
  />
</div>
  • CSS
/*==============* 灰度过滤 
*==============*/
.grayscale-img {
  -webkit-filter: grayscale(100%);
  filter: grayscale(100%);
}

.grayscale-img:hover {
  -webkit-filter: grayscale(0);
  filter: grayscale(0);
}

/*==============* 深褐色过滤
*==============*/
.sepia-img {
  -webkit-filter: sepia(100%);
  filter: sepia(100%);
}

.sepia-img:hover {
  -webkit-filter: sepia(0);
  filter: sepia(0);
}

知识总结

transform --- 用于改变元素 scale --- 对元素进行放大和缩小 filter --- 图片过滤器 grayscale --- 灰度过滤 sepia --- 深褐色过滤

3. 瞬间黑暗模式

最近微信也逃脱不了黑暗时代的到来,网页也很多都做了黑暗模式的兼容和主题。如果我们在做的一个网站想瞬间实现黑暗模式可以怎么实现呢?

其实有一个很快的方式,我们可以使用invert和hue-rotate两个CSS3过滤器来实现。

filter: invert() — 是从0到1的刻度,1是从白变黑。 filter: hue-rotate() — 用于改变你元素的颜色,同时或多或少保持原本相同的色系。这个属性的值可以从0deg到360deg。

在我们页面的body标签上添加这两个属性,我们就可以快速尝试把我们的网站变成"黑暗模式"。这里需要注意的是,如果body和html上没有设置background背景颜色,这个过滤就会不起效了哦。

CSS的代码如下:

html {
  background: #fff;
}

body {
  background: #fff;
  filter: invert(1) hue-rotate(270deg);
}

实现效果

这里我们会发现图片的颜色会受影响,并不是很美观,使用css过滤器是无法完美切换黑暗模式的。不过使用JavaScript辅助就可以完美的切换黑暗模式。

最近出了一个JavaScript辅助插件叫Darkmode.js。

Darkmode.js

其实Darkmode.js运用的也是css里面的一个特性叫mix-blend-mode — “CSS 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合“。加上Javascript的辅助判断哪些页面上的元素需要黑化的,哪些是不需要黑化的。就会想我们之前那种做法,导致其他不需要黑化的元素,比如图片,受到影响导致颜色出现问题。

使用Darkmode.js非常简单,只要在脚本里面添加以下代码就可以马上加入一个插件,

<script src="https://cdn.jsdelivr.net/npm/darkmode-js@1.5.5/lib/darkmode-js.min.js"></script>
<script>
  // 这些是这个插件的可配置项:
  var options={
    bottom: "32px", // 定位底部距离 - 默认: '32px'
    right: "32px", // 定位右边距离 - 默认: '32px'
    left: "unset", // 定位左边距离 - 默认: 'unset'
    time: "0.5s", // 默认动画时间: '0.3s'
    mixColor: "#fff", // 需要改变的颜色 - 默认: '#fff'
    backgroundColor: "#fff", // 背景颜色 - 默认: '#fff'
    buttonColorDark: "#262728", // 黑暗模式下按钮颜色 - 默认: '#100f2c'
    buttonColorLight: "#fff", // 日间模式下按钮颜色 - 默认: '#fff'
    saveInCookies: true, // 是否在cookie保存当前模式 - 默认: true,
    label: "", // 切换模式按钮图标 - 默认: ''
    autoMatchOsTheme: true // 是否自动根据系统适应模式 - 默认: true
  };

  let darkmode=new Darkmode(options);
  darkmode.showWidget();
</script>

如果你不希望用这个插件的默认按钮,你可以在你的JavaScript代码中自主控制。我们可以通过.toggle()方法来切换模式,同时可以使用.isActivated()来检测是否已经进入黑暗模式。

const darkmode=new Darkmode();
darkmode.toggle();
console.log(darkmode.isActivated()) // 如果已经进入黑暗模式会返回 true

知识总结

filter: invert() — 可以把页面从白变黑,也可以从黑变白。 filter: hue-rotate() — 用于改变你元素的颜色,同时或多或少保持原本相同的色系。 Darkmode.js — 瞬间实现黑暗模式。

4. 自定义列表符号

ul,li的无序列表有默认的符号·,但是在很多情况下我们希望可以给这个符号加入自己的样式和颜色,甚至是换成自定义的符号。默认的符号我们是无法做任何的样式处理,而且默认的符号在CSS属性里面只有几个选择可以使用,很多情况下都是无法满足我们的设计。

其实自定义无序列表符号不难,我们只需要使用伪类::before加content属性就可以实现。

在我这个例子里面我做了两个任务列表,一个是待处理任务,一个是已完成任务,各自给了不一样的列表符号和颜色。

实现原理

一、首先我们禁用了ul的默认符号样式list-style: none

二、在li的:before伪类上给予content内容值,待处理任务使用,已完成任务li.completed:before使用?

三、为了展示效果更加好看我分别给了li和li .completed两个不同的颜色

上代码看看是怎么实现的吧:

HTML

<div>
  <h2>待处理</h2>
  <ul>
    <li>待办任务1</li>
    <li>待办任务2</li>
    <li>待办任务3</li>
    <li>待办任务4</li>
    <li>待办任务5</li>
  </ul>
</div>
<div>
  <h2>已完成</h2>
  <ul>
    <li class="completed">完成任务1</li>
    <li class="completed">完成任务2</li>
    <li class="completed">完成任务3</li>
  </ul>
</div>

CSS

ul {
  list-style: none;
  color: #fff;
  font-size: 20px;
  border: 3px solid #000;
  padding: 1rem 2rem;
  min-height: 200px;
  margin: 15px 2rem 0 0;
  background: #323232;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
  border-radius: 8px;
}

li {
  padding: 0.3rem 0;
}

li::before {
  content: " ";
  color: aqua;
}

li.completed::before {
  content: "? ";
  text-decoration: none;
  color: greenyellow;
}

li.completed {
  text-decoration: line-through;
  color: #bdbdbd;
}

::before和::after伪类加content属性可以用来做很多特殊的效果,也是当代前端排版比较常用的“魔法”。说到伪类的使用,我再给大家说一个比较常用的使用场景。

在管理后台或者是文章展示中,我们经常可以见到的“面包屑导航”也是用伪类来插入每个目录中间的符号的。

实现逻辑

一、这个导航含有3个a标签,首先给每个a标签加入一个伪类::after,然后在content属性插入/符号。

二、然后使用a:first-child,这个伪类会选择到第一个a标签,然后使用content属性加入?符号。

三、因为我们第一步在每个a标签的后面插入了/符号, 所以我们需要在最后一个a标签清除掉。这里我们使用:last-child选择到最后一个a标签,然后用content: " "属性把伪类的内容清楚掉。

HTML

<div class="breadcrumb">
  <a>三钻</a>
  <a>前端</a>
  <a>教程</a>
</div>

CSS

.breadcrumb {
  font-size: 1.6rem;
  color: #fff;
}
.breadcrumb a:first-child {
  color: #82fcfd;
}
.breadcrumb a:first-child::before {
  content: " ? ";
}
.breadcrumb a::after {
  content: " /";
  color: #ef6eae;
}
.breadcrumb a:last-child::after {
  content: "";
}

知识总结

::before | ::after — 伪类用于向某些选择器添加特殊的效果。 content — CSS 属性用于在元素的 ::before 和 ::after 伪元素中插入内容。使用content 属性插入的内容都是匿名的可替换元素。 :first-child — CSS伪类表示在一组兄弟元素中的第一个元素。 :last-child — CSS伪类代表父元素的最后一个子元素。

5. 图片视差效果

这个超级炫酷的效果在官网中非常的受欢迎,这种效果可以给用户带来视觉冲击,也给我们的网站带来了活力。普通的网页图片会跟随着网页一起滑动,但是视觉差效果图就会固定在底部,只有图片所在的窗口上的元素会移动。

仅使用CSS

对你没有看错,这个效果只需要用到CSS就能轻易的实现!我们只要使用一个CSS背景图的属性background-attachment: fixed,这个特性会把背景相对于视口固定。即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。

实现理论:

一、在含有图片的元素中加入background: url()和background-size: cover(第二个属性适用于定义图片为封面,可以让图片大小自动适应,在很大的屏幕也会显示完整的图片)

二、然后附加固定背景图的属性background-attachment: fixed

三、最后给这个元素加入一个高度height: 100%或者任意的高度height: 400px

就那么简单哦!不用怀疑,马上上代码,大家都可以自己去试试哦!

HTML

<div class="wrapper">
   <div class="parallax-img"></img>
   <p>这里填写一堆文字就可以了,尽量多一点哦</p>
</div>

CSS

.wrapper {
  height: 100wh;
}
.parallax-img {
  background-attachment: fixed;
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  height: 100%;
  background-image: url("http://ppe.oss-cn-shenzhen.aliyuncs.com/collections/182/7/thumb.jpg");
}
p {
  font-size: 20px;
  padding: 1.5rem 3rem;
  min-height: 1000px; // 当你的文字内容不够,也能撑出足够的高度来看到效果,当然如果你文字足够多,就不需要了
}

如果想做到我动图里面一样的效果,或者想看是怎么实现的,可以查看下面总结里面的“预览实际效果”或者看“GitHub源码”。

知识总结

background-attachment: fixed — 把背景相对于视口固定。即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。 background-size: cover — 可以让图片大小自动适应,在很大的屏幕也会显示完整的图片。


使用CSS + JavaScript

有些童鞋可能没有被这个震撼到或者还是觉得不够刺激。那我们再来一个高级例子,上面的例子在滑动的时候图片是固定死的。如果我们加上JavaScript的助力,我们可以让窗口的图片缓慢的跟随这个页面滑动,使得效果更有动力和更有冲击感。

实现理论 首先讲一下排版,因为我们需要在我们滑动页面的时候使用JavaScript偏移图片,所以我们需要给图片一个CSS属性让我们可以让图片可以根据一个速度来往上或者往下移动。这个例子里面我们让所有图片包裹在一个div里面,class名为block。这个div给予相对定位属性position: relative,这个时候我们就可以在里面加入图片,然后让图片绝对定位position: absolute在这个div盒子里面。

但是图片是可能很大的,我们需要把图片不超出我们定义个盒子,所以我们的div同时也给予了overflow: hidden和一个高度height: 100%。这样图片超出div盒子就会被隐藏。

布局代码如下:

<div class="block">
  <img
    src="https://unsplash.it/1920/1920/?image=1005"
    data-speed="-1"
    class="img-parallax"
  />
  <h2>视差速度 -1</h2>
</div>
<div class="block">
  <img
    src="https://unsplash.it/1920/1920/?image=1067"
    data-speed="1"
    class="img-parallax"
  />
  <h2>视差速度 1</h2>
</div>
html, body{
  margin: 0;
  padding: 0;
  height: 100%;
  width: 100%;
  font-family: 'Amatic SC', cursive;
}
.block{
  width: 100%;
  height: 100%;
  position: relative;
  overflow: hidden;
  font-size: 16px;
}
.block h2{
  position: relative;
  display: block;
  text-align: center;
  margin: 0;
  top: 50%;
  transform: translateY(-50%);
  font-size: 10vw;
  color: white;
  font-weight: 400;
}
.img-parallax {
  width: 100vmax;
  z-index: -1;
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%,0);
  pointer-events: none
}

实现这个布局,在你滑动的时候,图片是不会移动的。因为最后一步就是加入JavaScript的辅助,让图片活起来。

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
// 循环获取每一个图片元素
$(".img-parallax").each(function () {
  var img=$(this);
  var imgParent=$(this).parent();
  function parallaxImg() {
    var speed=img.data("speed"); // 获取每张图片设置了的偏移速度
    var imgY=imgParent.offset().top; // 获取图片盒子所在的Y位置
    var winY=$(this).scrollTop(); // 获取当前滑动到的位置
    var winH=$(this).height(); // 获取浏览器窗口高度
    var parentH=imgParent.innerHeight(); // 获取图片盒子的内高度

    // 浏览器窗口底部的所在位置
    var winBottom=winY + winH; 

    // 当前图片是否进入浏览器窗口
    if (winBottom > imgY && winY < imgY + parentH) {
      // 运算图片需要开始移动的位置
      var imgBottom=(winBottom - imgY) * speed;
      // 运算出图片需要停止移动的位置
      var imgTop=winH + parentH;
      // 获取从开始移动到结束移动的%(根据开始与结束像素 + 移动速度)
      var imgPercent=(imgBottom / imgTop) * 100 + (50 - speed * 50);
    }
    img.css({
      top: imgPercent + "%",
      transform: "translate(-50%, -" + imgPercent + "%)",
    });
  }
  $(document).on({
    scroll: function () {
      parallaxImg();
    },
    ready: function () {
      parallaxImg();
    },
  });
});
</script>

知识总结

position: relative — 相对定位。 position: absolute — 绝对定位。 overflow: hidden — 如果需要,内容将被剪裁以适合填充框。 不提供滚动条。

6. 裁剪图像的动画

在有CSS3之前裁剪图片实现也是颇有难度的。现在我们有了两个非常方便简单的CSS3属性可以实现裁剪,那就是object-fit和object-position, 这两个属性可以让我们改变图片的大小,但是不影响图片的长宽比。

当然我们可以使用图片处理工具或者使用JavaScript等插件来实现图片裁剪功能。但是因为有了CSS3的属性,我们不只可以裁剪,我们还可以用裁剪的属性来做图片的动态效果。

为了让我们的例子更加简单,我们这里使用了<input type="checkbox">复选框元素,这样我们就可以使用:checked的伪类来触发启动效果。所以在例子里面我们完全不需要JavaScript的协助。

实现原理:

一、首先给予图片一个宽高height: 1080px,width: 1920px。

二、然后用CSS选择器,锁定当input被选中后img标签的样式变化。当被选中时,给图片设定一个新的宽高,这里我们给宽高各自500像素:width: 500px,height: 500px。

三、然后我们加上了过渡效果和时间让图片改变宽高时有动画过渡效果:transition: width 2s, height 4s;。

四、最后加上object-fit: cover和object-position: left-top这两个属性来保持图片的宽高比例,这样就大功告成了!

我们来看看完成的代码:

勾选裁剪图片 <input type="checkbox" />
<br />
<img
  src="https://img-blog.csdnimg.cn/2020032122230564.png"
  alt="Random"
/>
input {
  transform: scale(1.5); /* 只是用来放大复选框大小 */
  margin: 10px 5px;
  color: #fff;
}

img {
  width: 1920px;
  height: 1080px;
  transition: 0s;
}

/* css选择器锁定复选框被选中时的状态 */
input:checked + br + img {
  width: 500px;
  height: 500px;
  object-fit: cover;
  object-position: left-top;
  transition: width 2s, height 4s;
}

知识总结

object-fit — CSS 属性指定可替换元素的内容应该如何适应到其使用的高度和宽度确定的框。 object-position — 用来切换被替换元素的内容对象在元素框内的对齐方式。 transition — 过渡可以为一个元素在不同状态之间切换的时候定义不同的过渡效果。

7. 混合模式(Blend)

如果有使用过Photoshop的同学对blend混合模式应该是非常熟悉了,我们都知道混合模式是非常强大,也是p图时非常常用的一个功能。但是你们有没有想象过可以在浏览器的CSS中直接使用呢?对我们不需要设计师给我们做图,我们前端也可以实现混合模式了。

在CSS中我们不只可以对background背景加入混合模式,我们可以对任何一个元素的自带背景加入混合模式,让你可以做出很多之前没有想过的效果和排版。

往一个元素加入混合模式,我们只需要使用到一个CSS属性mix-blend-mode即可。

简单实现原理:

首先我们只需要加一个h1标题标签

<h1>混合模式:颜色减淡</h1>

然后我们给h1标签加入mix-blend-mode中的颜色减弱模式color-dodge,但是要注意的是我们需要给body和html加入背景颜色background: white,要不你会发现这个效果会无效。因为h1我们没有给颜色,会自动往上级继承,并且混合模式是针对背景颜色的过滤,所以body和html需要有背景颜色才行。

h1 {
   mix-blend-mode: color-dodge;
   font-family: yahei;
   font-size: 5rem;
   text-align: center;
   margin: 0; 
   padding: 20vh 200px;
   color: #D1956C;
 }

 html,
 body {
   margin: 0;
   background-color: white;
 }

 body {

   background-image: url(https://images.unsplash.com/photo-1505567745926-ba89000d255a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3302&q=80);
   background-repeat: no-repeat;
   background-size: cover;
   min-height: 100vh;
   overflow: hidden;
 }

换换背景图和h1标签的字体颜色就可以弄出各种不同的特效了。

知识总结

mix-blend-mode — CSS 属性描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。

8. 瀑布流布局

CSS Grid和Flexbox让我们可以更简便,更容易和更快的实现各式各样的响应布局,并且让我们快捷方便的在布局中实现横向剧中和竖向剧中。但是回想一下以前是颇为困难的。

虽然这些新出的布局方式可以让我们解决很多以前的布局难题,但是像瀑布流布局这种,就无法用它们简单来实现了。因为瀑布流一般来说都是宽度一致,但是高度是根据图片自适应的。并且图片的位置也是根据在上方图片的位置而定的。

其实最好实现瀑布流布局的办法就是用CSS的列属性套件,这套属性大多数都是用于排版杂志中的文本列。但是用于布局瀑布流也是特别实用哦。因为以前需要实现瀑布流,就必须有JavaScript的辅助来计算图片高度然后决定每张图片的定位和位置,所以现在有了列属性就可以使用纯CSS实现了。

实现原理:

实现这个布局,首选我们需要把所有的内容先包裹在一个div元素里面,然后给这个元素column-width和column-gap属性。

然后,为了防止任何元素被分割到两个列之间,将column-break-inside: avoid添加到各个元素中。

神奇的效果就完美实现了,零JavaScript。

我们来看看代码:

<div class="columns">
  <figure>
    <img src="https://source.unsplash.com/random?city" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?night" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?developer" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?building" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?water" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?coding" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?stars" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?forest" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?girls" alt="" />
  </figure>
  <figure>
    <img src="https://source.unsplash.com/random?working" alt="" />
  </figure>
</div>
.columns {
  column-width: 320px;
  column-gap: 15px;
  width: 90%;
  max-width: 1100px;
  margin: 50px auto;
}
.columns figure {
  display: inline-block;
  box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
  column-break-inside: avoid;
  border-radius: 8px;
}
.columns figure img {
  width: 100%;
  height: auto;
  margin-bottom: 15px;
  border-radius: 8px;
}

知识总结

column-width — CSS属性建议一个最佳列宽。 列宽是在添加另一列之前列将成为最大宽度。 column-width — 该 CSS 属性用来设置元素列之间的间隔 (gutter) 大小。 column-break-inside — 设置或检索对象内部是否断。

总结

我希望这8个前端小技巧和特效对大家有帮助,或多或少有吸收一点新的前端知识。这篇文章提到的内容,其实很多都是值得深挖和学习的。有一些例子我做的比较简单,但是其实是有无限的可能性。喜欢前端的童鞋们,让我们继续在前端领域中一起深挖,让我们的热爱无限的燃烧起来吧!



在最后我想给大家讲一下我对前端的热爱和态度。

回想前端这几年,发展真的是突飞猛进,从前端排版,HTML5+CSS3做H5页面,到前端组件化,各种UI框架满天飞。

一开始我随着热潮用起了UI框架,起初觉得特别方便,来一个新的项目就直接上一个UI框架,研发速度也非常快。但是久而久之就觉得前端开发变成了处理数据,对接接口,实现交互。

某天在阅览国外的一些前端设计和框架的时候,我突然发现国内多数的前端开发者都不再怎么使用CSS3做出一些很好玩的布局和特效了。现在市面上的系统和页面都是千篇一律,普遍都是用一些知名的UI框架搭建系统和APP,基本自己动手去排版已经少之又少。前端已不再是以前的前端,缺少了灵魂。

但是我们回想一下,我们刚刚开始学习前端的时候,让我们最有成就感,觉得前端特别有意思的那种感觉。就是那种让我们觉得神乎奇迹,不可思议的布局,特效和交互。那种感觉自己成功实现了很优美,很炫酷的页面和特效的感觉,让我们越做越来劲,越做越是兴奋。

但是在某些公司,研发部都是要求快速开发,UI设计部门也是受到时间的控制和限制,所以逐步走进了UI框架的限制之中。都是围绕这一些UI框架来设计和开发系统和应用。

作为一名热爱前端的开发者,我还是坚持在绝大多数的项目中,自己排版和实现页面交互特效。然后使用UI框架作为辅助,主要是用来减轻一些小组件和常用组建的快速实现。(可以说我是比较追求完美和外貌协会的程序员 )


作者:三钻
链接:https://juejin.im/post/5e8fc7826fb9a03c677e68d9
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。