首页 > 其他分享 >记录--前端实现翻转图像

记录--前端实现翻转图像

时间:2024-01-19 18:45:32浏览次数:33  
标签:__ -- 前端 flipping width inner images 翻转

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

翻转图像是在视觉上比较两个不同图像的常用方法。单击其中一个将翻转它,并显示另一个图像。

布局

布局结构如下:

<div class="flipping-images">
    <div class="flipping-images__inner">
        <div class="flipping-images__side flipping-images__side--front">
            <!-- The image shown on the front -->
            <img class="flipping-images__img" src="..." />
        </div>

        <div class="flipping-images__side flipping-images__side--back">
            <!-- The image shown on the back -->
            <img class="flipping-images__img" src="..." />
        </div>
    </div>
</div>

它有正面和背面两面,放置在内部容器内。我们希望它们彼此重叠。最好的方法是使用容器 relative 的样式,并绝对定位它们。

.flipping-images__inner {
    /* Take full size of the root element */
    height: 100%;
    width: 100%;

    position: relative;
}

.flipping-images__side {
    /* Take full size of the inner container */
    height: 100%;
    width: 100%;

    /* Absolute position */
    position: absolute;
    top: 0;
    left: 0;
}

最初,正面显示在背面的上部。用户在单击正面之前不会看到背面。这就是 z-index 该属性派上用场的地方。

.flipping-images__side--back {
    z-index: 1;
}

.flipping-images__side--front {
    z-index: 2;
}

图像必须适合其侧面。在不显式设置 width 和 height 属性的情况下,我们可以使用 object-fit 属性将图像完美地放入每一侧:

.flipping-images__img {
    /* Take the full height */
    height: 100%;

    /* But don't exceed the side's width */
    max-width: 100%;

    /* Fit within each side */
    object-fit: cover;
}

内部居中

我们希望在根元素的中心显示内部容器。使用三个 CSS flexbox 属性的组合将使我们能够做到这一点:

.flipping-images {
    /* Center the content */
    align-items: center;
    display: flex;
    justify-content: center;
}

此外,我们还需要设置内容器的宽度。它必须与图像的宽度相同。我们可以处理其中一个图像 load 的事件,然后确定其宽度:

const handleLoad = (e) => {
    const imageEle = e.target;

    // Get the image's width
    const width = imageEle.getBoundingClientRect().width;

    // Assume `innerEle` represents the inner container
    innerEle.style.width = `${width}px`;
};


// Assume `containerEle` represents the root element
containerEle.querySelector('.flipping-images__img').addEventListener('load', handleLoad);

动画

为了获取您在本文开头看到的动画,我们需要在用户单击内部容器时旋转它。我们创建了一个翻转变体,将内部容器在垂直方向上旋转 180 度:

.flipping-images__inner {
    transition: transform 800ms;
}


.flipping-images__inner--flip {
    transform: rotateY(180deg);
}

当用户单击内部容器时,我们会切换翻转变体:

// Assume `innerEle` represents the inner container
innerEle.addEventListener('click', () => {
    innerEle.classList.toggle('flipping-images__inner--flip');
});

但是,结果是实际上只有第一个图像被旋转。背面的第二张图像仍处于隐藏状态。为了用背面替换正面,我们需要更多额外的样式:

.flipping-images__inner {
    transform-style: preserve-3d;
}

.flipping-images__side {
    backface-visibility: hidden;
}

这两个声明都是必需的。否则,当正面旋转时,无法看到背面。最后,由于我们旋转了内部容器,导致背面也旋转了。因此,我们必须反转旋转:

.flipping-images__side--back {
    transform: rotateY(-180deg);
}

3D动画

到目前为止,图像在内部容器内翻转。这种 perspective 将使我们有能力使翻转看起来像 3D 动画。

.flipping-images {
    perspective: 1000px;
}

如果 perspective 的值是内部容器宽度的两倍,则效果最佳。我们可以在上一节中提到的 load 事件处理程序中执行此操作:

const handleLoad = (e) => {
    const imageEle = e.target;

    // Get the image's width
    const width = imageEle.getBoundingClientRect().width;

    // Assume `containerEle` represents the root element
    containerEle.style.perspective = `${2 * width}px`;
};

水平翻转

