当前位置: 首页 > news >正文

江苏市场监督管理局官网公司搜索seo

江苏市场监督管理局官网,公司搜索seo,如何申请网站备案,wordpress 评论头像不显示效果: 功能点: 1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 目的: 给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖…

效果:

功能点:

1、四个档位

2、可点击加减切换档位

3、可以点击区域切换档位

4、可以滑动切换档位

目的:

给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖着,希望可以帮到大家

代码

ts的写法风格

index.tsx     

import { View, ITouchEvent, BaseTouchEvent } from '@tarojs/components'
import Taro from '@tarojs/taro'
import { useState } from 'react'
import styles from './index.module.less'
import classNames from 'classnames'
import { debounce } from '~/utils/util'enum ANGLES {ANGLES_135 = -135,ANGLES_90 = -90,ANGLES_45 = -45,ANGLES_0 = 0
}enum MODE_VALUE {MODE_1 = 1,MODE_2 = 2,MODE_3 = 3,MODE_4 = 4
}const HalfCircle = () => {const [state, setState] = useState({originAngle: ANGLES.ANGLES_135,isTouch: false,val: MODE_VALUE.MODE_1,originX: 0,originY: 0})/** 半圆的半径 */const RADIUS = 150/** 半径的一半 */const RADIUS_HALF = RADIUS / 2/** 4/3 圆的直径 */const RADIUS_THIRD = RADIUS_HALF * 3/** 直径 */const RADIUS_DOUBLE = RADIUS * 2/** 误差 */const DEVIATION = 25/** 是否开启点击振动 */const isVibrateShort = trueconst getAngle = () => {return {transform: `rotate(${state.originAngle}deg)`,transition: `all ${state.isTouch ? ' 0.2s' : ' 0.55s'}`}}/*** 根据坐标判断是否在半圆轨道上,半圆为RADIUS,误差为DEVIATION* @param pageX* @param pageY*/const isInHalfCircleLine = (pageX: number, pageY: number, deviation?: number) => {const DEVIATION_VALUE = deviation || DEVIATIONconst squareSum = (pageX - RADIUS) * (pageX - RADIUS) + (pageY - RADIUS) * (pageY - RADIUS)const min = (RADIUS - DEVIATION_VALUE) * (RADIUS - DEVIATION_VALUE)const max = (RADIUS + DEVIATION_VALUE) * (RADIUS + DEVIATION_VALUE)return squareSum >= min && squareSum <= max}/** 根据做标点,获取档位 0 -> 4, -45 -> 3, -90 -> 2, -135 -> 1,从而获取旋转的角度 */const setGear = (pageX: number, pageY: number) => {let val = state.vallet originAngle = state.originAngleif (isInHalfCircleLine(pageX, pageY)) {if (pageX > 0 && pageX <= RADIUS_HALF) {val = MODE_VALUE.MODE_1originAngle = ANGLES.ANGLES_135} else if (pageX > RADIUS_HALF && pageX <= RADIUS) {val = MODE_VALUE.MODE_2originAngle = ANGLES.ANGLES_90} else if (pageX > RADIUS && pageX <= RADIUS_THIRD) {val = MODE_VALUE.MODE_3originAngle = ANGLES.ANGLES_45} else {val = MODE_VALUE.MODE_4originAngle = ANGLES.ANGLES_0}}if (state.val === val) returnsetState((old) => {return {...old,originAngle,val}})if (isVibrateShort) {setTimeout(() => {Taro.vibrateShort()}, 200)}}/*** 滑动比较细腻,根据x轴坐标,calcX判断是否前进还是后退* @param pageX* @param pageY*/const setGearSibler = (pageX: number, pageY: number) => {let val = state.vallet originAngle = state.originAngleconst calcX = pageX - state.originX/** 把误差值增加,方便滑动 */if (isInHalfCircleLine(pageX, pageY, 50)) {if (pageX > 0 && pageX <= RADIUS_HALF) {if (calcX > 0) {/** 向前滑动,就前进一个档位 */val = MODE_VALUE.MODE_2originAngle = ANGLES.ANGLES_90} else {/** 向后滑动,就后退一个档位 */val = MODE_VALUE.MODE_1originAngle = ANGLES.ANGLES_135}} else if (pageX > RADIUS_HALF && pageX <= RADIUS) {if (calcX > 0) {val = MODE_VALUE.MODE_2originAngle = ANGLES.ANGLES_90} else {val = MODE_VALUE.MODE_1originAngle = ANGLES.ANGLES_135}} else if (pageX > RADIUS && pageX <= RADIUS_THIRD) {if (calcX > 0) {val = MODE_VALUE.MODE_3originAngle = ANGLES.ANGLES_45} else {val = MODE_VALUE.MODE_2originAngle = ANGLES.ANGLES_90}} else {if (calcX > 0) {val = MODE_VALUE.MODE_4originAngle = ANGLES.ANGLES_0} else {val = MODE_VALUE.MODE_3originAngle = ANGLES.ANGLES_45}}}setState((old) => {return {...old,originAngle,val}})}/*** 获取正确的坐标点* @param pageX* @param pageY* @returns*/const getRealXY = (pageX: number,pageY: number): Promise<{realX: numberrealY: number}> => {return new Promise((resolve) => {Taro.createSelectorQuery().select('#sliderBgcId').boundingClientRect((rect) => {const { left, top } = rect/** 获取真实的做标点 */const realX = pageX - leftconst realY = pageY - topresolve({realX,realY})}).exec()})}const onTouchEnd = (event: BaseTouchEvent<any>) => {setState((old) => {return {...old,isTouch: false}})}const onTouchMove = debounce(async (event: BaseTouchEvent<any>) => {const { pageX, pageY } = event.changedTouches[0]const { realX, realY } = await getRealXY(pageX, pageY)if (isInHalfCircleLine(realX, realY)) {setGearSibler(realX, realY)}}, 100)const onTouchStart = async (event: BaseTouchEvent<any>) => {const { pageX, pageY } = event.changedTouches[0]const { realX, realY } = await getRealXY(pageX, pageY)setState((old) => {return {...old,originX: realX,originY: realY,isTouch: true}})}/** 点击设置档位 */const onHandleFirstTouch = async (event: BaseTouchEvent<any>) => {const { pageX, pageY } = event.changedTouches[0]const { realX, realY } = await getRealXY(pageX, pageY)if (isInHalfCircleLine(realX, realY)) {setGear(realX, realY)}}const lose = () => {if (state.isTouch) returnif (state.val === 1) return Taro.showToast({title: '最低只能1挡',icon: 'error',duration: 2000})setState((old) => {return {...old,originAngle: state.originAngle - 45,val: state.val - 1}})if (isVibrateShort) {Taro.vibrateShort()}}const add = () => {if (state.isTouch) returnif (state.val === 4) return Taro.showToast({title: '最高只能4挡',icon: 'error',duration: 2000})setState((old) => {return {...old,originAngle: state.originAngle + 45,val: state.val + 1}})if (isVibrateShort) {Taro.vibrateShort()}}return (<ViewclassName={styles.slider}// onTouchEnd={(event) => onTouchEnd(event)}// onTouchMove={(event) => onTouchMove(event)}// onTouchStart={(event) => onTouchStart(event)}onClick={onHandleFirstTouch}><View className={styles.activeSliderSet}><View className={styles.activeSlider} style={getAngle()} /></View><View className={styles.origin} id="origin"><View className={styles.long} style={getAngle()}><ViewclassName={styles.circle}onTouchMove={(event) => onTouchMove(event as BaseTouchEvent<any>)}onTouchStart={(event) => onTouchStart(event as BaseTouchEvent<any>)}onTouchEnd={(event) => onTouchEnd(event as BaseTouchEvent<any>)}/></View></View>{/* 背景 */}<View className={styles.sliderBgc} id="sliderBgcId" />{/* 刻度 */}{/* <View className={styles.scaleBgc} /> */}<View className={styles.centerContent}><View className={styles.centerText}>能量档位</View><View className={styles.btn_air_bar}><View className={classNames(styles.btn_air, styles.btn_air_left)} onClick={lose}>-</View><View className={styles.val}><View className="val_text">{state.val}</View></View><View className={classNames(styles.btn_air, styles.btn_air_right)} onClick={add}>+</View></View></View></View>)
}export default HalfCircle

index.module.less

@color-brand: #EBC795 ;
@borderColor:#706D6D;
@sliderWidth:10px;
@radius:150px;
@long: 150px;
@border-radius: @long;.slider {position: relative;padding-bottom: @sliderWidth / 2;background-color: #000;width: 100vw;display: flex;justify-content: center;align-items: center;// 背景色.sliderBgc {width: @long*2;height: @long;border: @sliderWidth solid;border-radius: @border-radius  @border-radius 0 0;border-color: @borderColor;border-bottom: none;}.scaleBgc {width: @long*2 + @sliderWidth *2;height: @long + @sliderWidth;position: absolute;// bottom: 0;// left: 0;border: @sliderWidth solid;border-radius: @border-radius + @sliderWidth  @border-radius + @sliderWidth 0 0;border-color: transparent;border-bottom: none;top: -10px;background-clip: padding-box, border-box;background-origin: padding-box, border-box;background-image: linear-gradient(to right, #000, #000), linear-gradient(90deg, #FFD1B2, #E49E6B);}// 激活色.activeSliderSet {position: absolute;width: (@long) *2;height: @long;// left: 0;// bottom: 0;z-index: 2;overflow: hidden;.activeSlider {bottom: 0;left: 0;width: @long*2;height: @long;border: @sliderWidth solid;border-color: @color-brand;// border-color: transparent !important;border-radius: @border-radius  @border-radius 0 0;border-bottom: none;transform: rotate(-100deg);transform-origin: @long @long;// background-clip: padding-box, border-box;// background-origin: padding-box, border-box;// background-image: linear-gradient(to right, #000, #000), linear-gradient(90deg, #FFD1B2, #E49E6B);}}.origin {width: 0;height: 0;position: absolute;background-color: rgba(0, 0, 0, 0.1);bottom: 0;left: 50%;z-index: 11;transform: translateX(50%);.long {width: @long - (@sliderWidth / 2);height: 0;z-index: 9999;position: absolute;top: 0;left: 0;transform-origin: 0 0;.circle {width: 16px;height: 16px;border-radius: 50%;position: absolute;top: 50%;right: 0;transform: translate(50%, -50%);background-color: #000;border: #fff 4px solid;z-index: 999;padding: 5px;}}}}.centerContent {position: absolute;bottom: 0;left: 50%;transform: translateX(-50%);z-index: 99;margin-bottom: 20px;.centerText {text-align: center;color: var(--q-light-color-text-secondary, var(--text-secondary, #8C8C8C));font-size: 10px;margin-bottom: 25px;}.btn_air_bar {display: flex;align-items: center;.btn_air {width: 30px;height: 30px;border-radius: 50%;background-color: wheat;font-size: 16px;font-weight: 500;display: flex;align-items: center;justify-content: center;}.btn_air_left {background-color: #706D6D;color: white;}.btn_air_right {background-color: white;color: #706D6D;}.val {height: 26px;display: flex;align-items: center;margin: 0 30px;font-size: 26px;font-weight: 700;}}
} 

防抖的工具函数debounce 的详细代码:

import { debounce } from '~/utils/util'

function debounce<T extends Function>(func: T, delay: number): T {let timeoutreturn function (this: any, ...args: any[]): void {const context = this;clearTimeout(timeout);timeout = setTimeout(() => {func.apply(context, args);}, delay);} as any;
}


文章转载自:
http://darner.bnpn.cn
http://cushioncraft.bnpn.cn
http://inequipotential.bnpn.cn
http://quieten.bnpn.cn
http://timesaver.bnpn.cn
http://superpersonality.bnpn.cn
http://coachee.bnpn.cn
http://atheromatous.bnpn.cn
http://rareripe.bnpn.cn
http://autocue.bnpn.cn
http://constituency.bnpn.cn
http://mirthquake.bnpn.cn
http://cavefish.bnpn.cn
http://agloat.bnpn.cn
http://thermotropism.bnpn.cn
http://snaggletooth.bnpn.cn
http://uranide.bnpn.cn
http://pseudomorph.bnpn.cn
http://model.bnpn.cn
http://overbearing.bnpn.cn
http://adzuki.bnpn.cn
http://gangplank.bnpn.cn
http://ramose.bnpn.cn
http://chlorite.bnpn.cn
http://liftgate.bnpn.cn
http://indicant.bnpn.cn
http://molestation.bnpn.cn
http://howbeit.bnpn.cn
http://hydropathist.bnpn.cn
http://multienzyme.bnpn.cn
http://desmolysis.bnpn.cn
http://participant.bnpn.cn
http://triradius.bnpn.cn
http://tidytips.bnpn.cn
http://tartness.bnpn.cn
http://reapportion.bnpn.cn
http://lipogrammatic.bnpn.cn
http://lanthanide.bnpn.cn
http://abstainer.bnpn.cn
http://embacle.bnpn.cn
http://artless.bnpn.cn
http://mothball.bnpn.cn
http://kippen.bnpn.cn
http://ship.bnpn.cn
http://teliospore.bnpn.cn
http://demurral.bnpn.cn
http://knives.bnpn.cn
http://skymotel.bnpn.cn
http://spurrite.bnpn.cn
http://boatbill.bnpn.cn
http://explanate.bnpn.cn
http://gymnasia.bnpn.cn
http://sgm.bnpn.cn
http://accepted.bnpn.cn
http://flammability.bnpn.cn
http://suede.bnpn.cn
http://ultrastable.bnpn.cn
http://compatriot.bnpn.cn
http://askari.bnpn.cn
http://judea.bnpn.cn
http://potbellied.bnpn.cn
http://wuchang.bnpn.cn
http://complimental.bnpn.cn
http://coarseness.bnpn.cn
http://cresting.bnpn.cn
http://symbionese.bnpn.cn
http://inconsumable.bnpn.cn
http://outcrossing.bnpn.cn
http://gossip.bnpn.cn
http://misthink.bnpn.cn
http://epitympanum.bnpn.cn
http://secret.bnpn.cn
http://yankeedom.bnpn.cn
http://immingle.bnpn.cn
http://cytherea.bnpn.cn
http://ferrochromium.bnpn.cn
http://trousers.bnpn.cn
http://mega.bnpn.cn
http://eristic.bnpn.cn
http://tzetze.bnpn.cn
http://omissible.bnpn.cn
http://frantically.bnpn.cn
http://str.bnpn.cn
http://immuration.bnpn.cn
http://aerostatical.bnpn.cn
http://bluejeans.bnpn.cn
http://queer.bnpn.cn
http://faveolus.bnpn.cn
http://wrinkle.bnpn.cn
http://angakok.bnpn.cn
http://unexcitable.bnpn.cn
http://transonic.bnpn.cn
http://sensed.bnpn.cn
http://prestore.bnpn.cn
http://laurentian.bnpn.cn
http://johanna.bnpn.cn
http://merchant.bnpn.cn
http://bedck.bnpn.cn
http://treadwheel.bnpn.cn
http://fenestella.bnpn.cn
http://www.dt0577.cn/news/116182.html

相关文章:

  • 上海十大跨境电商排名武汉seo创造者
  • 茂名公司网站制作合肥百度关键词优化
  • 苏州设计网页网站怎样通过网络销售自己的产品
  • 江苏市场监督管理局电话首页优化排名
  • 3d做ppt模板下载网站怎么免费自己做推广
  • 张家界疫情最新情况安徽seo优化规则
  • php网站和java网站巨量引擎广告投放平台登录入口
  • 国外购买域名网站实时热榜
  • 政企网站建设濮阳网站推广
  • 专门做网站的郑州网站建设外包
  • 哪个网站可以做自由行地图指数基金怎么选
  • 灵宝网站建设网络营销工具有哪些?
  • 用记事本做网站怎么添加表格免费搭建个人网站
  • 天长网站建设搜索引擎优化的目的是对用户友好
  • 微网站平台微网站建设方案免费网站seo优化
  • 怎么做农家乐联盟网站成都网站优化及推广
  • 外链网站分类上海全网营销推广
  • 给博彩网站做推广犯法搜索引擎优化的实验结果分析
  • 北京网站开发招聘58网站排行榜前十名
  • 中山网站建设公司哪家好网站优化费用报价明细
  • 做网站公司起什么名字举三个成功的新媒体营销案例
  • 网站免费软件下载营销推广活动策划方案
  • django网站开发源代码百度在线翻译
  • 做厂家批发的网站马鞍山seo
  • 学网站开发容易吗宜昌seo
  • 电商出口营销要多少钱惠州seo怎么做
  • 网站优怎么做成都私人做网站建设
  • 网站开发项目经验和教训竞价推广外包托管
  • 外网常用网站有什么推广产品的渠道
  • 班级建设网站首页网站推广 方法