关于transform:论文解读transformer小目标检测综述

一、简要介绍 Transformer在计算机视觉畛域迅速遍及,特地是在指标辨认和检测畛域。在查看最先进的指标检测办法的后果时,咱们留神到,在简直每个视频或图像数据集中,transformer始终优于欠缺的基于cnn的检测器。尽管基于transformer的办法依然处于小指标检测(SOD)技术的前沿,但本文旨在摸索如此宽泛的网络所提供的性能效益,并确定其SOD劣势的潜在起因。小指标因为其低可见性,已被确定为检测框架中最具挑战性的指标类型之一。论文的目标是钻研能够进步transformer在SOD中的性能的潜在策略。本考察对逾越2020年至2023年的60多个针对SOD工作开发的transformer的钻研进行了分类。这些钻研包含各种检测利用,包含在通用图像、航空图像、医学图像、被动毫米图像、水下图像和视频中的小指标检测。论文还编制并提供了12个适宜SOD的大规模数据集,这些数据集在以前的钻研中被忽视了,并应用风行的指标如均匀均匀精度(mAP)、每秒帧(FPS)、参数数量等来比拟回顾钻研的性能。 二、钻研背景 小型指标检测(SOD)已被认为是最先进的(SOTA)指标检测办法的一个重大挑战。术语“小指标”指的是占据输出图像的一小部分的指标。例如,在宽泛应用的MS COCO数据集中,它定义了在典型的480×640图像中,边界框为32×32像素或更小的指标(图1)。其余数据集也有本人的定义,例如,占图像10%的指标。小指标常常被谬误的部分边界框脱漏或发现,有时还会有不正确的标签。SOD中定位有余的次要起因是输出图像或视频帧中提供的信息无限,再加上它们在深度网络中通过多层时随后经验的空间进化。因为小指标经常出现在行人检测、医学图像剖析、人脸识别、交通标志检测、交通灯检测、船舶检测、基于合成孔径雷达(SAR)的指标检测等各种应用领域中,因而值得钻研古代深度学习SOD技术的性能。在本文中,作者比拟了基于transformer的检测器与基于卷积神经网络(CNNs)的检测器在其小指标检测方面的性能。在性能显著优于cnn的状况下,论文而后试图揭示transformer的弱小性能背地的起因。一个间接的解释可能是,transformer建模了输出图像中成对地位之间的相互作用。这是一种无效的编码上下文的形式。而且,在人类和计算模型中,上下文都是检测和辨认小指标的次要信息起源。然而,这可能不是解释transformer胜利的惟一因素。具体来说,论文的指标是从几个维度来剖析这一胜利,包含指标示意、对高分辨率或多尺度特色图的疾速关注、齐全基于transformer的检测、架构和块批改、辅助技术、改良的特色示意和时空信息。此外,论文还指出了有可能进步SOD transformer性能的办法。 在之前的工作中,论文考察了许多基于深度学习的策略,以进步到2022年在光学图像和视频中的小指标检测的性能。论文发现,除了适应transformer等较新的深度学习构造之外,风行的办法还包含数据加强、超分辨率、多尺度特色学习、上下文学习、基于注意力的学习、区域倡议、损失函数正则化、利用辅助工作和时空特色聚合。此外,论文察看到,transformer是在大多数数据集中定位小指标的次要办法之一。然而,思考到之前的工作次要评估了160多篇关注于基于cnn的网络的论文,因而没有对以transformer为核心的办法进行深刻的摸索。意识到该畛域的增长和摸索速度,当初有了一个及时的窗口来深入研究针对小指标检测的以后transformer模型。 在本文中,作者的指标是全面理解影响transformer在利用于小指标检测时令人印象粗浅的性能的因素,以及它们与用于通用指标检测的策略的区别。为了奠定根底,论文首先突出了驰名的基于transformer的SOD指标检测器,并将它们的停顿与现有的基于cnn的办法并列起来。 自2017年以来,该畛域曾经发表了大量的综述文章。在之前的考察中介绍了这些评论的宽泛探讨和清单。最近的另一篇综述文章也次要关注基于cnn的技术。以后综述的叙述与之前的叙述不同。本文中的重点特地放大到transformer——一个之前没有摸索过的方面——将它们定位为图像和视频SOD的主导网络架构。这须要针对这种翻新体系结构量身定制的独特分类法,无意识地避开基于cnn的办法。鉴于这个主题的新颖性和复杂性,论文的评论次要优先思考2022年后提出的作品。此外,论文还说明了在更宽泛的利用范畴中用于定位和检测小指标的新数据集。 本考察中的钻研次要提出了针对小指标定位和分类的办法,或间接解决了SOD的挑战。推动咱们进行剖析的是这些论文中为小指标指定的检测后果。然而,晚期的钻研留神了SOD后果,但在其开发方法中体现出不佳或疏忽了SOD特定参数,没有思考纳入本综述。在本考察中,咱们假如读者曾经相熟了通用的指标检测技术、它们的架构和相干的性能度量。 本文的构造如下:在第3节中,论文提出了一个基于transformer的SOD技术的分类,并对每个类别进行了全面的深入研究。第4节展现了用于SOD的不同数据集,并跨一系列应用程序对它们进行了评估。在第5节中,论文剖析并将这些后果与之前来自CNN网络的后果进行了比照。本文在第6节中总结了一些论断。 三、用于小指标检测的transformer 在本节中,论文将探讨基于transformer的SOD网络。小指标检测器的分类法如图4所示。论文表明,现有的基于新型transformer的检测器能够通过以下一个或几个角度进行剖析:指标示意、对高分辨率或多尺度特色图的疾速注意力、齐全基于transformer的检测、架构和块批改、辅助技术、改良的特色示意和时空信息。在上面的大节中,将别离具体探讨这些类别。 3.1 Object Representation在指标检测技术中曾经采纳了各种指标示意技术。感兴趣的指标能够用矩形框、中心点和点集、概率指标和关键点来示意。在须要正文格局和小指标示意方面,每种指标示意技术都有本人的优缺点。在放弃现有示意技术的所有劣势的同时,寻找最优示意技术的谋求,从RelationNet++开始。这种办法连贯了各种异构的视觉示意,并通过一个称为桥接视觉示意(BVR)的模块联合了它们的劣势。BVR能够无效地运行,但并不毁坏次要示意所采纳的整体推理过程,它利用了要害采样和共享地位嵌入的新技术。更重要的是,BVR依赖于一个留神模块,该模块将一种示意模式指定为“主示意”(或查问),而其余示意则被指定为“辅助”示意(或键)。BVR块如图5所示,它通过将中心点和角点(键)无缝集成到基于锚定(查问)的指标检测办法中,加强了锚定盒的特色示意。 3.2 Fast Attention for High-Resolution or Multi-Scale Feature Maps 以往的钻研表明,放弃高分辨率的特色图是放弃SOD中高性能的必要步骤。与cnn相比,transformer实质上体现出显著更高的复杂度,这是因为它们的复杂度绝对于令牌的数量(例如,像素数量)呈二次减少。这种复杂性来自于跨所有令牌的成对相关性计算的要求。因而,训练工夫和推理工夫都超过了预期,使得检测器不适用于高分辨率图像和视频中的小指标检测。在他们对于可变形的DETR的工作中,Zhu等人解决了第一次在DETR中察看到的这个问题。他们倡议只关注一个参考文献四周的一小部分要害采样点,这大大降低了复杂性。采纳这种策略,通过应用多尺度变形留神模块无效地放弃了空间分辨率。值得注意的是,该办法打消了特色金字塔网络的必要性,从而大大提高了对小指标的检测和辨认。变形留神中多头留神模块的第i个输入为: 其中,i = 1,···,T和pi是查问的参考点,∆phik是K个采样(K<<T=HW)的采样偏移量(2D)。图6阐明了其多头留神模块内的计算过程。可变形的DETR受害于它的编码器和解码器模块,编码器内的复杂度程序为O(HW C2),其中H和W为输出特色图的高度和宽度,C为通道数。与DETR编码器相比,复杂度为O(H2W2C),随着H和W的减少,复杂性呈二次增长。可变形留神在其余各种检测器中施展了突出的作用,例如在T-TRD中。随后,DETR,具备动静编码器和动静解码器,利用从低分辨率到高分辨率示意的特色金字塔,从而实现高效的粗到细的指标检测和更快的收敛。动静编码器能够看作是齐全自我留神的程序合成近似,基于尺度、空间重要性和表征动静调整留神机制。可变形DETR和动静DETR都利用可变形卷积进行特征提取。在一种独特的办法中,O2DETR 证实了自留神模块提供的全局推理实际上对航空图像并不是必须的,在航空图像中,指标通常密集地汇集在同一图像区域。因而,用部分卷积代替留神模块,并集成多尺度特色映射,被证实能够在面向指标检测的环境中进步检测性能。RCDA作者提出了行-列解耦留神(RCDA)的概念,将要害特色的二维留神合成为两种更简略的模式:一维行留神和列留神。在CF-DETR 的状况下,提出了一种FPN的代替办法,即在第5级(E5)用编码器特色替换C5特色,从而改良了指标示意。该翻新被命名为transformer增强型FPN(TEF)模块。在另一项钻研中,Xu等人通过将跳跃连贯操作与Swintransformer集成,开发了一个加权的双向特色金字塔网络(BiFPN)。这种办法无效地保留了与小指标相干的信息。 3.3 Fully Transformer-Based Detectors Transformer的呈现及其在计算机视觉中许多简单工作中的杰出性能,逐步促使钻研人员从基于cnn或混合系统转向齐全基于transformer的视觉零碎。这项工作始于图像识别工作,该工作称为ViT。ViDT扩大了YOLOS模型(第一个齐全基于transformer的检测器),以开发出第一个实用于SOD的高效检测器。在ViDT中,DETR中用于特征提取的ResNet被各种ViT变体所取代,如Swintransformer、ViTDet 和DeiT ,以及重新配置的留神模块(RAM)。RAM可能解决[PATCH]×[PATCH]、[DET]×[PATCH]和[PATCH]×[DET]的留神。这些穿插和自我留神模块是必要的,因为与YOLOS相似,ViDT在输出中附加了[DET]和[PATCH]标记。ViDT只利用一个transformer解码器作为其颈部,以利用在其身材步骤的每个阶段产生的多尺度特色。图7阐明了ViDT的总体构造,并突出了其与DETR和YOLOS的区别。 意识到解码器模块是基于transformer的指标检测低效的次要起源,无解码器全transformer(DFFT)利用两个编码器:尺度聚合编码器(SAE)和工作对齐编码器(TAE),以放弃较高的准确性。SAE将多尺度特色(四个尺度)聚合成一个繁多特色图,而TAE则对繁多特色图进行对齐,用于指标类型、地位分类和回归。采纳面向检测的transformer(DOT)骨干技术进行了具备强语义的多尺度特征提取。 在基于稠密roi的可变形DETR(SRDD)中,作者提出了一种带有评分零碎的轻量级transformer,以最终去除编码器中的冗余令牌。这是通过在端到端学习计划中应用基于roi的检测来实现的。3.4 Architecture and Block Modifications DETR是第一种端到端指标检测办法,它在训练过程中缩短了收敛工夫,在小指标上体现较差。一些钻研工作曾经解决了这些问题,以进步SOD的性能。一个值得注意的奉献来自Sun等人,他从FCOS(一个齐全卷积单级检测器)和faster RCNN中取得灵感,提出了两种仅编码器的DETR变体,称为TSP-FCOS和TSP-RCNN。这是通过打消解码器中的穿插留神模块来实现的。他们的钻研结果表明,解码器中的穿插留神和匈牙利损失的不稳定性是DETR前期收敛的次要起因。这一发现导致他们放弃了解码器,并在这些新的变体中引入了一种新的二部匹配技术,即TSP-FCOS和TSP-RCNN。 Peng等人通过联结应用cnn和transformer的办法,提出了一种称为“构形”的混合网络结构。该构造将cnn提供的部分特色示意与不同分辨率的transformer提供的全局特色示意相结合(见图8)。这是通过特色耦合单元(FCUs)实现的,试验后果证实了其与ResNet50、ResNet101、DeiT等模型相比的有效性。 意识到部分感知和随机相关性的重要性,Xu等人在Swintransformer的Swintransformer块中增加了一个部分感知块(LPB)。这种新的骨干,称为部分感知振荡变换(LPSW),显著地改良了地面图像中小指标的检测。DIAG-TR 在编码器中引入了一个全局-部分特色交错(GLFI)模块,以自适应和分层地将部分特色嵌入到全局示意中。这种技术均衡了小指标的尺度差别。此外,可学习的锚盒坐标被增加到transformer解码器中的内容查问中,提供了一个演绎偏差。在最近的一项钻研中,Chen等人提出了混合网络transformer,它通过将卷积嵌入到transformer块中扩大了部分信息的范畴。这一改良加强了对MS COCO数据集的检测后果。在另一项钻研中,作者提出了一种名为NeXtfrorm的新骨干,它联合了CNN和transformer,以加强小指标的部分细节和特色,同时也提供了一个全局的承受域。 在各种办法中,O2DETR 用深度可拆散卷积代替了transformer中的留神机制。这一变动不仅升高了与多尺度特色相干的内存应用和计算成本,而且还潜在地进步了航空照片的检测精度。 Wang等人质疑之前工作中应用的指标查问,提出了锚点DETR,它应用锚点进行指标查问。这些锚点加强了指标查问地位的可解释性。对每个锚点应用多个模式,改良了对一个区域内的多个指标的检测。相比之下,Conditional DETR 强调从解码器内容中衍生出的条件空间查问,从而导致空间留神预测。随后的一个版本,条件DETR v2 ,通过将指标查问从新结构为方框查问的模式,加强了体系结构。此批改波及嵌入一个参考点和针对参考点转换框。在随后的工作中,DABDETR通过应用动静可调的锚定盒,进一步改良了查问设计的思维。这些锚点框既作为参考查问点,又作为锚点尺寸(参见图9)。 在另一项工作 中,作者察看到,尽管DETR中小指标的均匀均匀精度(mAP)不能与最先进的(SOTA)技术竞争,但它在小IoU阈值下的性能惊人地优于其竞争对手。这表明,尽管DETR提供了较强的感知能力,但它须要进行微调,以取得更好的定位精度。作为一种解决方案,提出了粗到精密的检测transformer(CF-DETR),通过解码器层中的自适应尺度交融(ASF)和部分穿插留神(LCA)模块来进行这种细化。在之前的一个钻研中,作者认为,基于transformer的检测器的次优性能能够归因于应用繁多的穿插留神模块进行分类和回归、内容查问的初始化有余以及在自留神模块中不足利用先验常识等因素。为了解决这些问题,他们提出了检测决裂transformer(DESTR)。该模型将穿插注意力分为两个分支,一个用于分类,另一个用于回归。此外,DESTR应用了一个迷你检测器来确保在解码器中适当的内容查问初始化,并加强了自留神模块。另一项钻研引入了FEA-Swin,它利用了Swintransformer框架中的高级前景加强关注,将上下文信息集成到原始的骨干中。这是因为Swintransformer不能充沛解决密集的指标检测,因为短少相邻指标之间的连贯。因而,前景加强突出了须要进一步进行相关性剖析的指标。TOLO 是最近的工作之一,旨在通过一个简略的颈部模块将感应偏差(应用CNN)引入transformer架构。该模块联合了来自不同层的个性,以合并高分辨率和高语义的属性。设计了多个光transformer磁头,用于检测不同尺度下的指标。由Liang等人提出的CBNet,不是批改每个架构中的模块,而是将通过复合连贯连贯的多个雷同的骨干进行分组。 在多源聚合transformer(MATR)中,该transformer的穿插留神模块用于利用来自不同视图的同一指标的其余反对映像。一项钻研中也采纳了相似的办法,其中多视图视觉transformer(MVViT)框架联合了来自多个视图的信息,包含指标视图,以进步当指标在繁多视图中不可见时的检测性能。 其余工作更喜爱保持YOLO架构。例如,SPH-Yolov5 在Yolov5网络的较浅层中减少了一个新的分支,以交融特色,以改良小指标定位。它还首次在Yolov5管道中退出了Swintransformer预测头。 另一项钻研中,作者认为,匈牙利损失的间接一对一的边界盒匹配办法可能并不总是无利的。他们证实了应用单组分配策略和应用NMS(非最大克制)模块能够导致更好的检测后果。与这个观点相同,Group DETR 通过一对一的标签调配实现了K组指标查问,从而对每个高空实在指标进行K个正指标查问,以进步性能。 DKTNet提出了一种双键transformer网络,其中应用了两个键——一个是Q流,另一个是V流。这加强了Q和V之间的一致性,从而改善了学习能力。此外,通过计算通道留神而不是空间留神,并应用一维卷积来减速该过程。 3.5 Auxiliary Techniques 试验结果表明,辅助技术或工作与主工作相结合,能够进步性能。在transformer的背景下,曾经采纳了几种技术,包含: (i)辅助解码/编码损失:这是指为边界框回归和指标分类而设计的前馈网络连接到独自的解码层的办法。因而,将不同尺度上的个体损失组合起来来训练模型,从而取得更好的检测后果。该技术或其变体已用于ViDT ,MDef-DETR,CBNet,SRDD 。(ii)迭代框细化:在这种办法中,每个解码层内的边界框都是依据前一层的预测进行细化的。这种反馈机制逐步提高了检测精度。该技术已用于ViDT 。(iii)自上而下的监督:这种办法利用人类可了解的语义来帮忙检测小的或类不可知的指标的简单工作,例如,MDef-DETR 中的对齐图像文本对,或TGOD 中的文本疏导指标检测器。(iv)预训练:这包含在大规模数据集上进行训练,而后对检测工作进行特定的微调。该技术已被用于CBNet V2-TTA 、FPDETR、T-TRD、SPH-Yolov5、MATR ,并广泛应用于DETR v2组。(v)数据加强:该技术通过利用旋转、翻转、放大、裁剪、翻译、增加噪声等各种加强技术,丰盛了检测数据集。数据加强是一种罕用的解决各种不均衡问题的办法,例如,在深度学习数据集中指标大小的不均衡。数据加强能够被看作是一种间接的办法,以最小化训练集和测试集之间的差距。一些办法在检测工作中应用了加强性能,包含TTRD [43]、SPH-Yolov5 、MATR 、NLFFTNet 、DeoT、HTDet和Sw-YoloX 。(vi)一对多标签调配:DETR中的一对一匹配会导致编码器内较差的甄别特色。因而,在其余办法中,一对多的作业,如Faster-RCNN、RetinaNet和FCOS曾经被用作CO-DETR的辅助头部。(vii)去噪训练:该技术旨在进步DETR中解码器的收敛速度,因为二部匹配而常常面临不稳固的收敛问题。在去噪训练中,解码器将有噪声的高空实在标签和盒子输出解码器。而后训练该模型来重建原始的GT值(在一个辅助损失的疏导下)。像DINO 和DN-DETR 这样的实现曾经证实了该技术在进步解码器的稳定性方面的有效性。 3.6 Improved Feature Representation 只管以后的指标检测器在惯例大小或大型指标的广泛应用中杰出,但某些用例须要专门的个性示意来改良SOD。例如,当波及到检测航空图像中的定向指标时,任何指标旋转都能够大大扭转特色示意,因为在场景中减少的背景噪声或杂波(区域倡议)。为了解决这个问题,Dai等人提出了AO2-DETR,这是一种设计为对任意指标旋转具备鲁棒性的办法。这是通过三个要害组件来实现的: (i)定向候选的生成,(ii)定向候选的改良模块,它提取旋转不变特色,以及(iii)旋转感知集匹配损失。这些模块有助于对消指标的任何旋转的影响。在一种相干的办法中,DETR++应用了多个双向特色金字塔层(BiFPN),它们以自底而上的形式利用于来自C3、C4和C5的特色图。而后,只抉择一个代表所有尺度特色的尺度,输出DETR框架进行检测。对于一些特定的应用程序,如工厂平安监测,其中感兴趣的指标通常与人类工人相干,利用这些上下文信息能够极大地改善特色示意。PointDet++ 利用了这一点,联合了人体姿势预计技术,集成了部分和全局特色来进步SOD性能。影响特色品质的另一个关键因素是骨干网络及其提取语义和高分辨率特色的能力。GhostNet提供了一个精简和更高效的网络,为transformer提供高质量、多尺度的性能。他们在这个网络中的Ghost模块局部生成输入特色图,其余部分应用简略的线性操作来复原。这是缓解骨干网络复杂性的关键步骤。在医学图像剖析的背景下,MStransformer应用自监督学习办法对输出图像执行随机掩模,这有助于重建更丰盛的特色,较不敏感的噪声。与分层transformer相结合,这种办法优于具备各种骨干的DETR框架。小指标偏好DETR(SOFDETR),特地反对通过在输出到DETR-transformer之前合并来自第3层和第4层的卷积特色来检测小指标。NLFFTNet通过引入非部分特色交融transformer卷积网络,捕捉不同特色层之间的长距离语义关系,解决了以后交融技术中只思考部分交互的局限性。DeoT 将一个仅限编码器的transformer与一个新的特色金字塔交融模块合并。通过在通道细化模块(CRM)和空间细化模块(SRM)中应用通道和空间注意力,加强了这种交融,从而可能提取出更丰盛的特色。HTDet 的作者提出了一种细粒度的FPN来累积交融低级和高级特色,以更好地进行指标检测。同时,在MDCT 中,作者提出了一个多核扩大卷积(MDC)模块,以同时利用小指标的本体和相邻空间特色来进步小指标相干特征提取的性能。该模块利用深度可拆散卷积来升高计算成本。最初,RTD-Net的一个特色交融模块配对了一个轻量级的骨干,通过拓宽承受域来加强小指标的视觉特色。RTD-Net中的混合留神模块,通过合并小指标四周的上下文信息,使零碎可能检测局部被遮挡的指标。 3.7 Spatio-Temporal Information 在本节中,咱们的重点齐全是基于视频的指标检测器,旨在辨认小指标。尽管许多这些钻研曾经在ImageNet VID数据集上进行了测试,但该数据集最后并不是用于小指标检测的。尽管如此,也有一些工作报告了他们对ImageNet VID数据集的小指标的后果。跟踪和检测视频中的小指标的主题也曾经利用transformer体系结构进行了摸索。尽管基于图像的SOD技术能够利用于视频,但它们通常不利用有价值的工夫信息,这对于辨认芜杂或遮挡帧中的小指标特地有用。transformer在个别指标检测/跟踪中的利用始于跟踪transformer和TransT。这些模型应用了帧到帧(设置前一帧作为参考)设置预测和模板到帧(设置一个模板帧作为参考)检测。Liu等人是第一批应用transformer专门用于基于视频的小指标检测和跟踪的人之一。他们的外围概念是更新模板框架,以捕获由小指标的存在引起的任何小的变动,并在模板框架和搜寻框架之间提供一个全局的留神驱动的关系。 通过引入端到端指标检测器TransVOD,基于transformer的指标检测取得了正式的辨认。该模型将空间和工夫transformer利用于一系列视频帧,从而辨认和连贯到这些帧中的指标。TransVOD曾经产生了几个变体,每个变体都有独特的个性,包含实时检测性能。PTSE采纳渐进策略,关注工夫信息和指标帧间的空间转换。它采纳了多尺度的特征提取来实现这一指标。与其余模型不同,PT-SEFrorter间接从相邻帧而不是整个数据集回归指标查问,提供了一种更本地化的办法。Sparse VOD 提出了一种端到端可训练的视频指标检测器,它联合了工夫信息来提出区域倡议。相比之下,DAFA 强调了视频中全局特色的重要性,而不是部分工夫特色。DEFA指出了FIFO记忆构造的低效,并提出了一种采纳指标级记忆代替帧级记忆的多样性感知记忆作为留神模块。VSTAM 在一一元素的根底上进步了特色品质,而后在将这些加强的特色用于指标候选区域检测之前执行稠密聚合。该模型还联合了内部记忆,以利用长期的上下文信息。在FAQ工作中,提出了一种在解码器模块中应用查问特色聚合的新型视频指标检测器。这与专一于编码器中的个性聚合的办法或对不同帧执行后处理的办法不同。钻研表明,该技术的检测性能优于SOTA办法。 ...