我们使用该 rotateY 函数在垂直方向上翻转图像。如果要将翻转方向更改为水平,则可以使用该 rotateX 功能。

.flipping-images__inner--flip {
    transform: rotateX(180deg);
}

.flipping-images__side--back {
    transform: rotateX(-180deg);
}

本文转载于:

https://juejin.cn/post/7325389178926743587

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:__,--,前端,flipping,width,inner,images,翻转
From: https://www.cnblogs.com/smileZAZ/p/17975347

相关文章

  • IC验证中$test$plusargs(),$value$plusargs()怎么用?有什么坑?
    各位朋友,在SystemVerilog中有两个函数作用很大,他们是:$test$plusargs(string)$value$plusargs(user_string,variable) 01 怎么用?相信从这首诗中大家已经很清楚的知道这两个函数什么作用了!没错!我们在仿真运行过程中可以“+”很多的命令字符串,而这两个函数就是与这些......
  • 2024年最新的Python操控微信教程
    自从微信禁止网页版登陆之后,itchat库实现的功能也就都不能用了,那现在Python还能操作微信吗?答案是:可以!在Github上有一个项目叫《WeChatPYAPI》可以使用Python对微信进行操控。简单来说,它是通过逆向PC端微信来实现对微信的操控,使用Python封装后调用更加简单!Github地址:https:/......
  • Git Rebase和Merge-cnblog
    GitRebase和MergeRebase首先,先看一下gitrebase的操作图:在B点创建出来一个新的分支feature,进行了两个commitC和D,master分支则进行了一次提交M,然后在feature分支上执行然后执行gitrebasemaster这样对变基(rebase)既可清楚理解。gitrebase简单来说就是将C和D的提交抽取......
  • 使用 postman 进行接口自动化测试
    新建一个合集创建新的请求保存在此合集下,并添加测试脚本//根据返回的Code判断请求情况tests["HTTP响应成功"]=responseCode.code===200;varjsonData=JSON.parse(responseBody);tests["业务处理成功"]=jsonData.statusCode===100;运行合集请求运行结果......
  • freeswitch on centos dockerfile模式
     概述freeswitch是一款简单好用的VOIP开源软交换平台。centos7docker上编译安装fs的流程记录,本文使用dockerfile模式。环境dockerengine:Version24.0.6centosdocker:7freeswitch:v1.6.20dockerfile创建空目录,创建dockerfile文件。github访问经常失败,先下载好源码包,并......
  • 关于WiFi协议的调制方式详解
    WiFi协议,也称为无线保真技术,是一种允许电子设备通过无线方式在局域网(WLAN)和互联网上进行通信的技术标准。基于IEEE802.11系列协议,这是一种由电气和电子工程师协会制定的无线局域网标准。WiFi协议的工作原理主要包括了物理层和数据链路层的协议。在物理层,WiFi协议通过调制解调器将......
  • vue选择性显示表格列
    实现结果:打印的时候想要选择打印哪些列,可以添加一个选择列功能,选择的列就展示,不选择的不展示实现过程只需要在列上加个显示标识属性show,为true表示显示,为false表示不显示表格组件绑定列时过滤出show为true的同时循环表格列,绑定到多选框上,这样多选框不勾选列时,表格中该列就......
  • 吴师兄学算法day08 贪心 860. 柠檬水找零
    题目:860.柠檬水找零易错点:我写的是ifesle哈哈,第一次还写错了。i==20的时候,5元只找了1张。哈哈哈.应该找3张 我的代码:classSolution:deflemonadeChange(self,bills:List[int])->bool:dic={5:0,10:0,20:0}foriinbills:......
  • 认证协议设计与实现
     一、实验目的初步认识密码学认证协议设计,设计简单的密码学认证协议,助力后面的认证协议学习,同时掌握一台主机模拟多个实体的技巧。二、实验器材pycharm+python3.11三、实验内容实验要求:自己配置python环境,编写程序实现下面的认证协议,初始化系统,运行认证协议,完成认证。(1)编......
  • Java - 排序
      冒泡排序升序排列importjava.util.Arrays;publicclassArrayDemo07{publicstaticvoidmain(String[]args){int[]a={1,4,5,3,14,12,51};int[]sort=sort(a);System.out.println(Arrays.toString(sort));}public......