在react項(xiàng)目中操作圖片(放大縮小旋轉(zhuǎn)拖拽)

前言:昨天下午老大突然對(duì)我說(shuō)有這樣的一個(gè)需求可以對(duì)圖片進(jìn)行放大縮小旋轉(zhuǎn)拖拽的效果讓我進(jìn)行修改雅潭,沒(méi)有修改的時(shí)候是只有一張圖片拓售。當(dāng)聽(tīng)到這個(gè)需求的時(shí)候心里一頓慌啊,既然任務(wù)已經(jīng)下達(dá)那只有完成了然后我就在百度一頓搜啊幸好還是找到了類似的素材咧七,接下來(lái)就是瘋狂的修改源代碼直到是我們想要的效果汁讼。今天是周六為什么今天來(lái)發(fā)表這個(gè)技術(shù)點(diǎn)呢因?yàn)樽蛱鞗](méi)什么時(shí)間因?yàn)橐恢痹谂@個(gè)需求今天有時(shí)間我這個(gè)人啊不上班難受(可能是因?yàn)閱紊硭詿o(wú)聊)所以今天就來(lái)分享一波唁情。


原圖

上面這個(gè)是原圖是一個(gè)模態(tài)框梧税,可以看出只有一張圖片沒(méi)有任何其他的操作占业,修改之后的圖片是這樣的


修改之后的圖片

大家可以看到并沒(méi)有太大的差別只是多了幾個(gè)小圖片而已帽蝶,確實(shí)沒(méi)什么太大的差別主要是加了實(shí)現(xiàn)的功能赦肋。


源代碼示意圖

<Modal

??????????className='upload-more-modal-box'

??????????width='4.5rem'

??????????footer={null}

??????????visible={previewImg}

??????????onCancel={this.handleCancel}

??????????style={{?boxShadow:?'0px?0px?5px?0px?rgba(190,190,190,0.5)'?}}

??????????maskStyle={{?background:?'rgba(0,0,0,0.5)'?}}

????????>

??????????{/*?<div?className='preview_pic_wrapper'>

????????????<img?alt=''?src={previewImgUrl}?/>

??????????</div>?*/}

??????????<div?style={{?overflow:?'hidden'?}}?className='imgbox'>

????????????<img

??????????????draggable

??????????????onMouseDown={this.moveImg}

??????????????alt=''

??????????????src={previewImgUrl}

??????????????ref={this.imgstyle}