February 21, 2024 · 1 min · jiezi

关于transform:解读-EventBridge-Transform数据转换和处理的灵活能力

阿里云 EventBridge 提供了弱小而灵便的事件总线服务,它能够连贯应用程序、阿里云云服务和阿里云 Serverless 服务来疾速构建 EDA(Event-driven Architectures)事件驱动架构,驱动利用与利用,利用与云的连贯。除此之外,它还能够作为流式的数据管道,在不同的数据仓库和数据处理或分析程序之间疾速构建 ETL 零碎。 本文将从以下几个方面开展对阿里云 EventBridge Transform 能力的介绍: 1)首先介绍 ETL 基本概念; 2)接着介绍 T(Transform)的能力; 3)最初探讨 EventBridge Transform 能力及落地场景。 1.什么是 ETL?ETL 示意的是数据提取(Extract)、转换(Transform)和加载(Load)的过程,是数据集成的外围工作。三个步骤的次要作用如下: 1.1 提取从数据源中提取数据,数据源能够是各种数据存储系统,比方音讯队列、数据库等。 1.2 转换对提取的数据进行转换操作,比方数据富化、数据荡涤、数据聚合、数据拆分、格局转换等。 1.3 加载将通过转换后的数据加载到指标服务中,比方数据仓库、数据湖、BI 零碎等。ETL 利用宽泛,它能够帮忙企业治理和利用数据,实现数据驱动的决策和业务转型。 2.T(Transform)的能力2.1 Transform 利用场景ETL 中的 T(Transform)能够对提取的数据进行转换操作,它具体的应用场景如下: 2.1.1 数据富化调用内部服务获取额定信息丰盛原始数据,进步数据的残缺度和可应用性。 2.1.2 数据荡涤对原始数据进行荡涤或验证,去除反复、缺失或者不精确的数据,确保数据的品质和准确性,或者对数据中的信息进行脱敏,确保 数据的安全性。 2.1.3 数据聚合将多条原始数据进行合并,造成一个对立的数据视图,便于后续的疾速剖析和查问。 2.1.4 数据拆分将单条原始数据依据业务需要拆分为多条数据。 2.1.5 数据格式转换将上游数据转换为指标服务可承受的格局,比方将 Base64、Avro、PB 等格局的原始数据对立转换为 json 格局。 通过 Transform,能够将原始数据转化为一致性、准确性和安全性兼具的高质量数据,为后续的数据分析等操作提供牢靠的根底。 2.2 业界 Transform 架构概述目前业界的 Transform 能力,常见的做法有以下几类: 2.2.1 内置开箱即用的简略且轻量的 Transform 能力数据荡涤:去除数据中的敏感字段、解决乐音数据等。 数据格式转换:将数据中的指定字段转换为特定格局。 2.2.2 内置 Custom Transform 能力用户可自定义 Transform 的逻辑。这种常见的做法是:用户依据 Custom Transform 的接口标准,实现接口并将实现的代码打成 jar 包,之后在零碎导入该 jar 包即可应用本人编写的 Transform 逻辑。 ...

