这次使用的是react的class 类组件

import React, { Component } from 'react'
import { LeftOutline, SearchOutline } from 'antd-mobile-icons'
import { NavLink } from 'react-router-dom'
class serach extends Component {
constructor(props) {
super(props)
this.state = {
sousuo: '',
// tab 数据渲染
lis: ['发布时间', '产品价格', '收藏量', '评论量'],
// tab切换默认标识
acyive: 0,
// 定义空字符串 不点击 不高亮
active2: '',
// 定义空字符串 不点击 不显示
show: '',
}
}
// 获取seach值
seacrsh = (e) => {
this.setState({
sousuo: e.target.value,
})
}
// 函数结束
tab = (index) => {
console.log(index)
this.setState({
acyive: index,
show: '',
})
}
// 切换内部 下面三角形点击函数
// 判断切换 如果点击了内部 触发了冒泡可以用e.stopPropagation()解决,在此需要判断如果没有点击tab 就点击了tab内的上下三角形筛选 就需要 改变tab acyive 标识
tabqh2 = (e, index) => {
e.stopPropagation()
if (index == 0) {
this.setState({
acyive: 0,
})
} else if (index == 1) {
this.setState({
acyive: 1,
})
} else if (index == 2) {
this.setState({
acyive: 2,
})
} else {
this.setState({
acyive: 3,
})
}
console.log(index) console.log(this.state.acyive)
this.setState({
active2: index,
show: 1,
})
}
// 上面三角形点击点击函数
tabqh = (e, index) => {
e.stopPropagation()
console.log(index)
if (index == 0) {
this.setState({
acyive: 0,
})
} else if (index == 1) {
this.setState({
acyive: 1,
})
} else if (index == 2) {
this.setState({
acyive: 2,
})
} else {
this.setState({
acyive: 3,
})
}
console.log(this.state.acyive)
this.setState({
active2: index,
show: 0,
})
} render() {
return (
<div className="lxf_serach">
{/* top */}
<div className="lxf_serach_top">
<div className="lxf_serach_top_centent">
<div className="lxf_serach_top_centent_nei">
<div className="left">
<NavLink to="">
<LeftOutline fontSize={20} color="white" />
</NavLink>
</div>
<div className="center">
<img src={require('../lxf/imger/sousuo.png')} alt="" />
<input
type="text"
placeholder="请搜索"
onChange={this.seacrsh}
style={{ textIndent: '30px' }}
/>
</div>
<div className="right">
<span>搜索</span>
</div>
</div>
</div>
</div>
{/* /top */}
{/*选项卡 */}
<div className="lxf_serach_xxk">
<div className="lxf_serach_xxk_centen">
<div className="lxf_serach_xxk_centen_qy">
<ul>
{this.state.lis.map((item, index) => {
return (
<li
onClick={() => this.tab(index)}
key={index}
className={this.state.acyive == index ? 'color' : ''}
>
<span>{item}</span>
{/* 三角形 */}
<div className="sanjiaoxing_big">
<div
onClick={(e) => this.tabqh(e, index)}
className={
this.state.active2 == index
? this.state.show === 0
? 'top s'
: 'top'
: 'top'
}
></div>
<div
onClick={(e) => this.tabqh2(e, index)}
className={
this.state.active2 == index
? this.state.show === 1
? 'bottom y'
: 'bottom'
: 'bottom'
}
></div>
</div>
</li>
)
})}
</ul>
</div>
</div>
{/* 展示区域 */}
<div className={this.state.acyive === 0 ? 'xianshi' : 'yincang'}>
<div className={this.state.show === '' ? 'xianshi' : 'yincang'}>
1
</div>
<div className={this.state.show === 0 ? 'xianshi' : 'yincang'}>
1上
</div>
<div className={this.state.show === 1 ? 'xianshi' : 'yincang'}>
1下
</div>
</div>
<div className={this.state.acyive === 1 ? 'xianshi' : 'yincang'}>
<div className={this.state.show === '' ? 'xianshi' : 'yincang'}>
2
</div>
<div className={this.state.show === 0 ? 'xianshi' : 'yincang'}>
2上
</div>
<div className={this.state.show === 1 ? 'xianshi' : 'yincang'}>
2 下
</div>
</div>
<div className={this.state.acyive === 2 ? 'xianshi' : 'yincang'}>
<div className={this.state.show === '' ? 'xianshi' : 'yincang'}>
3
</div>
<div className={this.state.show === 0 ? 'xianshi' : 'yincang'}>
3 上
</div>
<div className={this.state.show === 1 ? 'xianshi' : 'yincang'}>
3 下
</div>
</div>
<div className={this.state.acyive === 3 ? 'xianshi' : 'yincang'}>
<div className={this.state.show === '' ? 'xianshi' : 'yincang'}>
4
</div>
<div className={this.state.show === 0 ? 'xianshi' : 'yincang'}>
4 上
</div>
<div className={this.state.show === 1 ? 'xianshi' : 'yincang'}>
4 下
</div>
</div>
{/* 结束 */}
</div> {/* 选项卡 */}
</div>
)
}
} export default serach

