带有React和GreenSock的3D CSS翻转捕捉
Jhey Tompkins 2021年11月29日0评论3D CSS FLIPY快照与反应和GRACESONK 14分钟阅读CSS,反应,工具,应用程序,技术分享在推特上,LinkedIn关于作者“KDSPG1”JHI做出令人敬畏的人可怕的东西!他是一名拥有近10年经验的web开发人员。与欧洲之星(Eurostar)、优步(Uber)等品牌合作,并为其服务……更多关于Jhey的信息↬
电子邮件时事通讯关于前端和用户体验的(精彩的)电子邮件“KDSP”每周提示。受到19万人的信任。
可访问的前端模式Masterclass在线提升您的前端技能免费开发者测试帐户快速摘要入门↬ 杰伊的一个主要咒语是让学习变得有趣。在本文中,他向您展示了通过将您的想法付诸实践来提高技能的方法,并且不会忘记您可以玩代码。有了这种心态,每一个想法都必然成为一个尝试新事物的机会。“KDSP”命名很难,对吗?“轻率的快照”是我能想到的最好的东西。一天晚上,我在电视上看到了这样的效果,我给自己做了一个笔记,让自己做一些类似的事情。
虽然这不是我希望在短期内投放到网站上的东西,但这是一个很好的小挑战。这符合我关于“代码中的游戏性”学习的整个立场。不管怎样,几天后,我坐在键盘前,几个小时后,我有了这个:
3D CSS Flippy Snaps点击以翻转另一个图像️ @reactjs&&@greensockhttps://t.co/Na14z40tHE 通过@CodePen图片。啁啾com/nz6pdQGpmd
-Jhey️ (@ JH3YY)2021年11月8日
我的最终演示是一个反应应用程序,但我们不需要挖掘使用反应来解释这项工作的机制。一旦我们确定了如何工作,我们将创建React应用程序。
注意:在开始之前。值得注意的是,此演示的性能受网格大小的影响,最好在基于Chromium的浏览器中查看演示。让我们从创建网格开始。假设我们想要一个10乘10的网格。这是100个细胞(这就是为什么React对于这样的东西很方便)。每个单元格将由一个元素组成,该元素包含可翻转卡的正面和背面。
“KDSP”我们网格的样式非常简单。我们可以使用display:grid并为网格大小使用自定义属性。这里我们默认为10。
。轻拍{显示:网格;网格间距:1px;网格模板行:重复(变量(--网格大小,10),1fr);
在演示中,我使用帕格为我生成这个。您可以通过单击演示中的“查看已编译的HTML”来查看已编译的HTML。
-常量网格大小=10-常数计数=数学。功率(网格尺寸,2)-常数x=f%网格大小.flippy-snap卡。flippy卡片(样式=`--x:${x};--y:${y};`).flippy-card_uu后“KDSP”然后我们需要一些样式。
。纸牌{--当前图像:url(“https://random-image.com/768");身高:100%;宽度:100%;位置:相对位置;}.flippy-card_uuu后部{身高:100%;背面可见性:隐藏;背景图像:var(--当前图像);背景尺寸:计算值(var(--网格尺寸,10)*100%);.flippy-card_uuu后部{背景图像:var(--下一幅图像);变换:旋转(180度)旋转(180度);}“KDSP”卡的后部通过变换组合旋转获得其位置。但是,有趣的部分是我们如何显示每张卡的图像部分。在这个演示中,我们使用一个自定义属性来定义两个图像的URL。然后我们将这些设置为每个卡片面的背景图像。
在跳跃之后更多!继续阅读下面的内容↓ “KDSP”将在前端和用户体验方面举办精彩的在线研讨会,包括实用外卖、现场会议、视频录制以及关于设计系统、CSS/JS和用户体验的友好问答。与Carie Fisher、Stefan Baumgartner和其他许多人合作。
跳转到在线研讨会↬
,但关键在于如何定义背景大小和背景位置。使用自定义属性--x和--y,我们将该值乘以-100%。然后我们将背景大小设置为——网格大小乘以100%。这将显示给定卡的正确图像部分。
查看画笔[2.添加图像](https://codepen.io/smashingmag/pen/gOxNLPz)作者:JHEY
见钢笔2。添加JHEY
的图像时,您可能已经注意到我们有--当前图像和--下一个图像。但是,目前,没有办法看到下一幅图像。为此,我们需要一种方法来扭转局面。我们可以为此使用另一个自定义属性。
让我们引入一个--count属性并为我们的卡设置一个转换:
。轻拍{透视图:50vmin;}.纸牌{转换:rotateX(计算值(var(--计数)*-180度));变换样式:保留-3d;}
我们可以在包含元素上设置--count属性。范围界定意味着所有卡片都可以拾取该值并使用它来变换它们在x轴上的旋转。我们还需要设置变换样式:preserve-3d,以便看到卡片的背面。设置透视图可以为我们提供3D透视图。
此演示允许您更新--count属性值,以便查看其效果。
见钢笔[3.转动卡片](https://codepen.io/smashingmag/pen/LYjKbZW)作者:JHEY
见钢笔3。在这一点上,您可以将其包装在那里,并设置一个简单的单击处理程序,该处理程序会递增--每次单击按一计数。
const SNAP=文档。查询选择器('.flippy snap')让计数=0常量更新=()=>快照。风格setProperty('--count',count++)断裂addEventListener('click',UPDATE)
删除网格间隙,您就会得到这个结果。单击捕捉将其翻转。
见钢笔[4.无聊的翻转](https://codepen.io/smashingmag/pen/eYEwBdN)作者:JHEY
见钢笔4。JHEY
的无聊翻转现在我们已经解决了基本的力学问题,是时候将其转化为React应用程序了。这里有点不对劲。
常量应用=()=>{const[disabled,setDisabled]=useState(true)const[gridSize,setGridSize]=useState(9)const grabPic=async()=>{const pic=等待取数('https://source.unsplash.com/random/1000x1000')}useffect(()=>{const url=await grabPic()setSnaps([url,nextUrl])}设置()const setNewImage=异步计数=>{const newSnap=wait grabPic()计数当前%2!==0 ? [快照,快照[1]:[快照[0],快照])}const onFlip=异步计数=>{setDisabled(真)}如果(snaps.length!==2)返回加载
返回(gridSize={gridSize}disabled={disabled}onFlip={onFlip}/>)const pic=等待取数('https://source.unsplash.com/random/1000x1000')返回图片。网址}//初始效果捕捉FlipySnap使用的两个捕捉useffect(()=>{const url=await grabPic()setSnaps([url,nextUrl])setDisabled(错误)设置()gridSize={gridSize}disabled={disabled}//切换“disabled”属性以停止垃圾邮件点击快照={snaps}onFlip={onFlip}snapRef={snapRef}const newSnap=wait grabbic()//抓取快照小睡(计数当前%2!==0 ? [快照,快照[1]:[快照[0],快照]setDisabled(false)//再次启用单击}const onFlip=异步计数=>{setNewImage(count)//抓取一个新的快照以显示常量单元格计数=数学。pow(网格大小,2)const count=useRef(0)常数翻转=e=>{计数当前=计数。电流+1if(onFlip)onFlip(count)}返回(className=“快速捕捉”风格={{“--网格大小”:网格大小,“--current image':`url('${snaps[0]}')`,}}onClick={flip}>{新数组(单元格计数).fill().map((单元格,索引)=>{常数x=索引%gridSize常数y=数学。楼层(索引/网格大小)键={index}风格={{“--y”:y,}}>))计数当前=计数。电流+1延迟:gsap。乌提尔斯。分发({金额:gridSize/20,网格:[gridSize,gridSize],放松:力量1。伊努特,持续时间:0.2,//此时更新图像},})常数y=数学。楼层(索引/网格大小)返回(data-snap-y={y}风格={{}}>延迟:gsap。乌提尔斯。分发({from:[x/gridSize,y/gridSize],金额:gridSize/20,}),//此时更新图像if(onFlip)onFlip(count)常数翻转=e=>{如果(禁用| |翻转.当前)返回const x=parseInt(e.target.parentNode.getAttribute('data-snap-x'),10)延迟:gsap。乌提尔斯。分发({from:[x/gridSize,y/gridSize],放松:力量1。伊努特,}),持续时间:0.2,翻转。电流=真翻转。电流=假})const x=parseInt(e.currentTarget.getAttribute('data-snap-x'),10)const y=parseInt(e.currentTarget.getAttribute('data-snap-y'),10)gsap。到(containerRef.current.querySelectorAll(“.flippy卡”){from:[x/gridSize,y/gridSize],放松:力量1。伊努特持续时间:0.1,转换:translate3d(0,0,计算((1-(变量(--悬停,1)))*5vmin))}“KDSP”这里我们说的是一张卡在z轴上最多移动5vmin。
然后使用onPointerOver道具将其应用于每张卡。
{新数组(单元格计数).fill().map((单元格,索引)=>{常数x=索引%gridSizeonPointerOver={indicate}className=“flippy卡”“--x”:x,)持续时间:0.1,className=“快速捕捉”ref={containerRef}onPointerLeave={reset}风格={{}}边框:6px实心#fff;左边框颜色:#000;底部:10%;宽度:8%;变换:平移3d(0,0,5vmin)旋转(0度);}@关键帧旋转{
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/141879.html
相关推荐
-
CSSvertical-align属性(CSS设置)vertical-align属性1,vertical-align特点的作用?设置元素笔直对齐的方法;2,该特点使用过程的注意点:与text-align特点不同,text
-
resize,CSSresize属性(CSS设置)resize属性为了增强用户体验,CSS3增加了很对的新属性,其中一个重要的属性就是resize,它允许用户通过拖动的方式改变元素的尺寸,到目前为止,主要用于可以使用ov
-
属性,CSStransition-delay属性(CSS设置)transition-delay属性在过渡效果开始前等待2秒:div{transition-delay:2s;-moz-transition-delay:2s
-
CSStransition属性(CSS设置)transition属性transition特点是一个简写特点,可用于设置四个过渡特点:transition-property过渡作用的CSS特点的名称(height、widt
-
属性,CSStransition-property属性(CSS设置)transition-property属性csstransition-property特点用于规则运用过渡作用的CSS特点的称号,其语法是transit
-
CSSwidows属性(CSS设置)widows属性widows属性是当页面要执行打印操作时的一个样式,表示当页面内部要分页的时候必须在页面顶部保留的最少行数,例如定义widows:2;就表示在页面顶部保留2行。css是