February 19, 2024 · 2 min · jiezi

TransformCSS动态属性的开始

1、基本概念基本概念:transform 属性向元素应用 2D 或 3D 转换;该属性允许我们对元素进行旋转、缩放、移动或倾斜。 这两点是Transform的概念和应用场景,重点在于2D和3D的转换,那么呢?2D和3D的转换是有一定的数学基础的,为什么这么说呢?我们需要了解两个概念 第一个:透视投影 从某一点发射出去的光线,是互不平行的,然后就会有一个近大远小的效果。比如:家里的灯泡,我们把一个东西离得灯泡越近,那么它的影子就越大,离得越远,影子就越小。 与之对应的:正交投影 正交投影的投影线垂直于投影平面,里面的光线是互相平行的;比如生活中的太阳发出的光都是平行光。 CSS的坐标系统:它的坐标系是一个左手坐标系,绿色的是x轴的方向也就是屏幕的方向,向右正方向;红色的是y轴,向下是正方向;蓝色是z轴,屏幕向外是正方向。(如下图所示) CSS变换都是基于左手坐标系和透视投影。 常用属性主要有:Transform-origin(基准点),基于哪一个点来做变换,Transform-style(元素呈现方式2D还是3D),Rotate(旋转-度数),Scale(缩放-大小),Skew(倾斜-左右),Translate(移动-x/y轴),Perspective(透视)。 2、浏览器的兼容完全支持Transform第一个浏览器版本 完全支持Transform-origin第一个浏览器版本 完全支持Transform-style第一个浏览器版本 3、Rotate(旋转,分为2D旋转和3D旋转)rotate(angle),2D旋转 transform: rotate(45deg);rotateX(angle),沿X轴3D旋转 transform: rotate(45deg);rotateY(angle) , 沿 Y 轴3D旋转 transform: rotate(45deg);rotateZ(angle) , 沿 Z 轴3D旋转 transform: rotate(45deg);rotate3d(x, y, z, angle) , 3D旋转;接收四个参数,x y z 介于0-1之间,确定三维空间唯一坐标点,angle围绕原点与x y z 坐标点连线的旋转角度。元素围绕着xyz在空间中确定的唯一坐标点和原点之间的连线旋转指定的角度,这就是rotate3D。 transform: rotate3d(1,1,1,45deg);4、Scale(缩放,同样分为2D缩放和3D缩放)scale(x[, y]) ,2D 缩放 transform: scale(2);scaleX(x) , 沿 X 轴缩放 transform: scaleX(2);scaleY(y) , 沿 Y 轴缩放 ...