​引入sass

.lxf_serach{
// top条
.lxf_serach_top{
width: 100%;
height: rm(133/3);
background: #2ed8c4;
.lxf_serach_top_centent{
box-sizing: content-box;
padding-left: rm(40/3);
padding-right: rm(40/3);
padding-top: rm(30/3);
.lxf_serach_top_centent_nei{
width: 100%;
height: rm(80/3);
display: flex;
justify-content: space-between;
align-items: center;
.left{
width: rm(80/3);
height: 100%;
display: flex;
align-items: center;
}
.center{
margin-left: rm(20/3);
width: 100%;
height: 100%;
position: relative;
img{
position: absolute;
width: rm(50/3);
height: rm(50/3);
top: rm(15/3);
left: rm(15/3);
}
input{
display: inline-block;
width: 100%;
height: 100%;
border-radius: 20px;
border: none;
color: #333333;
}
}
.right{
margin-left: rm(20/3);
width: rm(140/3);
height: 100%;
display: flex;
align-items: center;
span{
width: rm(120/3);
height: 100%;
display: inline-block;
border: 1px solid #ffffff;
text-align: center;
line-height: rm(80/3);
border-radius: 30px;
color: white;
font-size: rm(36/3);
}
}
}
}
}
// 选项卡
.lxf_serach_xxk{
width: 100%;
height: rm(95/3);
box-shadow: 0px 1px 1px 1px #f5f5f5;
.lxf_serach_xxk_centen{
box-sizing: content-box;
padding-left:rm(40/3) ;
padding-right: rm(40/3);
height: 100%;
.lxf_serach_xxk_centen_qy{
width: 100%;
height: 100%;
ul{
width: 100%;
height: 100%;
display: flex;
justify-content: space-around;
list-style: none; li{
width: 24%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: rm(40/3);
color: #cccccc;
span{
float: left;
}
// 三角形
.sanjiaoxing_big{
height: 100%;
width: rm(30/3);
.top{
margin-top: rm(15/3);
width: 0;
height: 0;
border-left: 3px solid transparent;
border-right: 3px solid transparent;
margin-left: rm(6/3);
border-bottom: 6px solid #f5f5f5;
}
.s{
border-bottom: 6px solid #28d2d1 ; } .bottom{
margin-top: rm(20/3);
width: 0;
height: 0;
border-left: 3px solid transparent;
border-right: 3px solid transparent;
border-top: 6px solid white;
margin-left: rm(6/3);
border-top: 6px solid #f5f5f5;
}
.y{
border-top: 6px solid #28d2d1;
}
}
}
.color{
color: #28d2d1 !important;
}
}
}
}
}
// 选项卡内容区
.xianshi{
width: 100%;
height: 200px;
background: red;
display: block;
}
.yincang{
width: 100%;
height: 200px;
background: red;
display: none;
} }

  