??????????????style={{?transform:?'rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')',?left:?this.state.x?+?'px',?top:?this.state.y?+?'px'?}}

????????????/>

??????????</div>

??????????<div?className='actionimgbtn'>

????????????<img?src={leftrotate}?alt='leftrotateimg'?onClick={this.rotateleft}/>

????????????<img?src={rightrotate}?alt='rightrotateimg'?onClick={this.rotateright}/>

????????????<img?src={changebig}?alt='changebigimg'?onClick={this.showbig}/>

????????????<img?src={changesmall}?alt='changesmallimg'?onClick={this.showmin}/>

??????????</div>

????????</Modal>

每一個(gè)圖標(biāo)上都綁定了一個(gè)事件用來(lái)對(duì)圖片進(jìn)行操作

1.向左旋轉(zhuǎn)


向左旋轉(zhuǎn)的事件

//?逆時(shí)針旋轉(zhuǎn)

??rotateleft?=?()?=>?{

????const?{?R,?SS?}?=?this.state

????this.setState({?R:?R?-?90?})

????this.imgstyle.current!.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

??}

2.向右旋轉(zhuǎn)


向右旋轉(zhuǎn)的事件

//?順時(shí)針旋轉(zhuǎn)

??rotateright?=?()?=>?{

????const?{?R,?SS?}?=?this.state

????this.setState({?R:?R?+?90?})

????this.imgstyle.current!.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

??}

3.放大


放大的事件

//?放大

??showbig?=?()?=>?{

????const?{?S,?i,?SS,?R?}?=?this.state

????if?(i?>=?0)?{

??????this.setState({

????????S:?S?+?1,

????????i:?i?+?1,

????????SS:?1?*?(S?+?1)

??????})

????}?else?{

??????this.setState({

????????S:?S?-?1,

????????i:?i?+?1,

????????SS:?1?/?(S?-?1)

??????})

????}

????this.imgstyle.current!.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

??}

4.縮小


縮小的事件

?//?縮小

??showmin?=?()?=>?{

????const?{?S,?i,?SS,?R?}?=?this.state

????if?(i?<=?0)?{

??????this.setState({

????????S:?S?+?1,

????????i:?i?-?1,

????????SS:?1?/?(S?+?1)

??????})

????}?else?{

??????this.setState({

????????S:?S?-?1,

????????i:?i?-?1,

????????SS:?1?*?(S?-?1)

??????})

????}

????this.imgstyle.current!.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

??}

5.對(duì)圖片可以進(jìn)行拖拽


拖拽的事件

?//?拖拽

??moveImg?=?(ev:?any)?=>?{

????const?{?x,?y?}?=?this.state

????ev.preventDefault()

????var?disx?=?ev.pageX?-?x

????var?disy?=?ev.pageY?-?y

????document.onmousemove?=?(ev:?any)?=>?{

??????this.setState({

????????x:?ev.pageX?-?disx,

????????y:?ev.pageY?-?disy

??????})

????}

????document.onmouseup?=?()?=>?{

??????document.onmousemove?=?null

??????document.onmousedown?=?null

????}

??}

接下來(lái)說(shuō)明一下細(xì)節(jié)問(wèn)題我們需要在constructor中定義需要用到的變量的初始值

this.state?=?{

??????R:?0,

??????S:?1,

??????i:?0,

??????SS:?1,

??????x:?0,

??????y:?0

????}

R: 我們做旋轉(zhuǎn)操作的時(shí)候旋轉(zhuǎn)參數(shù)

SS:我們做放大縮小操作的時(shí)候的參數(shù)

x,y:我們做拖拽的操作的時(shí)候的參數(shù)

我們做的這些動(dòng)畫(huà)采用的是css3励稳,原來(lái)就是改變參數(shù)來(lái)控制效果

接下來(lái)我們來(lái)說(shuō)明一下這個(gè)我們想要控制img身上的東西就要加一個(gè)ref然后需要在前面聲明一下


聲明ref勇于控制img
綁定

我們發(fā)現(xiàn)每一個(gè)方法里面都有?

this.imgstyle.current!.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

在這個(gè)里面我們采用了ts類型斷言要不然會(huì)報(bào)這樣的錯(cuò)誤


錯(cuò)誤示例

使用類型斷言之前的代碼是這樣的而且style下面還有一個(gè)錯(cuò)誤的紅線采用類型斷言之后完美的解決了這個(gè)問(wèn)題類型斷言的代表就是一個(gè)感嘆號(hào)和一個(gè)點(diǎn)(!.)

this.imgstyle.style.transform?=?'translate(-50%?,-50%)?rotate('?+?R?+?'deg)?scale('?+?SS?+?','?+?SS?+?')'

關(guān)于對(duì)圖片進(jìn)行操作的今天就分享到這里如果有什么不懂的歡迎回帖也可以聯(lián)系本人微信:13014621624佃乘,我不會(huì)告訴你們微信號(hào)就是我本人手機(jī)號(hào)的,如果大家有什么更好的解決辦法歡迎回帖趣避,希望這篇文章能夠幫到你們。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末新翎,一起剝皮案震驚了整個(gè)濱河市鹅巍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌料祠,老刑警劉巖骆捧,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異髓绽,居然都是意外死亡敛苇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)顺呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枫攀,“玉大人,你說(shuō)我怎么就攤上這事株茶±凑牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵启盛,是天一觀的道長(zhǎng)蹦掐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)僵闯,這世上最難降的妖魔是什么卧抗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮鳖粟,結(jié)果婚禮上社裆,老公的妹妹穿的比我還像新娘。我一直安慰自己向图,他們只是感情好泳秀,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布标沪。 她就那樣靜靜地躺著,像睡著了一般嗜傅。 火紅的嫁衣襯著肌膚如雪谨娜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天磺陡,我揣著相機(jī)與錄音趴梢,去河邊找鬼。 笑死币他,一個(gè)胖子當(dāng)著我的面吹牛坞靶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝴悉,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼彰阴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拍冠?” 一聲冷哼從身側(cè)響起尿这,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庆杜,沒(méi)想到半個(gè)月后射众,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晃财,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年叨橱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断盛。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罗洗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钢猛,到底是詐尸還是另有隱情伙菜,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布命迈,位于F島的核電站贩绕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躺翻。R本人自食惡果不足惜丧叽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望公你。 院中可真熱鬧,春花似錦假瞬、人聲如沸陕靠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪芥。三九已至垄开,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間税肪,已是汗流浹背溉躲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留益兄,地道東北人锻梳。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像净捅,于是被迫代替她去往敵國(guó)和親疑枯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容