June 24, 2019 · 1 min · jiezi

简单几步,用纯CSS3实现3D翻转效果!

作为前端开发人员的必修课,CSS3能带我们完成许多基本动效,本期我们将用CSS3实现hover翻转效果~第一步非常简单,我们简单画1个演示方块,为其添加transition和transform属性:// 本示例均使用Sass语法.block { width: 200px; height: 200px; background: brown; cursor: pointer; transition: 0.8s; &:hover { transform: rotateY(180deg); }}我们看一看这时候的效果:这里需要注意的是:transition属性要写在.block上而不是hover上,如果只在hover上写transition,则鼠标移出时并没有transition的过渡效果,如果我们只将transition写在hover上:第二步比较关键:我们不难发现始终在1个平面上翻转,不够有立体感,因此我们需要稍加改变思路——用2层div嵌套// html部分<div class=“block”> <div class=“block-in”></div></div>// CSS部分.block { width: 200px; height: 200px; cursor: pointer; &-in { background: brown; height: 100%; transition: 0.8s; } &:hover .block-in { transform: rotateY(180deg); }}此时效果没变,如下:这个时候关键的1步来了:我们需要给外层添加perspective和transform-style属性,为整个动画增添3D变形效果:.block { width: 200px; height: 200px; cursor: pointer; /* 3D变形 */ transform-style: preserve-3d; -webkit-perspective: 1000; -moz-perspective: 1000; -ms-perspective: 1000; perspective: 1000; &-in { background: brown; height: 100%; transition: 0.8s; } &:hover .block-in { transform: rotateY(180deg); }}最终实现效果如下:最终我们总结一下思路:1.建立内外2层div,鼠标 hover 到外层时,内层div添加翻转 transform: rotateY(180deg)2.注意将 transition 属性添加到需要翻转的div上,而不是 hover 时3.外层div添加 perspective 和 transform-style 属性,最终实现3D翻转效果 ...

January 17, 2019 · 1 min · jiezi

3D文本悬停改变效果

html<h1 class=“hover-text-3d” data-text=“w3cbest.com”>W3CBEST.COM</h1>css.hover-text-3d { font-size: 7em;}.hover-text-3d { position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); -o-transform: translate(-50%, -50%); transform: translate(-50%, -50%); -webkit-text-fill-color: #fff; text-fill-color: #fff;}.hover-text-3d:before { position: absolute; overflow: hidden; width: 0; content: attr(data-text); -webkit-transition: 2s; -o-transition: 2s; transition: 2s; -webkit-text-fill-color: #aaf0d1; text-fill-color: #aaf0d1; -webkit-text-stroke-width: 2px; text-stroke-width: 2px; -webkit-text-stroke-color: #aaf0d1; text-stroke-color: #aaf0d1; -webkit-filter: drop-shadow(5px 5px 5px rgba(0, 0, 0, .8)); -o-filter: drop-shadow(5px 5px 5px rgba(0, 0, 0, .8)); filter: drop-shadow(5px 5px 5px rgba(0, 0, 0, .8));}.hover-text-3d:hover:before { width: 100%;}查看效果 ...

January 3, 2019 · 1 min · jiezi

CSS3 入门详解(一)

