前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用CSS3 transform:matrix3d实现的搜索框变形动画

使用CSS3 transform:matrix3d实现的搜索框变形动画

作者头像
itclanCoder
发布2023-09-14 17:13:30
3740
发布2023-09-14 17:13:30
举报
文章被收录于专栏:itclanCoder

示例代码

01

JQ实现

代码语言:javascript
复制
$(".ion-ios-search").click(function() {
    if (!$(".search").hasClass("active")) {
        $(".search").addClass("active");
    }
})

$(".ion-ios-close-empty").click(function() {
    $(".search").removeClass("active");
})

JQ的实现主要是操作DOM,$选择器,判断一个元素里面有没有class类,可以用hasClass方法

给一个元素添加类名使用addClass('类名'),而移除元素的类名使用removeClass('类名')

02

Js实现

代码语言:javascript
复制
var ionIosEarch = document.querySelector(".ion-ios-search");
var ionIosCloseEmpty = document.querySelector(".ion-ios-close-empty");

var searchDom = document.querySelector(".search"); 

ionIosEarch.addEventListener("click", function() {
     searchDom.classList.add('active');
}

ionIosCloseEmpty.addEventListener("click", function() { 
       searchDom.classList.remove('active');
}

原生Js,主要是获取元素,使用document.querySelector()获取元素,给元素添加类名使用元素.classList.add('类名')

而移除元素的类名使用元素.classList.remove('类名')

03

Vue实现

代码语言:javascript
复制
<template>
    <div>
        <div class='background'>
             <div class='main'>
                 <div :class='{active: isActive}' class="search">
                     <input placeholder='Search' type='text'>
                     <i @click="handleSearch" class='icon el-icon-search ion-ios-search'></i>
                     <i @click="handleClose" class='icon el-icon-close ion-ios-close-empty'></i>
                 </div>
                <div class='results'></div>
             </div>
        </div>
    </div>
 </template>
 <script>
export default {
    name: "transformMatrix3d",
    data(){
        return {
            isActive:false,
        }
    },
    methods: {
        handleSearch() {
            this.isActive = true;
        },
        handleClose() {
            this.isActive = false;
        }
    }
}
 </script>
 <style lang="scss" scoped>
.main {
     margin: 100px auto;
     width: 90%;
     max-width: 600px;
 }
 .search {
     width: 40px;
     height: 40px;
     border-radius: 50%;
     background-color: white;
     box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5);
     text-align: center;
     cursor: pointer;
     overflow: hidden;
     position: relative;
     animation: hide 500ms ease;
     margin: 0px auto;
 }
 .search input {
     display: none;
     position: absolute;
     top: 0;
     bottom: 0;
     position: absolute;
     left: 0px;
     width: 80%;
     border: 0;
     outline: 0;
     border-radius: 5px;
     padding: 5px 20px;
 }
 .search:hover {
     box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.5);
     transform: translateY(-2px);
 }
 .search.active {
     width: 100%;
     border-radius: 5px;
     text-align: left;
     padding: 0 10px;
     animation: show 500ms ease;
     transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
 }
 .search.active input {
     display: block;
 }
 .search.active .ion-ios-search {
     display: none !important;
 }
 .search.active .ion-ios-close-empty {
     float: right;
     display: block !important;
 }
 .search .icon {
     font-size: 1.2em;
     line-height: 40px;
 }
 .search .icon.ion-ios-search {
     display: block;
 }
 .search .icon.ion-ios-close-empty {
     display: none;
     font-size: 1.6em;
     padding: 0px 10px;
 }
 @keyframes hide {
     0% {
         transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
     }
     20% {
         transform: rotate(-5deg) matrix3d(0.8, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 1, 0, 0, -20, 1, 1);
     }
     100% {
         transform: rotate(0deg) matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
     }
 }
 @keyframes show {
     0% {
         transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
     }
     10% {
         transform: rotate(10deg) matrix3d(1.1, 0, 0, 0, 0, 1.1, 0, 0, 0, 0, 1, 0, 0, 10, 1, 1);
     }
     80% {
         transform: rotate(-5deg) matrix3d(1, 0.1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
     }
     100% {
         transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1);
     }
 }
 </style>

在Vue里面,主要逻辑控制里,是通过data下面的isActive的boolean值,动态添加active类型

在模板里动态绑定class,实现逻辑的控制

利用transform:matrix3d()矩阵变换和动画变换

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-31 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 itclanCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档