React 简书项目实战【3】实现搜索框动画

news2025/1/21 12:16:31

React 简书项目实战【3】实现搜索框动画

添加判断变量

header/index.js

核心代码

...
class Header extends Component {
  constructor(props) {
    super(props);
    this.state = {
      focused: true
    }
  }
    render() {
...

添加classname

header/index.js

核心代码

搜索框和放大镜图标

<SearchWrapper>
  <NavSearch
    className={this.state.focused ? 'focused' : ''}
  ></NavSearch>
  <i className={this.state.focused ? 'focused iconfont' : 'iconfont'}>&#xe62f;</i>
</SearchWrapper>

设置css

header/style.js

核心代码

export const SearchWrapper = styled.div`
    position: relative;
    float: left;
    .iconfont {
        position: absolute;
        right: 5px;
        bottom: 5px;
        width: 30px;
        line-height: 30px;
        border-radius: 15px;
        text-align: center;
        &.focused {
            background: #777;
            color: #fff;
        }
    }
`;
export const NavSearch = styled.input.attrs({
    placeholder: '搜索'
})`
    width: 160px;
    height: 38px;
    padding: 0 30px 0 20px;
    margin-top: 9px;
    margin-left: 20px;
    box-sizing: border-box;
    border: none;
    outline: none;
    border-radius: 19px;
    background: #eee;
    font-size: 14px;,
    color: #666;
    &::placeholder {
        color: #999;
    }
    &.focused {
        width: 240px;
    }
`;

变化效果

image-20220628021702949

image-20220628021648789

绑定触发事件

header/index.js

核心代码

<NavSearch
  className={this.state.focused ? 'focused' : ''}
  onFocus={this.handleInputFocus}
  onBlur={this.handleInputBlur}
></NavSearch>
handleInputFocus() {
  this.setState({
    focused: true
  })
}
handleInputBlur() {
  this.setState({
    focused: false
  })
}

实现动画

下载react-transition-group

image-20220628023531060

添加CSSTransition标签

header/index.js

核心代码

引入

import { CSSTransition } from 'react-transition-group'
<SearchWrapper>
  <CSSTransition
    in={this.state.focused}
    timeout={200}
    classNames="slide"
  >
    <NavSearch
      className={this.state.focused ? 'focused' : ''}
      onFocus={this.handleInputFocus}
      onBlur={this.handleInputBlur}
    ></NavSearch>
  </CSSTransition>
  <i className={this.state.focused ? 'focused iconfont' : 'iconfont'}>&#xe62f;</i>
</SearchWrapper>

添加动画的css

header/style.js

核心代码

.slide-enter {
    transition: all .2s ease-out;
}
.slide-enter-active {
    width: 240px;
}
.slide-exit {
    transition: all .2s ease-out;
}
.slide-exit-active {
    width: 160px;
}

整体代码

header/style.js

import styled from 'styled-components';
import logoPic from '../../statics/logo.png'
export const HeaderWrapper = styled.div`
    position: relative;
    height: 58px;
    border-bottom: 1px solid #f0f0f0;
`;
export const Logo = styled.a.attrs({href:'/'})`
    position: absolute;
    top: 0;
    left: 0;
    display: block;
    width: 100px;
    height: 56px;
    background: url(${logoPic});
    background-size: contain;
`;
export const Nav = styled.div`
    width: 960px;
    height: 100%;
    padding-right: 70px;
    box-sizing: border-box;
    margin: 0 auto;
`;
export const NavItem = styled.div`
    line-height: 56px;
    padding: 0 15px;
    font-size: 17px;
    color: #333;
    &.left {
        float: left;
    }
    &.right {
        float: right;
        color: #969696;
    }
    &.active {
        color: #ea6f5a;
    }
`;
export const SearchWrapper = styled.div`
    position: relative;
    float: left;
    .slide-enter {
        transition: all .2s ease-out;
    }
    .slide-enter-active {
        width: 240px;
    }
    .slide-exit {
        transition: all .2s ease-out;
    }
    .slide-exit-active {
        width: 160px;
    }
    .iconfont {
        position: absolute;
        right: 5px;
        bottom: 5px;
        width: 30px;
        line-height: 30px;
        border-radius: 15px;
        text-align: center;
        &.focused {
            background: #777;
            color: #fff;
        }
    }
`;
export const NavSearch = styled.input.attrs({
    placeholder: '搜索'
})`
    width: 160px;
    height: 38px;
    padding: 0 30px 0 20px;
    margin-top: 9px;
    margin-left: 20px;
    box-sizing: border-box;
    border: none;
    outline: none;
    border-radius: 19px;
    background: #eee;
    font-size: 14px;,
    color: #666;
    &::placeholder {
        color: #999;
    }
    &.focused {
        width: 240px;
    }
`;

export const Addition = styled.div`
    position: absolute;
    right: 0;
    top: 0;
    height: 56px;
`;

export const Button = styled.div`
    float: right;
    margin-top: 9px;
    margin-right: 20px;
    padding: 0 20px;
    line-height: 38px;
    border-radius: 19px;
    border: 1px solid #ec6149;
    font-size: 14px;
    &.reg {
        color: #ec6149;
    }
    &.writting {
        color: #fff;
        background: #ec6149;
    }
`;

header/index.js

import React, { Component } from "react";
import { CSSTransition } from 'react-transition-group'
import {SearchWrapper,HeaderWrapper,Logo,Nav,NavItem,NavSearch,Addition,Button} from "./style";
class Header extends Component {
  constructor(props) {
    super(props);
    this.state = {
      focused: false
    }
    this.handleInputFocus = this.handleInputFocus.bind(this);
    this.handleInputBlur = this.handleInputBlur.bind(this);
  }
    render() {
        return (
            <HeaderWrapper>
                <Logo />
                <Nav>
                    <NavItem className='left active'>首页</NavItem>
                    <NavItem className='left'>下载App</NavItem>
                    <NavItem className='right'>登录</NavItem>
                    <NavItem className='right'>
                        <i className="iconfont ">&#xe636;</i>
                    </NavItem>

                    <SearchWrapper>
                      <CSSTransition
                        in={this.state.focused}
                        timeout={200}
                        classNames="slide"
                      >
                        <NavSearch
                          className={this.state.focused ? 'focused' : ''}
                          onFocus={this.handleInputFocus}
                          onBlur={this.handleInputBlur}
                        ></NavSearch>
                      </CSSTransition>
                      <i className={this.state.focused ? 'focused iconfont' : 'iconfont'}>&#xe62f;</i>
                    </SearchWrapper>
                </Nav>
                <Addition>
                    <Button className='writting'>
                        <i className="iconfont ">&#xe600;</i>
                        写文章</Button>
                    <Button className='reg'>注册</Button>
                </Addition>
            </HeaderWrapper>
        )
    }
  handleInputFocus() {
    this.setState({
      focused: true
    })
  }
  handleInputBlur() {
    this.setState({
      focused: false
    })
  }
}

export default Header;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你如何用界面组件DevExpress WPF应用一个模板主题

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF组件包…

VR失重太空舱游乐设备|航空航天VR体验|VR航天航空体验馆

普乐蛙推出了十几种不同类型的VR航天航空体验设备&#xff0c;VR创意内容丰富好玩&#xff0c;360全景还原航空各个场景&#xff0c;体验享受航空中的失重、飞行、旋转等刺 激与乐趣;模拟月球、太空、空间站等丰富航天场景&#xff0c;近距离体验航天科幻十足的魅力;通过沉浸式…

vue(移动端)使用高德地图实现精准定位

目录 效果图 前提准备 代码展示 效果图 两个页面 页面一&#xff08;粗略定位&#xff09; 点击城市进入页面二 &#xff08;粗略定位&#xff09;&#xff0c;搜索框输入具体位置&#xff08;以大连理工大学为例&#xff09; 点击大连理工大学&#xff0c;回到页面一&…

[附源码]java毕业设计校园淘宝节系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MongoDB Journaling工作原理

文章目录 小结当 mongod 进程启动后,首先将数据文件映射到 shared 视图中,假如数据文件的大小为 4000 个字节,它会将此大小的数据文件映射到内存中,地址可能为 1000000~1004000。如果直接读取地址为1000060的内存,我们将得到数据文件中第60个字节处的内容。有一点要注意,…

ElementUI的Form表单使用slot-scope=“scope“获取当前表格行数据实现数据回显、修改表单操作

在写项目时&#xff0c;老师通过向后端发请求获得表格原来的数据来填充修改表单里的数据。 这是表格&#xff1a; 这是点击修改按钮后显示出来的修改表单&#xff1a; 但本地里都已经有这些数据了&#xff0c;就没必要再发一次请求&#xff0c;徒增服务器压力。 准备 可是…

Java基础之《netty(3)—NIO之Buffer》

一、Buffer基本介绍 1、缓冲区&#xff08;Buffer&#xff09; 缓冲区本质上是一个可以读写数据的内存块&#xff0c;可以理解成是一个容器对象&#xff08;数组&#xff09;。该对象提供了一组方法&#xff0c;可以更轻松的使用内存块。缓冲区对象内置了一些机制&#xff0c;…

黑盒子问题

一 问题描述 黑盒子代表一个原始数据库&#xff0c;存储一个整数数组和一个特殊的 i 变量。最初的时刻&#xff0c;黑盒子是空的&#xff0c;i0&#xff0c;黑盒子处理一系列命令&#xff08;事务&#xff09;。有两种类型的事务。 ① ADD(x)&#xff0c;将元素 x 放入黑盒子…

按用户导出数据到asm磁盘组,并复制到另一个集群的asm

1.创建asm导出数据目录 sql>select name,total_mb,free_mb from v$asm_diskgroup; 确认集群asm磁盘组环境 asmcmd>cd DGDSDB asmcmd>mkdir dpbak asmcmd>ls -l sql>conn / as sysdba create directory expdp_asm_dir as DGDSDB/dpbak; create directory expdp_l…

堆-c语言实现

1. 树是什么&#xff1f; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合 注意&#xff1a;根结点没有前驱结点&#xff1b;每棵子树的跟结点有且只有一个前驱结点&#xff0c;可能有0个或者多个后继结点&am…

数学建模学习(108):帮助小白快速实现批量机器学习建模训练和批量的数据可视化

本文主要针对机器学习知识薄弱,不太擅长搭建模型同学使用。 本文主要是讲解可以快速轻松实现可视化、数据预处理、批量模型构建。帮助大家轻松做到可视化和建模。特别是机器学习不扎实同学。 数据科学模型开发管道涉及各种组件,包括数据收集、数据处理、探索性数据分析、建模…

unity il2cpp打包安卓打包崩溃原因Unity2020.3 il2cpp.so丢失

Unity2020.3 il2cpp.so 问题&#xff1a;升级unity2020.3后&#xff0c;使用il2cpp方式打Android包&#xff0c;在手机上启动会崩溃&#xff0c;追查崩溃原因是il2cpp.so not found。 解决过程&#xff1a; il2cpp.so没有&#xff1f;一脸懵逼&#xff01;记得以前在调用Bui…

面试八股 | 计算机网络 | TCP三次握手

CP三次握手和四次挥手是面试题的热门考点&#xff0c;它们分别对应TCP的连接和释放过程&#xff0c;今天我们先来认识一下TCP三次握手过程&#xff0c;以及是否可以使用“两报文握手”建立连接。1、TCP是什么&#xff1f; TCP是面向连接的协议&#xff0c;它基于运输连接来传送…

【附源码】计算机毕业设计JAVA养老机构系统

【附源码】计算机毕业设计JAVA养老机构系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

国际物流和跨境电商物流的区别

跨境物流是将货物通过海、陆、空运输从一个国家运输到另一个国家或地区&#xff0c;最终完成交易的目的。国际物流是实现两地对物资进行物理移动的一项国际商品交易或交流活动&#xff0c;从而完成国际商品交易的终目的。二者说法不同而已&#xff0c;本质上两者并没有太大的区…

APAUNet

Title:APAUNet: Axis Projection Attention UNet for Small Target in 3D Medical Segmentation 摘要&#xff1a; 在医学分割中&#xff0c;小目标分割对于诊断至关重要。在本文提出了轴向投影注意力网络&#xff0c;用于三维医学图像分割&#xff0c;特别是小目标。考虑到背…

什么是PCB中的光学定位点,不加可不可以?

什么是PCB中的光学定位点&#xff0c;不加可不可以&#xff1f; 这个问题在我平时的教学答疑出现的频次非常高&#xff0c;很多新手在初次接触这个概念的时候往往分不清楚这个光学定位点作用什么&#xff1f;从而导致他根本不知道什么时候该加&#xff0c;什么时候不加。 今天我…

物流通知:您的快递即刻送达!

“双11”购物狂欢节刚刚过去 “双12”马上就要到啦&#xff01; 回想双11期间 隔日达、次日达的快递 让买买买的快乐直接翻倍 也大大提升了消费者们 双12的再消费欲望 飞奔的物流背后有什么秘密武器&#xff1f; 来跟着小翼一探究竟&#xff01; 物流行业的飞速发展给…

Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、JNI实现加密和解密 在实际开发中 JNI主要应用于以下场景 1&#xff1a;对关键业务数据进行加密和解密 Java代码容易遭到破解&#xff0c;JNI加密更加安全 2&#xff1a;底层的网络操作与设备操作 Java作为一门高级…

智慧农业建设方案中的物联网技术

物联网即“物物相联之网”,指通过射频识别&#xff08;RFID&#xff09;、红外感应器、全球定位系统、激光扫描器等信息传感设备&#xff0c;按约定的协议&#xff0c;把物与物&#xff0c;人与物进行智能化连接&#xff0c;进行信息交换和通讯&#xff0c;以实现智能化识别、定…