在这里也特别声明一下,这个教学里用到的图片素材都是由 Apple 网站中获取,图片版权归 Apple 所有,这里只用作教学演示用途,大家千万不要将这些图片用于真实的网页中。
打开 CodePen 编辑器,在 HTML 的部份加入标题。由于它有一个副标题,所以我会用 <p>
标签去装着它。然后加入一个 <div>
,id
名为 iphone
,里面新增两个 <div>
,id
分别是 hardware
和 ui
;hardware
会用来显示 iPhone 的机身和边框,而 ui
则会显示画面里面的内容。
先定义一些 CSS,让我们更加清楚知道在做什么。加入 :root
选择器,定义一些变量和样式:
--device-width
是 770px
--device-height
是 1336px
--ui-width
是 640px
15px
然后加入 #iphone
选择器,设定 position
是 relative
,宽度和高度的值从变量中获取。
再加入 #hardware
选择器,设定宽度和高度是 100%
,然后背景图片,载入 iPhone 的机身图片,为了支援 Retina Display 高清屏幕,这张图片的尺寸是两倍大小,所以设定 background-size
,宽度和高度同样等于变量的设定值。
好了,在这里想介绍一个图片遮罩的 CSS 属性,大家会发现现在 iPhone 的四周,圆型边框背后有个黑色背景:
而我发现 Apple 特地准备了一张遮罩图片,画出了 iPhone 的外型,用白色填充,而圆型边框的四周是透明的:
我们可以通过 mask-image
这个属性将遮罩图片套用上去。由于这个 CSS 属性还在试验阶段,所以要加上 -webkit
前缀的版本,与背景图片一样,图片是两倍大小,所以同样需要将遮罩的大小设定一下,将 mask-size
设定为变量的值,并且加上 -webkit
前缀的版本。
现在可以看到遮罩已经成功套用上,iPhone 的黑色背景不见了。至于为何 Apple 不直接将 iPhone 图片的背景设定为透明?我估计是为了优化图片的大小,因为透明底的图片需要用到 PNG 格式,而这么大张的彩色 PNG 图片容量上比起 JPG 会大不少,所以 Apple 就采用了高压缩比的 JPG 格式作为 iPhone 图片,再准备一张只有单色的 PNG 图片来做遮罩,这样的确可以省下不少网络频宽。
好了,介绍完这个属性,可以加入 body
选择器,将背景颜色设定为黑色,margin
设定为 0
,然后将网页的内容上下左右置中:
display
设定为 flex
flex-direction
设定为 column
justify-content
设定为 center
align-items
设定为 center
min-height
设定为 100vh
字体设定为 Helvetica
,再加入一些 padding
,设定上下是 4rem
,左右是 0
。
再设定一下标题的样式,加入 h2
选择器,文字颜色设定为灰色,text-align
设定为 center
将它置中,文字大小设定为 4.5rem
,文字粗度是 600
。然后 margin
设定为上下 6rem
,左右 0
。
加入 h2 p
选择器,设定副标题的样式,margin
设定为 0
,文字颜色设定为白色就可以了。
框架大置上设定好了,下一步就设定 iPhone 画面的内容。
在 #ui
里面加入一张图片,是画面顶部的 UI,然后就是每一行资料的图片,我会用 <ul>
列表去建构它,加入 <li>
,内容是一张图片,总共有 7 行。
回到 CSS 的部份,加入 #ui
选择器,position
设定为 absolute
,top
设定为 0
。然后要将它左右置中,先将 left
设定为 50%
,再将 transform
设定为 translateX(-50%)
就可以了。
加入 #ui .top-ui
选择器,设定顶部 UI 图片的定位。display
设定为 block
,宽度从变量中获取,高度是 auto
,然后 margin
,设定上方是 70px
,左右是 auto
,下方是 0
。再加一点 padding-bottom
,设定为 30px
,以及一条下边框线。
来到列表的部份,加入 #ui ul
选择器,将 list-style
设定为 none
,取消列表的样式,margin
和 padding
设定为 0
。
再设定里面的图片的样式,加入 #ui ul li img
选择器,设定 display
是 block
,宽度从变量中获取,高度是 auto
,margin
设定为上下 10px
,左右 auto
。padding-bottom
是 10px
,然后再加一条下边框线。
现在界面基本上已设定好了,接下来处理动画的部份。
我们先了解一下这个动画的原理,它是在页面卷动的时候,一行一行的由大至小滑入至列表中,先试试在 CSS 中将效果实现出来。
加入 #ui ul li img:hover
选择器,设定 transform
为 scale(1.8)
,然后 opacity
设定为 0
。在 #ui ul li img
选择器内加入 transition: .25s transform ease-in-out;
,现在试试将游标移至其中一行,就可以实现将图片由放大至缩小,回到列表中的效果。
再加一些位移,例如 translateY()
设定为 -60px
,效果大致上是这样:
不过这个动画并不是由游标触发,是随着页面卷动时触发,并且可以通过卷动控制动画的进度,所以我会通过 JavaScript 计算目前页面卷动了多少,然后再设定对应行数的 transform
和 opacity
。
为了简化 JavaScript 对 CSS 样式的设定,我想先在 CSS 这边做一个设定值,用来控制一行动画的进度。
先将 hover
和 transition
的设定值移除,然后在 HTML 里面,在第一个 li
那里加入 style
,设定 --progress
是 0.5
:
--progress
是我自己定义的 CSS 变量,我想在它的设定值为 0
时将 scale()
设定为 1.8
,以及 opacity
设定为 0
;而在它的设定值为 1
的时候,将 scale()
设定为 1
,opacity
设定为 1
。做到像是一个动画的开关的功能,那么我们在 JavaScript 那边,只需要调整这个 --progress
就可以控制动画。
在 #ui ul li img
里面,加入 transform
,先设定 scale()
,将 1.8
减去 0.8 * var(--progress)
,这样在 --progress
为 1
的时候,scale
就是 1
;而 --progress
为 0
的时候,scale
就是 1.8
了。
再来 translateY()
,将 -60px
乘以 1 \- var(--progress)
,这样在 --progress
为 1
时,translateY
就是 0
;而 --progress
为 0
的时候,translateY
就是 -60px
。
再将 opacity
直接设定为 --progress
的值,0
的时候会将它隐藏,1
的时候它就会显示。试试调整一下 --progress
的值,大家就可以看到这个设定值的具体作用了。
然后将 <li>
上的设定值移除,在 #ui ul
里将 --progress
初始化为 0
就可以了。
最后,就是用 JavaScript 控制动画。
首先定义一个名为 rows
的常量,将每一个 <li>
获取回来,再定义一个名为 html
的常量,赋值为 document.documentElement
,因为稍后会有几次引用 document.documentElement
的。
加入 document.addEventListener
,监听 scroll
页面卷动,定义一个变量,scrolled
等于 html.scrollTop
除以 html.scrollHeight
减去 html.clientHeight
。
这样会得出一个由 0
至 1
之间的值,页面卷动到最顶时是 0
,卷动到最底时是 1
。
接下来要将每一个 <li>
,一个接着一个,将 --progress
设定为 1
。
新增一个 for of
回圈,将每一个 <li>
获取出来,由于动画是一个接着一个,而页面卷动了多少可以经由 scrolled
获取,所以我们要计算每一个 <li>
在 0
至 1
之间的所属区间。
定义一个名为 total
的变量,将 1
除以 <li>
的总数,然后计算两个值,一个是 start
,将 total
乘以 index
,另一个是 end
,将 total
乘以 index
加 1
,通过 console.log()
,将每一个 <li>
的区间输出一下看看。
有了这些资料,我们可以计算每一个 <li>
的 --progress
的值了。定义变量 progress
,将 scrolled
减 start
除以 end
减 start
;然后如果 progress
大于等于 1
的话,将 progress
设定为 1
;少于等于 0
的话,就设定为 0
。
最后,将 progress
的值通过 setProperty
设定到 <li>
上。
以上,就是今集要介绍的全部内容。
这个案例的源代码在:https://codepen.io/stevenlei/pen/ExydYqp
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/GPx48vKu1n1OYB7pt0R9Hg
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。