前言如同人类的的进化一样,CSS3是CSS2的“进化”版本,在CSS2基础上,增强或新增了许多特性,弥补了CSS2的众多不足之处,使得Web开发变得更为高效和便捷。1.选择器CSS3新增了许多灵活查找元素的方法,极大的提高了查找元素的效率和精准度。CSS3选择器与jQuery中所提供的绝大部分选择器兼容。1.1 属性选择器属性选择器就是通过属性来选择元素。选择器含义[attr]存在attr属性即可[attr=val]属性值完全等于val[attr*=val]属性值里包含val字符并且在“任意”位置[attr^=val]属性值里包含val字符并且在“开始”位置[attr$=val]属性值里包含val字符并且在“结束”位置1、[attr]<style> /* 所有拥有class属性的标签,添加color样式 / [class]{ color: #333; }</style>2、[attr=val]<style> / 所有拥有class属性全等于“one”的标签,添加color样式 / [class = “one”]{ color: #333; }</style>3、[attr=val]<style> /* class属性的值里面包含“one”的标签,添加color样式 / [attr=“one”]{ color: #333; }</style>4、[attr^=val]<style> /* class属性的值以“one”开始的标签,添加color样式 / [attr ^= “one”]{ color: #333; }</style>5、[attr$=val]<style> / class属性的值以“one”结束的标签,添加color样式 / [attr $= “one”]{ color: #333; }</style>1.2 伪类选择器除了以前介绍的的:link、:active、:visited、:hover,CSS3又新增了其它的伪类选择器。1、结构(位置)伪类选择器含义:first-child其父元素的第1个子元素:last-child其父元素的最后1个子元素:nth-child(n)其父元素的第n个子元素:nth-last-child(n)其父元素的第n个子元素(倒着数)2、空伪类:empty选中没有任何子节点的元素<style> div:empty { / 没有子元素的div元素 / width: 100px; height: 100px; background-color: pink; }</style><!– css 样式不起作用 –><div class=“one”>阿斯蒂芬</div> <!– css样式不起作用 –><div> <p></p></div><!– css样式生效 –><div></div>3、目标伪类:target结合锚点进行使用,处于当前锚点的元素会被选中;<style type=“text/css”> / 使用锚链接指向当前标签的时候 / .one:target { background-color: pink; font-size: 30px; }</style><a href="#hh">找笑脸去</a><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p id=“hh” class=“one”>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p><p>阿斯顿发撒旦法撒打发放大法的撒双方都</p>4、排除伪类:not(selector)除selector(任意选择器)外的元素会被选中;<style> / 除了类名是“.not”的div元素 / div:not(.one) { width: 100px; height: 100px; background-color: pink; }</style><!– css样式不生效 –><div class=“one”></div><!– css样式生效 –><p></p><!– css样式生效 –><div></div>1.3 伪元素选择器1、::first-letter文本的第一个单词或字(如中文、日文、韩文等)2、::first-line 文本第一行;3、::selection 可改变选中文本的样式;4、::before和::after示例代码:伪元素实现横竖分割线<style type=“text/css”> * { margin: 0; padding: 0; list-style: none; } .box { width: 300px; height: 200px; background-color: pink; margin: 50px auto; } .box li { width: 100px; height: 100px; float: left; background-color: #555; position: relative; overflow: hidden; } li:before { content: “”; display: block; width: 90px; height: 1px; background-color: #ccc; position: absolute; top: 97px; left: 5px; } li:after { content: “”; display: block; width: 1px; height: 90px; background-color: #ccc; position: absolute; left: 0px; top: 4px; } li:nth-child(1):after,li:nth-child(4):after { display: none; } li:nth-last-child(-n+3):before { display: none; }</style><div class=“box”> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul></div>效果图::after、:before在旧版本里是伪元素,CSS3的规范里“:”用来表示伪类,“::”用来表示伪元素,但是在高版本浏览器下:after、:before会被自动识别为::after、::before,这样做的目的是用来做兼容处理。2. 颜色新增了RGBA、HSLA模式,其中的A表示透明度,即可以设置颜色值的透明度,相较opacity,它们不具有继承性,即不会影响子元素的透明度。2.1 RGBARed、Green、Blue、Alpha即RGBA,R、G、B取值范围0255。<style> #box{ width:100px; height:100px; background: rgba(200,200,200,.5); }</style><div id=“box”></div>2.2 HSLAH 色调 取值范围0360,0/360表示红色、120表示绿色、240表示蓝色S 饱和度 取值范围0%100%L 亮度 取值范围0%100%A 透明度 取值范围01<style> #box{ width:100px; height:100px; background: hsla(200,50%,50%,.5); }</style><div id=“box”></div>2.3 关于 CSS 的透明度Alpha和opacity的区别主要就是,opacity具有继承性,父盒子设置该属性,下面所有的子元素都会继承该属性。transparent不可调节透明度,始终完全透明。3. 文本阴影text-shadow,可分别设置偏移量、模糊度、颜色(可设透明度)。如:text-shadow: 2px 2px 2px #CCC;1、水平偏移量 正值向右 负值向左;2、垂直偏移量 正值向下 负值向上;3、模糊度是不能为负值;4、阴影颜色。示例代码:文字浮雕<style> html,body { margin: 0; padding: 0; width: 100%; height: 100%; background-color: #999; font-size: 50px; text-align: center; line-height: 260px; color: #999; } .one { text-shadow: -1px -1px 1px #fff,1px 1px 1px #000; } .two { text-shadow: -1px -1px 1px #000,1px 1px 1px #fff; }</style><div class=“one”>我是凸起文字</div><div class=“two”>我是凹下去的文字</div>效果图:4. 盒模型CSS3中可以通过box-sizing来指定盒模型,即可指定为content-box、border-box,这样我们计算盒子大小的方式就发生了改变。可以分成两种情况:1、box-sizing: border-box盒子大小为width2、box-sizing: content-box盒子大小为width + padding + border注:上面的标注的width指的是CSS属性里设置的width: length,content的值是会自动调整的。示例代码:<style type=“text/css”> .box { width: 316px; height: 170px; float: left; margin-left: 20px; box-sizing: border-box; } .box img { width: 100%; height: 100%; } .box:hover { border: 10px solid #00eeff; }</style><div class=“box”> <img src=“1.jpg” alt=""></div><div class=“box”> <img src=“1.jpg” alt=""></div>效果图:可以看出通过设置盒子模型后,虽然.box设置了边框,但是整个box的盒子大小没有改变。5. 边框边框中的边框圆角、边框阴影属性,应用十分广泛,兼容性也相对较好,具有符合渐进增强原则的特征。5.1 边框圆角通过border-radius属性,设置边框圆角,圆角处理时,脑中要形成圆、圆心、横轴、纵轴的概念,正圆是椭圆的一种特殊情况。为了方便表述,我们将四个角标记成1、2、3、4,如2代表右上角,CSS里提供了border-radius来设置这些角横纵轴半径值。分别设置横纵轴半径,以“/”进行分隔,遵循“1,2,3,4”规则,“/”前面的14个用来设置横轴半径(分别对应横轴1、2、3、4位置),“/”后面1~4个参数用来设置纵轴半径(分别对应纵轴1、2、3、4位置 )。<style type=“text/css”> .box { margin: 50px auto; width: 300px; height: 500px; border: 1px solid #ccc; border-radius: 10px 20px 50px 70px / 10px 20px 50px 70px; }</style><div class=“box”></div>效果图:一般情况下,我们用不到这么复杂的,除非特殊需求的时候。支持简写模式,具体如下:1、border-radius: 10px;表示四个角的横纵轴半径都为10px;2、border-radius: 10px 5px;表示1和3角横纵轴半径都为10px,2和4角横纵轴半径为5px;3、border-radius: 10px 5px 8px;表示1角模纵轴半径都为10px,2和4角横纵轴半径都为8px,3角的横纵轴半径都为8px;4、border-radius: 10px 8px 6px 4px;表示1角横纵轴半径都为10px,表示2角横纵轴半径都为8px,表示3角横纵轴半径都为6px,表示4角横纵轴半径都为6px;椭圆的画法:<style type=“text/css”> .box { margin: 50px auto; width: 300px; height: 500px; border: 1px solid #ccc; / 当盒子长宽不一致时,圆角属性 分别设置宽度的一半,以及长度的一半,即是椭圆 / / 或者直接 border-radius:50%; / border-radius: 150px 250px; }</style><div class=“box”></div>如果不想计算,直接设百分比:“50%”。正圆的画法:<style type=“text/css”> .box { margin: 50px auto; width: 200px; height: 200px; border: 1px solid #ccc; / 当盒子长宽相等时,圆角属性分别设置宽度的一半,以及长度的一半,即是正圆 / / 或者直接 border-radius:50%; / border-radius: 100px; }</style><div class=“box”></div>示例代码:边框圆角合集<style> * { margin: 0; padding: 0; list-style: none; background-color: wheat; overflow: hidden; } .box { width: 980px; height: 400px; background-color: #fff; margin: 50px auto; } .box li { float: left; width: 193px; height: 193px; background-color: #fff; margin:5px; box-shadow: 2px 3px 5px #aaa; } li:first-child:after { content: “”; height: 130px; width: 130px; margin: 30px auto; display: block; border: 1px solid orangered; border-radius: 50%; } li:nth-child(2):after { content: “”; display: block; height: 130px; width: 130px; border: 1px solid orangered; margin: 30px auto; border-radius: 65px 65px 0px 0px; } li:nth-child(3):after { content: “”; display: block; width: 130px; height: 65px; border: 1px solid orangered; margin: 50px auto; border-radius: 65px 65px 0px 0px; } li:nth-child(4):after { content: “”; display: block; width: 130px; height: 130px; border: 1px solid orangered; margin: 20px auto; border-radius: 65px 0px 0px 0px; } li:nth-child(5):after { content: “”; width: 130px; height: 65px; display: block; border: 1px solid orangered; border-radius: 50%; margin: 50px auto; } li:nth-child(6):after{ content: “”; height: 130px; width: 65px; display: block; border: 1px solid orangered; border-radius: 50%; margin: 20px auto; } li:nth-child(7):after { content: “”; height: 130px; width: 130px; display: block; border: 1px solid orangered; margin: 20px auto; border-radius: 135px 0px 0px 0px; } li:nth-child(8):after { content: “”; width: 135px; height: 30px; display: block; margin: 30px auto; border: 1px solid orangered; border-radius: 65px 65px 0px 0px / 30px 30px 0px 0px; }</style><div class=“box”> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul></div>效果图:5.2 边框阴影box-shadow,与文字阴影类似,可分别设置盒子阴影偏移量、模糊度、颜色(可设透明度)。如:box-shadow: 5px 5px 5px #CCC1、水平偏移量 正值向右 负值向左;2、垂直偏移量 正值向下 负值向上;3、模糊度是不能为负值;4、inset可以设置内阴影;注:设置边框阴影不会改变盒子的大小,即不会影响其兄弟元素的布局。可以设置多重边框阴影,实现更好的效果,增强立体感,符合渐进增强,实际开发中可以大胆使用。示例代码:<style> .box { width: 200px; height: 200px; margin: 50px auto; border: 1px dashed #000; box-shadow: 2px 3px 4px rgba(0, 247, 255, 0.452),inset 5px 6px 7px rgba(255, 0, 140, 0.562); }</style><div class=“box”></div>效果图:我们通过上图可以看到,虚线是盒子的位置,粉色阴影是inset属性设置的,所以是内阴影,浅蓝色是直接设置的外阴影,效果一目了然。6. 背景背景在CSS3中也得到很大程度的增强,比如背景图片尺寸、背景裁切区域、背景定位参照点、多重背景等。6.1 background-size通过background-size设置背景图片的尺寸,就像我们设置img的尺寸一样,在移动Web开发中做屏幕适配应用非常广泛。其参数设置如下:可以设置长度单位(px)或百分比(设置百分比时,参照盒子的宽高)设置为cover时,会自动调整缩放比例,保证图片始终填充满背景区域,如有溢出部分则会被隐藏。设置为contain会自动调整缩放比例,保证图片始终完整显示在背景区域。6.2 background-origin通过background-origin可以设置背景图片定位(background-position)的参照原点。其参数设置如下:border-box以边框做为参考原点;padding-box以内边距做为参考原点;content-box以内容区做为参考点;示例代码:<style type=“text/css”> .box1,.box2,.box3 { width: 200px; height: 200px; display: inline-block; margin: 50px 30px; border: 10px dashed aquamarine; padding: 10px; background-image: url(bg.jpg); background-repeat: no-repeat; } .box1{ background-origin: padding-box; } .box2{ background-origin: content-box; } .box3{ background-origin: border-box; }</style><div class=“box1”></div><div class=“box2”></div><div class=“box3”></div>效果图:6.3 background-clip通过background-clip,可以设置对背景区域进行裁切,即改变背景区域的大小。其参数设置如下:border-box裁切边框以内为背景区域;padding-box裁切内边距以内为背景区域;content-box裁切内容区做为背景区域;6.4 多背景以逗号分隔可以设置多背景,可用于自适应布局。在一个盒子里可以设置多个背景图片,通过背景定位的功能将两张图片组装起来。示例代码:<style type=“text/css”> .box { width: 320px; height: 410px; margin: 50px auto; background: url(head.jpg) no-repeat left top, url(foot.jpg) no-repeat left bottom; background-size: contain; background-color: #ccc; }</style><div class=“box”></div>效果图:从效果图中我们可以看到,在盒子里面设置了两张背景图,分别是上面一部分,下面一部分。这里故意给盒子高度拉长了一点,并且设置了一个灰色的背景,为的就是大家能够清楚的看到上下两部分的背景图。7. 渐变渐变是CSS3当中比较丰富多彩的一个特性,通过渐变我们可以实现许多炫丽的效果,有效的减少图片的使用数量,并且具有很强的适应性和可扩展性。7.1 线性渐变linear-gradient线性渐变指沿着某条直线朝一个方向产生渐变效果。1、必要的元素:借助Photoshop总结得出线性渐变的必要元素a、方向b、起始色c、终止色d、渐变距离2、关于方向通过具体的方位词指定to leftto rightto topto bottom通过角度改变渐变的方向0°,从下往上渐变90°,从左向右渐变示例代码:<style type=“text/css”> .box { width: 400px; height: 150px; margin: 100px auto; / 线性渐变 / background-image: linear-gradient( /渐变的方向/ 45deg, /渐变开始的颜色/ #88f5ea, /渐变结束的颜色/ #d36be7 ); }</style><div class=“box”></div>效果图:3、渐变范围如果不设置范围,默认渐变的范围是父盒子的宽度,如果通过background-size设置宽度的话,渐变范围即为设置的宽度。<style> .box { width: 500px; height: 100px; margin: 100px auto; background-image: linear-gradient( 135deg, yellow 20%, black 20%, black 40%, yellow 40%, yellow 60%, black 60%, black 80%, yellow 80%, yellow ); background-size: 66px 100px; }</style><div class=“box”></div>效果图:7.2 径向渐变radial-gradient径向渐变指从一个中心点开始沿着四周产生渐变效果。1、必要的元素:a、辐射范围即圆半径b、中心点 即圆的中心c、渐变起始色d、渐变终止色e、渐变范围2、关于中心点中心位置参照的是盒子的左上角,例如:<style> #div{ width:200px; height:200px; background: radial-gradient( / 100px是渐变辐射的范围 0 0 指的是圆心在盒子的左上角 / 100px at 0 0, /渐变起始色/ orange, /渐变终止色/ #ff4500 ) }</style><div id=“box”></div>示例代码:镜像渐变画个球<style type=“text/css”> * { margin: 0; padding: 0; } html,body { width: 100%; height: 100%; background-color: #ccc; } .box { width: 400px; height: 400px; background-color: #fff; margin: 50px auto; border-radius: 50%; background-image: radial-gradient( 300px at 100px 100px, rgba(0,0,0,.1), rgba(0,0,0,.8) ); }</style><div class=“box”></div>效果图:8. 过渡过渡是CSS3中具有颠覆性的特征之一,可以实现元素不同状态间的平滑过渡(补间动画),经常用来制作动画效果。8.1 帧动画通过一帧一帧的画面按照固定顺序和速度播放,如电影胶片。示例代码:<!– baidu.png这个背景图由64张图片横向组成,我们通过动态改变图片的位置,实现动画效果–><style> body { margin: 0; padding: 0; background-color: #F7F7F7; } .logo { width: 270px; height: 129px; margin: 100px auto; background-image: url(./baidu.png); background-position: 0 0; }</style><div class=“logo”></div><script> var logo = document.querySelector(’.logo’); var offset = -270; var n = 0; setInterval(function () { n++; logo.style.backgroundPosition = offset * n + ‘px 0px’; if(n >= 64) n = 0; },100);</script>效果图:这里不做详细了解,主要是为了区分与补间动画的区别。8.2 补间动画自动完成从起始状态到终止状态的的过渡。语法:transition当前元素只要有“属性”发生变化时,可以平滑的进行过渡,并不仅仅局限于hover状态。transition-property设置过渡属性/设置哪些属性要参加到动画效果中/transition-property: all;transition-duration设置动画过渡执行时间transition-duration: 2s;transition-timing-function设置过渡速度类型transition-timing-function:linear; / ease| ease-in | ease-out | ease-in-out | linear; /transition-delay设置过渡延时/1s后,过渡动画开始过渡/transition-delay: 1s;连写:/ 属性 执行时间 延时时间 过渡类型*/transition: all 2s 1s linear;示例代码:<style type=“text/css”> .box { width: 250px; height: 250px; background-color: pink; margin: 100px auto; transition: all 2s 1s linear; } .box:hover { width: 200px; height: 200px; border-radius:50%; background-color: rgb(25, 221, 247); }</style><div class=“box”></div>效果图:我们可以看到,触发hover事件的时候延迟1s后开始执行动画。示例代码:过渡的实际应用<style type=“text/css”> html,body { margin: 0; padding: 0; width: 100%; height: 100%; } .box { width: 100%; height: 100%; background-color: #eee; } .l_box { float: left; width: 234px; height: 300px; margin: 100px 50px; cursor: pointer; transition: all 0.5s linear; } .l_box:hover { box-shadow: -2px -2px 20px #777; margin-top: 90px; } .r_box { width: 234px; height: 300px; float: left; margin: 100px 0px; background-color: #fff; text-align: center; position: relative; } .cover { position: absolute; bottom: 0; height: 0px; width: 234px; background-color: orange; transition: all 1s linear; } .r_box:hover .cover { height: 100px; }</style><div class=“box”> <div class=“l_box”> <img src=“img/1.jpg” alt=""> </div> <div class=“r_box”> <img src=“img/2.jpg” alt=""> <div class=“cover”></div> </div></div>效果图:9. 2D转换转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、变形、缩放,甚至支持矩阵方式,配合即将学习的过渡和动画知识,可以取代大量之前只能靠Flash才可以实现的效果。9.1 位移CSS3中,通过translate属性对元素进行位移。移动translate(x, y)可以改变元素的位置,x、y可为负值;a、移动位置相当于自身原来位置b、y轴正方向朝下c、除了可以像素值,也可以是百分比,相对于自身的宽度或高度transform: translate(100px, 30px);示例代码<style type=“text/css”> .line { height: 200px; background-color: pink; } .box { width: 100px; height: 100px; background-color: rgb(30, 230, 245); transition: all 1s linear; } .line:hover .box { /* 位移 / transform: translate(100px, 30px); }</style><div class=“line”> <div class=“box”></div></div>效果图:我们可以看到,鼠标移上去之后,蓝色盒子,分别向左和向下移动了一段距离。9.2 缩放缩放scale(x, y)可以对元素进行水平和垂直方向的缩放,x、y的取值可为小数;/宽和高都放大1倍/transform: scale(1.5);示例代码:<style type=“text/css”> .box { width: 200px; height: 200px; background-color: pink; margin: 50px auto; transition: all 2s linear; } .box:hover { / 缩放 / transform: scale(0.5); }</style><div class=“box”></div>效果图:9.3 旋转旋转rotate(deg)可以对元素进行旋转,正值为顺时针,负值为逆时针;a、当元素旋转以后,坐标轴也跟着发生的转变b、调整顺序可以解决,把旋转放到最后/ 顺时针旋转 90度 /transform: rotate(90deg);示例代码:<style type=“text/css”> .box { width: 200px; height: 200px; background-color: #0df3cd; margin: 100px auto; transition: all 2s linear; } .box:hover { transform: rotate(-90deg); }</style><div class=“box”></div>效果图:旋转原点:默认情况下,旋转是按照元素的中心点旋转的,但是我们可以手动设置元素旋转的中心点。transform-origin: 30px 40px;示例代码:<style type=“text/css”> .box { width: 150px; height: 150px; background-color: cyan; margin: 100px auto; transition: all 1s linear; / 设置旋转原点位置 / / transform-origin: left top; / transform-origin: 30px 40px; } .box:hover { transform: rotate(90deg); }</style><div class=“box”></div>效果图:示例代码:扑克牌<style type=“text/css”> * { margin: 0; padding: 0; } .box { width: 310px; height: 438px; border: 1px solid #ccc; margin: 50px auto; position: relative; } .box img { position: absolute; transform-origin:bottom; transition: all 2s linear; } .box:hover img:nth-child(1) { transform: rotate(10deg); } .box:hover img:nth-child(2) { transform: rotate(20deg); } .box:hover img:nth-child(3) { transform: rotate(30deg); } .box:hover img:nth-child(4) { transform: rotate(40deg); } .box:hover img:nth-child(5) { transform: rotate(50deg); } .box:hover img:nth-child(6) { transform: rotate(60deg); }</style><div class=“box”> <img src=“img/pk1.png” alt=""> <img src=“img/pk1.png” alt=""> <img src=“img/pk1.png” alt=""> <img src=“img/pk1.png” alt=""> <img src=“img/pk1.png” alt=""> <img src=“img/pk1.png” alt=""></div>效果图:9.4 倾斜倾斜skew(deg, deg)可以使元素按一定的角度进行倾斜,可为负值,第二个参数不写默认为0。transform: skew(30deg,30deg);示例代码:<style type=“text/css”> .box { width: 150px; height: 150px; background-color: cyan; margin: 100px auto; transition: all 2s linear; } .box:hover { / 倾斜 / transform: skew(30deg, 30deg); }</style><div class=“box”></div>效果图:9.5 矩阵矩阵matrix()把所有的2D转换组合到一起,需要6个参数。transform-origin可以调整元素转换的原点,但是对于transform: translate(x,y)没有影响。我们可以同时使用多个转换,其格式为:transform: translate() rotate() scale() …等,其顺序会影转换的效果。详细可参见10. 3D 转换10.1 3D 坐标轴用X、Y、Z分别表示空间的3个维度,三条轴互相垂直。如下图:网格状的正方形,可以想象成是我们的电脑桌面2D平面。在 3D 转换中,前面 2D 转换的属性在这都可以使用:位移transform:translate(100px,100px,100px);旋转transform:rotate(30deg,30deg,30deg);缩放transform:scale(2,0.5,0.5);倾斜transform:skew(30deg,30deg,30deg);在3D转换中,一定要加上一个透视属性,才能在电脑2D平面中显示出3D的效果,透视属性请看下章。10.2 透视(perspective)电脑显示屏是一个2D平面,图像之所以具有立体感(3D效果),其实只是一种视觉呈现,通过透视可以实现此目的。perspective通过透视产生的3D效果,只是视觉呈现而已,并不是真正的3d立体的盒子;就是近大远小的效果。透视的概念其实很简单,就是“近大远小”。举个例子:在2D转换的时候,我们知道一个translate属性,他分别可以设置向左向右或者向上向下平移,但是却不能向里面或外面平移。<style> .box{ width: 550px; height: 150px; margin: 100px auto; padding: 6px; border: 1px dashed #ccc; } .box li{ float: left; width: 150px; height: 150px; padding: 0; list-style: none; margin-right: 50px; transition: all 0.5s linear; } .box li:first-child{ background: salmon; } .box li:nth-child(2){ background: deepskyblue; } .box li:last-child{ background: khaki; margin-right: 0px; } / 第一个盒子向X轴的负方向移动100px / .box li:first-child:hover{ transform: translateX(-100px); } / 第二个盒子向Y轴的正方向移动100px / .box li:nth-child(2):hover{ transform: translateY(100px); } / 第三个盒子Z轴的负方向移动100px / .box li:last-child:hover{ transform: translateZ(-100px); }</style><ul class=“box”> <li></li> <li></li> <li></li></ul>效果图:没有加透视属性的时候,因为z轴是垂直电脑平面射出来的,translateZ是看不出效果的。如何设置透视属性?给当前元素的直接父元素添加perspective: 800px;透视属性,注意这个值可以是随意的,但是最佳展现距离是600px~1000px。<style> .box{ width: 550px; height: 150px; margin: 100px auto; padding: 6px; border: 1px dashed #ccc; / 给变换的 li 的直接父元素 ul 添加透视属性 perspective / perspective: 800px; } .box li{ float: left; width: 150px; height: 150px; padding: 0; list-style: none; margin-right: 50px; transition: all 0.5s linear; } .box li:first-child{ background: salmon; } .box li:nth-child(2){ background: deepskyblue; } .box li:last-child{ background: khaki; margin-right: 0px; } / 第一个盒子向X轴的负方向移动100px / .box li:first-child:hover{ transform: translateX(-100px); } / 第二个盒子向Y轴的正方向移动100px / .box li:nth-child(2):hover{ transform: translateY(100px); } / 第三个盒子Z轴的负方向移动100px / .box li:last-child:hover{ transform: translateZ(-100px); }</style><ul class=“box”> <li></li> <li></li> <li></li></ul>效果图:如图所示,在ul加上透视属性后,第三个盒子向着z轴的负方向移动了100px。透视可以将一个2D平面,在转换的过程当中,呈现3D效果。(没有perspective,便“没有”Z轴)并非任何情况下都需要透视效果。10.3 3D呈现(transform-style)什么是3D呈现呢?不要与前面的透视搞混,透视只能使一个物体呈现近大远小的状态,不能呈现出一个立体感的东西,比如我在页面上用六个面组成一个正方形,通过透视你可能只能改变他的远近距离,并不能让他看起来像个立体的盒子,所以这里需要用到另一个属性:transform-style。transform-style: preserve-3d | flatflat:所有子元素在2D平面呈现preserve-3d:保留3D空间必须设置在父元素身上并且父元素有转换(就是有变形)并且子元素也得有转换(变形)才能看得到效果。1、示例代码:正方体<style type=“text/css”> * { margin: 0; padding: 0; } .box { width: 200px; height: 200px; margin: 150px auto; position: relative; / 透视 / / perspective: 1000px; / / 转为立方体 / transform-style: preserve-3d; transform: rotateY(45deg) rotateX(30deg); } .box>div { position: absolute; width: 100%; height: 100%; } .left { background-color: pink; transform: rotateY(-90deg) translateZ(150px); } .right { background-color: green; transform: rotateY(90deg) translateZ(150px); } .top { background-color: orange; transform: rotateX(90deg) translateZ(150px); } .bottom { background-color: blue; transform: rotateX(-90deg) translateZ(150px); } .before { background-color: red; transform: translateZ(150px); } .back { background-color: greenyellow; transform: translateZ(-150px); }</style><div class=“box”> <div class=“left”></div> <div class=“right”></div> <div class=“top”></div> <div class=“bottom”></div> <div class=“before”></div> <div class=“back”></div></div>效果图:2、示例代码:3D 导航<style type=“text/css”> * { margin: 0; padding: 0; list-style: none; } nav { width: 600px; height: 60px; line-height: 60px; margin: 200px auto; } li { height: 60px; width: 150px; float: left; position: relative; transform-style: preserve-3d; transition: all 0.5s ease-in; } span { position: absolute; width: 150px; height: 60px; display: block; color: #fff; text-align: center; } span:first-child{ background-color: #ff287a; transform: rotateX(90deg) translateZ(30px); } span:last-child{ transform: translateZ(30px); background-color: #00bdab; } li:hover { transform: rotateX(-90deg); }</style><nav> <ul> <li> <span>Home</span> <span>主页</span> </li> <li> <span>Menu</span> <span>菜单</span> </li> <li> <span>Admin</span> <span>管理</span> </li> <li> <span>About</span> <span>关于我们</span> </li> </ul></nav>效果图:10.4 3D呈现案例:3D轮播图1、普通版 3D 轮播图实现思路:通过CSS3中transform-style: preserve-3d的概念,将视图设置成3D展示模式;四张图片,分别设置其绕着X轴旋转的角度,分别对应四个立体面;将旋转好的图片沿着Z轴平移盒子宽度的一半;定义一个全局变量num,用来记录按钮点击的次数,当当按动按钮的时候,让ul旋转num90°;示例代码:<style> * { padding: 0; margin: 0; list-style-type: none; } .box { width: 960px; height: 540px; /* border: 5px solid #999; / margin: 150px auto; } .box ul { width: 960px; height: 540px; position: relative; transform-style: preserve-3d; transition: transform .6s; } .box ul li { width: 100%; height: 100%; position: absolute; left: 0; top: 0; } img { width: 100%; height: 100%; } .box ul li:nth-child(1) { transform: rotateX(90deg) translateZ(270px); } .box ul li:nth-child(2) { transform: rotateX(-90deg) translateZ(270px); } .box ul li:nth-child(3) { transform: rotateX(180deg) translateZ(270px); } .box ul li:nth-child(4) { transform: translateZ(270px); } .btn { width: 1080px; margin: 0 auto; position: relative; height: 0px; top: -470px; } .btn button { width: 40px; height: 80px; border-radius: 10px; background: rgba(0, 0, 0, 0.2); border: none; outline: none; font: 900 24px/80px ‘宋体’; color: #fff; } .btn button:frist-child { float: left; } .btn button:last-child { / border-radius: 0 10px 10px 0; / float: right; }</style><div class=“box”> <ul> <li><img src="./imgs/1.jpg" alt=""></li> <li><img src="./imgs/2.jpg" alt=""></li> <li><img src="./imgs/3.jpg" alt=""></li> <li><img src="./imgs/4.jpg" alt=""></li> </ul></div><div class=“btn”> <button>&lt;</button> <button>&gt;</button></div><script type=“text/javascript”> var btn = document.querySelectorAll(‘button’); var box = document.querySelector(’.box’); var _ul = box.querySelector(‘ul’); var num = 0; // btn 获取到的是一个伪数组 btn[1].onclick = function () { num++; _ul.style.transform = ‘rotateX(’ + num * 90 + ‘deg)’ } btn[0].onclick = function () { num–; _ul.style.transform = ‘rotateX(’ + num * 90 + ‘deg)’; }</script>效果图:2、切割版 3D 轮播图实现思路:结构上将之前定义好的ul重复四次;设定延时,整个动画执行时间是0.8s,设定每一个ul延迟执行0.2s,即第一个延时0s,第二个延时0.2s,第三个延时0.4s,第四个延时0.6s;其余步骤同上,着重强调的是,相对于上面的案例,本案例给按钮加了限制,监听第一次所有的ul旋转结束之后,按钮才能再一次被点击。示例代码:<style> * { padding: 0; margin: 0; list-style-type: none; } .box { width: 960px; height: 540px; margin: 150px auto; display: flex; } .box ul { width: 960px; height: 540px; position: relative; transform-style: preserve-3d; transition: transform .8s; } .box ul li { width: 100%; height: 100%; position: absolute; left: 0; top: 0; overflow: hidden; } img { width: 960px; height: 540px; } / 设定延时 / .box ul:nth-child(1) { transition-delay:0s; } .box ul:nth-child(2) { transition-delay:.2s; } .box ul:nth-child(3) { transition-delay:.4s; } .box ul:nth-child(4) { transition-delay:.6s; } / 拼凑图片 / .box ul:nth-child(2) img { margin-left: -240px; } .box ul:nth-child(3) img { margin-left: -480px; } .box ul:nth-child(4) img { margin-left: -720px; } .box ul li:nth-child(1) { transform: rotateX(90deg) translateZ(270px); } .box ul li:nth-child(2) { transform: rotateX(-90deg) translateZ(270px); } .box ul li:nth-child(3) { transform: rotateX(180deg) translateZ(270px); } .box ul li:nth-child(4) { transform: translateZ(270px); } .btn { width: 1080px; margin: 0 auto; position: relative; height: 0px; top: -470px; } .btn button { width: 40px; height: 80px; border-radius: 10px; background: rgba(0, 0, 0, 0.2); border: none; outline: none; font: 900 24px/80px ‘宋体’; color: #fff; } .btn button:frist-child { float: left; } .btn button:last-child { / border-radius: 0 10px 10px 0; */ float: right; }</style><div class=“box”><ul> <li><img src="./imgs/1.jpg" alt=""></li> <li><img src="./imgs/2.jpg" alt=""></li> <li><img src="./imgs/3.jpg" alt=""></li> <li><img src="./imgs/4.jpg" alt=""></li></ul><ul> <li><img src="./imgs/1.jpg" alt=""></li> <li><img src="./imgs/2.jpg" alt=""></li> <li><img src="./imgs/3.jpg" alt=""></li> <li><img src="./imgs/4.jpg" alt=""></li></ul><ul> <li><img src="./imgs/1.jpg" alt=""></li> <li><img src="./imgs/2.jpg" alt=""></li> <li><img src="./imgs/3.jpg" alt=""></li> <li><img src="./imgs/4.jpg" alt=""></li></ul><ul> <li><img src="./imgs/1.jpg" alt=""></li> <li><img src="./imgs/2.jpg" alt=""></li> <li><img src="./imgs/3.jpg" alt=""></li> <li><img src="./imgs/4.jpg" alt=""></li></ul></div><div class=“btn”><button>&lt;</button><button>&gt;</button></div><script type=“text/javascript”> var btn = document.querySelectorAll(‘button’); var box = document.querySelector(’.box’); var _ul = box.querySelectorAll(‘ul’); var num = 0; var flag = true; // btn 获取到的是一个伪数组 btn[1].onclick = function () { if (flag) { flag = false; num++; for (var i = 0; i < _ul.length; i++) { _ul[i].style.transform = ‘rotateX(’ + num * 90 + ‘deg)’; } // 监听最后一个transition事件结束的时候 将flag 置为 true 防止重复点击 _ul[_ul.length - 1].addEventListener(’transitionend’, function () { flag = true; }) } } btn[0].onclick = function () { if (flag) { flag = false; num–; for (var i = 0; i < _ul.length; i++) { _ul[i].style.transform = ‘rotateX(’ + num * 90 + ‘deg)’; } _ul[_ul.length - 1].addEventListener(’transitionend’, function () { flag = true; }) } }</script>效果图:10.5 backface-visibilitybackface-visibility属性定义当元素不面向屏幕时是否可见。如果在旋转元素不希望看到其背面时,该属性很有用。有两个属性:1、visible背面是可见的2、hidden背面是不可见的 ...

November 26, 2018 · 11 min · jiezi

轴动效果插件,类似Github404页面

轴动效果 axial3d3D效果页插件,类似 Github404 页面动画。安装引入 Installnpm install axial3dor<script src=“https://unpkg.com/axial3d"></script>例子 ExampleDemo<html><head> <title>Demo - Axial3d</title></head><body> <script src=“https://unpkg.com/axial3d"></script> <div id=“axial3d”></div> <script> (function () { var options = { selector: ‘#axial3d’, imgs: [ {src: ‘https://bestvist.github.io/axial3d/public/demo1/bg.png’, left: ‘50px’, top: ‘10px’}, {src: ‘https://bestvist.github.io/axial3d/public/demo1/2.png’, left: ‘150px’, top: ‘10px’}, {src: ‘https://bestvist.github.io/axial3d/public/demo1/3.png’, left: ‘50px’, top: ‘300px’}, {src: ‘https://bestvist.github.io/axial3d/public/demo1/4.png’, left: ‘300px’, top: ‘300px’} ] } var effect = new Axial3d(options); })() </script></body></html>属性 Propsoptions属性说明类型可选值默认值selector元素选择器String–imgs图片组Array–transform动画形式Stringtranslate / rotatetranslateswing动画幅度Number-5imgs options属性说明类型可选值默认值src图像路径String–top图片顶部定位String–bottom图片底部定位String–left图片左侧定位String–right图片右侧定位String–static图片是否静态,不随鼠标转动Booleantrue / falsefalse方法 Methods事件名称说明回调参数destory取消事件监听-项目地址 喜欢的欢迎star????????

October 30, 2018 · 1 min · jiezi

css实现波浪线及立方体

最近的项目有做到要画出波浪线效果,这里是利用linear-gradient来实现,也就是画圆,然后利用底色来遮住部分圆;利用css3属性perspective加旋转实现立方体1.css实现波浪线html<div class=“card-list”> <div class=“wave-container”> <div class=“wave”></div> <!– 实现波浪线的div –> <div class=“wave-left-decorate”></div> <div class=“wave-right-decorate”></div> </div></div>css.card-list{ display: flex; padding: 20px; width: 100%;}.wave-container{ position: relative; margin-right: 28px; width: 20%;}.wave{ width: 100%; height: 90px; background: linear-gradient(to right, rgb(85, 181, 255), rgb(207, 224, 232));}/* 波浪线 /.wave-left-decorate{ position: absolute; top: -4px; width: 90px; height: 8px; transform-origin: center left; transform: rotate(90deg); background: radial-gradient(circle, #fff 2px, #fff, transparent 3px, transparent 4px, transparent 4px, transparent); background-size: 8px 8px;}效果图2.实现立方体html文件<div class=“content”> <div class=“leftContent”> <div class=“leftContentItem”> <div class=“itemImg”> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> <img class=“leftContentImg” src=“images/rabbit.jpg” alt=""/> </div> </div> </div></div>css文件.content{ position: relative; display: flex; margin: 0 auto; padding-top: 50px; width: 1200px; height: 380px; background: url(../images/bg2.jpg) no-repeat; background-size: 1200px 100%;}.content .leftContent{ margin-right: 25px; padding-left: 45px; padding-bottom: 30px; box-sizing: border-box;}/ 旋转的图片 /.content .leftContent .leftContentItem{ width: 350px; height: 350px; / 设置景深 / perspective: 1000px; / 设置背景颜色在中间为椭圆形 / /background: radial-gradient(ellipse at center, #430d6d 0%, #000 100%);/}.leftContent .leftContentItem .itemImg{ position: absolute; left: 20%; top: 20%; width: 200px; height: 200px; / 实现3D呈现 */ transform-style: preserve-3d; transform: rotateX(-20deg) rotateY(-20deg); -webkit-animation: 6s imgRotate linear infinite; -o-animation: 6s imgRotate linear infinite; animation: 6s imgRotate linear infinite;}.leftContent .leftContentItem .itemImg { position: absolute; width: 100%; height: 100%; box-shadow: 0 0 25px rgba(0, 128, 0, .4);}.leftContentItem .itemImg .leftContentImg{ position: absolute; width: 100%; height: 100%;}/ 分别对各个面进行旋转、平移操作 */.leftContentItem .itemImg .leftContentImg:nth-child(1){ transform: translateZ(100px);}.leftContentItem .itemImg .leftContentImg:nth-child(2){ transform: rotateX(180deg) translateZ(100px);}.leftContentItem .itemImg .leftContentImg:nth-child(3){ transform: rotateY(-90deg) translateZ(100px);}.leftContentItem .itemImg .leftContentImg:nth-child(4){ transform: rotateY(90deg) translateZ(100px);}.leftContentItem .itemImg .leftContentImg:nth-child(5){ transform: rotateX(90deg) translateZ(100px);}.leftContentItem .itemImg .leftContentImg:nth-child(6){ transform: rotateX(-90deg) translateZ(100px);}@-webkit-keyframes imgRotate { from{ transform: translateZ(-100px) rotateX(0) rotateY(0); } to{ transform: translateZ(-100px) rotateX(360deg) rotateY(360deg); }}效果图主要就是设置景深perspective,然后对每个面旋转、平移正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)往期好文推荐:webpack打包(有面试题)纯css实现瀑布流(multi-column多列及flex布局)画三角形判断ios和Android及PC端 ...