​rm是引入了移动端适配通过屏幕大小计算

@charset "UTF-8";
$yh:"Microsoft yahei";
@function rm($px, $base: 14.0625) {
@return ($px / $base) * 1rem;
}
html {
font-size: 62.5%; font-family:$yh;
}
body, textarea, input, select, option {
color: #333;
font-family: "Hiragino Sans GB", "Microsoft Yahei", tahoma, arial, sans-serif;
-webkit-font-smoothing: antialiased;
-webkit-tap-highlight-color:transparent;
}
body,h1,h2,h3,h4,h5,h6,blockquote,ol,ul,dl,dd,p,textarea,input,select,option,form {
margin:0; padding:0;
} ol,ul,textarea,input,option,th,td {
padding:0;
}
.page{
min-width: 320px;max-width: 750px;margin: 0 auto;
}
h1,h2,h3,h4,h5,h6 {
font-weight: normal;
font-size:100%;
}
a,select,input,textarea{
outline: none;
}
article, aside, details, figcaption, figure, footer, header, menu, nav, section {
display: block;
}
table {
border-collapse:collapse;border-spacing: 0;
}
ul,ol {
list-style-type:none;
}
.hide {
display: none;
}
.show {
display: block;
}
.clearfix:after {
content:'.';display:block;height:0;clear:both;visibility:hidden;
}
//.clearfix {*zoom:1;}
.clear {
clear:both;height:0;overflow:hidden;
}
/* ios默认文本框阴影 */
input[type=text],textarea{
-webkit-appearance:none;
}
/* 低版本安卓文本框层级问题 */
input:focus{
-webkit-user-modify:read-write-plaintext-only;
}
fieldset, img {
border: 0;
}
a {
text-decoration:none;
}
a,textarea,input{
outline:none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after, q:before, q:after {
content: '';
content: none;
}
textarea {
overflow:auto;resize:none;
}
// 以下是按照320下12像素字号走的,因为谷歌不识别小于12号字号
@media only screen and (min-width: 320px){
html {
font-size: 75%!important; /* 12÷16=75% */
}
}
/**
62.5% 10px;
640 150% 24px;
320除以标准比例 640 再乘以 640的基数24 再除以 HTML 根据基数16
320/640 * 24 / 16 = 75%;
375/640 * 24 / 16 = 87.89%;
414/640 * 24 / 16 = 97.03%
*/
@media only screen and (min-width: 360px){
html {
font-size: 84.3%!important; /* 13.5÷16=84.3% */
}
}
@media only screen and (min-width: 375px){
html {
font-size: 87.890625%!important; /* 14.0625÷16=87.890625% */
}
}
@media only screen and (min-width: 384px){
html {
font-size: 90%!important; /* 14.4÷16=90% */
}
}
@media only screen and (min-width: 390px){
html {
font-size: 91.4%!important; /* 14.625÷16=91.4% */
}
}
@media only screen and (min-width: 412px){
html {
font-size: 96.56%!important; /* 15.45÷16=96.56% */
}
}
@media only screen and (min-width: 414px){
html {
font-size: 97.03%!important; /* 15.525÷16=97.03% */
}
}
@media only screen and (min-width: 480px){
html {
font-size: 112.5%!important; /* 18÷16=112.5% */
}
}
@media only screen and (min-width: 560px){
html {
font-size: 131.25%!important;/* 21÷16=131.25% */
}
}
@media only screen and (min-width: 640px){
html {
font-size: 150%!important; /* 24÷16=150% */
}
}
@media only screen and (min-width: 720px){
html {
font-size: 168.75%!important; /* 27÷16=168.75% */
}
}
@media only screen and (min-width: 750px){
html {
font-size: 175.78125%!important; /* 28.125÷16=175.78125% */
}
}
// @media only screen and (min-width: 800px){
// html {
// font-size: 187.5%!important; /* 30÷16=146.43% */
// }
// }
// @media only screen and (min-width: 960px){
// html {
// font-size: 225%!important; /* 36÷16=146.43% */
// }
// }

  

react 实现tab切换 三角形筛选样式的更多相关文章

  1. 【原】react做tab切换的几种方式

    最近搞一个pc端的活动,搞了一个多月,甚烦,因为相比于pc端,更喜欢移动端多一点.因为移动端又能搞我的react了. 今天主要总结一下react当中tab切换的几种方式,因为tab切换基本上都会用到. ...

  2. easyui easyui-accordion的使用和在tab切换时没有样式

    1.easyui-accordion的使用 <div id="aa" class="easyui-accordion" style="width ...

  3. react实现tab切换效果

    ...this.state = { // 全部数据 addressJobs: [ { address: '北京', jobs: ['北京职位1', '北京职位2', '北京职位3', '北京职位4', ...

  4. jQuery带tab切换搜索框样式代码

    效果体验:http://hovertree.com/texiao/jquery/23/ 代码如下,保存到HTML文件也可以查看效果: <!DOCTYPE html> <html la ...

  5. react简单的tab切换 (styled-components)

    其实,在我们日常的编程当中,经常会碰到tab切换的模块,那么,实现他的方法也有很多中,下面是一款简单,容易理解的react tab切换方法. 通过设置state中的current 属性去控制tab 和 ...

  6. react实现的tab切换组件

    我有点想要吐槽,因为用原生的js实现起来挺简单的一个小东西,改用react来写却花了我不少时间,也许react的写法只有在复杂的web应用中才能体现出它的优势吧!不过吐槽归吐槽,对react这种优雅的 ...

  7. DIV+CSS 样式简单布局Tab 切换

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  8. AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换

    一.Flutter AppBar 自定义顶部按钮图标.颜色 leading   在标题前面显示的一个控件,在首页通常显示应用的 logo:在其他界面通常显示为返回按钮 title  标题,通常显示为当 ...

  9. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. PIC16 bootloader之UART bootloader

    了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). PIC16 bootl ...

  2. 常见 js 数组方法使用详解

    数组常用方法总结 concat filter map some every reduce sort includes join some every 语法:array.every(function(c ...

  3. 【豆科基因组】普通豆/菜豆/四季豆Common bean (Phaseolus vulgaris L.) 683个自然群体重测序2020NG

    目录 一.来源 二.结果 683份材料重测序 地方种landraces和育种品系breeding lines的多样性 表型和基因-环境互作(G by E) 菜豆产量潜力相关的MTAs(显著关联位点) ...

  4. 【GS文献】从家畜到植物,通过基因组选择提高遗传增益

    目录 说明 1.前言 2.植物GS瓶颈 3.提高GS预测的准确性 4.GS与现代育种技术结合 5.GS开源育种网络 说明 Enhancing Genetic Gain through Genomic ...

  5. Redis队列跟MQ的区别

    Redis队列:Redis队列是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用 ...

  6. R语言与医学统计图形-【24】ggplot位置调整函数

    ggplot2绘图系统--位置调整函数 可以参数position来调整,也有专门的函数position_*系列来设置. 位置函数汇总: 1.排列 并排排列 mean <- runif(12,1, ...

  7. eclipse 配置黑色主题(转载)

    转载:http://www.cnblogs.com/csulennon/p/4231405.html 虽然以前也使用eclipse的黑色主题,但是配置起来稍微麻烦一点. 这里先声明,下面的方式适合最新 ...

  8. GlimmerHMM指南

    GlimmerHMM指南 官方用户手册 GlimmerHMM是一种De novo的新基因预测软件. 新基因发现基于Generalized Hidden Markov Model (GHMM). Gli ...

  9. euerka总结

    一.euerka的基本知识 1. 服务治理 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系 ...

  10. 学习java 7.1

    学习内容:数组的定义格式:int[ ] arr;  int arr[ ]; 数组的动态初始化:int[ ] arr = new int[ ];静态初始化:int[ ] arr = new int[ ] ...