October 12, 2018 · 2 min · jiezi

前端每日实战:127# 视频演示如何用纯 CSS 创作一个圆环旋转错觉动画(实际上没有任何元素在做旋转运动)

效果预览按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。https://codepen.io/comehope/pen/oPWJNj/可交互视频此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。请用 chrome, safari, edge 打开观看。https://scrimba.com/p/pEgDAM/cbvPWHM源代码下载每日前端实战系列的全部源代码请从 github 下载:https://github.com/comehope/front-end-daily-challenges代码解读定义 dom,容器中包含 10 个 <div> 子元素,每个 <div> 子元素内还有一个 <span> 子元素:<figure class=“container”> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div> <div><span></span></div></figure>定义容器尺寸:.container { width: 17em; height: 17em; font-size: 16px;}定义子元素的尺寸,和容器相同:.container { position: relative;}.container div { position: absolute; width: inherit; height: inherit;}在子元素的正中画一个黄色的小方块:.container div { display: flex; align-items: center; justify-content: center;}.container span { position: absolute; width: 1em; height: 1em; background-color: yellow;}增加让小方块左右移动的动画效果,动画时长还会在后面用到,所以定义成变量:.container span { –duration: 2s; animation: move var(–duration) infinite;}@keyframes move { 0%, 100% { left: calc(10% - 0.5em); } 50% { left: calc(90% - 0.5em); }}用贝赛尔曲线调整动画的时间函数,使小方块看起来就像在左右两侧跳来跳去:.container span { animation: move var(–duration) cubic-bezier(0.6, -0.3, 0.7, 0) infinite;}增加小方块变形的动画,使它看起来有下蹲起跳的拟人效果:.container span { animation: move var(–duration) cubic-bezier(0.6, -0.3, 0.7, 0) infinite, morph var(–duration) ease-in-out infinite;}@keyframes morph { 0%, 50%, 100% { transform: scale(0.75, 1); } 25%, 75% { transform: scale(1.5, 0.5); }}至此,完成了 1 个方块的动画。接下来设置多个方块的动画效果。为子元素定义 CSS 下标变量:.container div:nth-child(1) { –n: 1; }.container div:nth-child(2) { –n: 2; }.container div:nth-child(3) { –n: 3; }.container div:nth-child(4) { –n: 4; }.container div:nth-child(5) { –n: 5; }.container div:nth-child(6) { –n: 6; }.container div:nth-child(7) { –n: 7; }.container div:nth-child(8) { –n: 8; }.container div:nth-child(9) { –n: 9; }旋转子元素,使小方块分布均匀地在容器的四周,围合成一个圆形:.container div { transform: rotate(calc(var(–n) * 40deg));}设置动画延时,现在看起来就像是一群小方块贴着一个圆的内边线在旋转了(但实际上没有任何元素在做旋转运动,大脑感觉到的旋转是一种错觉):.container span { animation-delay: calc(var(–duration) / 9 * var(–n) * -1);}最后,为小方块上色:.container span { background-color: hsl(calc(var(–n) * 80deg), 100%, 70%);}大功告成! ...

September 5, 2018 · 1 min · jiezi

前端每日实战:124# 视频演示如何用纯 CSS 创作一只纸鹤(体验三角形造型技巧)

效果预览按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。https://codepen.io/comehope/pen/xagoYb可交互视频此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。请用 chrome, safari, edge 打开观看。https://scrimba.com/p/pEgDAM/cPw8eSg源代码下载每日前端实战系列的全部源代码请从 github 下载:https://github.com/comehope/front-end-daily-challenges代码解读定义 dom,容器中包含 6 个元素,分别代表头、颈、身体侧面、翅、尾、胸:<div class=“cranes”> <span class=“head”></span> <span class=“neck”></span> <span class=“side”></span> <span class=“wing”></span> <span class=“tail”></span> <span class=“belly”></span></div>居中显示:body { margin: 0; height: 100vh; display: flex; align-items: center; justify-content: center; background-color: dodgerblue;}定义容器尺寸:.cranes { width: 52em; height: 50em; font-size: 7px;}设置纸鹤的颜色为白色:.cranes { color: white;}画出头部:.cranes { position: relative;}.head { border-left: 13em solid transparent; border-right: 6em solid transparent; border-bottom: 2em solid; position: absolute; left: 0; top: 21; transform: rotate(-5deg);}把以上创建三角形的代码抽象成一个模板,然后数据都改为变量,类似于调用函数的样子:.cranes span { border-left: calc(var(–left) * 1em) solid transparent; border-right: calc(var(–right) * 1em) solid transparent; border-bottom: calc(var(–bottom) * 1em) solid; position: absolute; transform: rotate(calc(var(–rotation) * 1deg)); left: calc(var(–x) * 1em); top: calc(var(–y) * 1em);}.head { –left: 13; –right: 6; –bottom: 2; –x: 0; –y: 21; –rotation: -5;}设置透明度,以便元素叠加处有折纸效果:.cranes span { filter: opacity(0.6);}接下来就是逐个调用生成三角形的函数创建其他三角形:颈:.neck { –left: 6; –right: 6; –bottom: 12; –x: 14; –y: 19; –rotation: 75;}身体侧面:.side { –left: 1.5; –right: 11.5; –bottom: 20; –x: 18.8; –y: 15.1; –rotation: 20;}翅:.wing { –left: 18.7; –right: 30; –bottom: 8; –x: 6.7; –y: 9.2; –rotation: -41.9;}尾:.tail { –left: 18.6; –right: 7.7; –bottom: 3.9; –x: 19.6; –y: 38.1; –rotation: -126.5;}胸:.belly { –left: 6.2; –right: 1.8; –bottom: 11.5; –x: 17.5; –y: 27.8; –rotation: -99;}至此,纸鹤画完。最后,增加一点交互效果,当鼠标悬停时,由等腰直角三角形变形成鹤:.cranes:hover span { animation: appear 1s ease-in;}@keyframes appear { from { border-left: 3em solid transparent; border-right: 3em solid transparent; border-bottom: 3em solid; position: absolute; transform: rotate(0deg); left: calc((52em - 3em) / 2); top: calc((50em - 3em) / 2); }}大功告成! ...

September 2, 2018 · 2 min · jiezi