一、引言

CSS 不可選中的應(yīng)用場(chǎng)景
在網(wǎng)頁(yè)開發(fā)等諸多場(chǎng)景中,我們常常會(huì)遇到需要讓某些元素不可被用戶選中的情況。比如說(shuō),一些網(wǎng)頁(yè)上的版權(quán)聲明內(nèi)容,這關(guān)乎著創(chuàng)作者的權(quán)益,為避免被隨意復(fù)制,就需要設(shè)置為不可選中;還有重要提示信息,防止用戶誤操作去選擇并復(fù)制它們,以免造成不必要的誤解或麻煩;另外像按鈕、導(dǎo)航鏈接這類特殊設(shè)計(jì)的文本元素,本身重點(diǎn)在于引導(dǎo)用戶去點(diǎn)擊操作,并不需要被選中,若能設(shè)置為不可選中,也會(huì)讓頁(yè)面交互邏輯更加清晰合理呢。再比如,當(dāng)我們精心設(shè)計(jì)了一個(gè)頁(yè)面的整體布局與樣式,不希望用戶隨意選中其中的文本元素而破壞了視覺(jué)上的和諧感時(shí),也可以運(yùn)用相關(guān)的 CSS 屬性來(lái)實(shí)現(xiàn)元素不可選中這一效果??傊?,CSS 不可選中這一特性在實(shí)際的網(wǎng)頁(yè)開發(fā)應(yīng)用中,有著各種各樣的用武之地,接下來(lái)咱們就一起看看具體是如何實(shí)現(xiàn)的吧。
二、user-select 屬性來(lái)幫忙
user-select 屬性的基礎(chǔ)介紹
在 CSS 中,要實(shí)現(xiàn)元素不可選中的效果,我們可以借助 “user-select” 這個(gè)屬性。它的主要作用就是控制用戶能否選擇元素中的文本內(nèi)容。這個(gè)屬性有幾個(gè)常見的值,比如說(shuō) “none”,它的意思就是用戶不能選擇元素中的任何內(nèi)容;“text” 呢,則表示用戶可以正常選擇元素中的文本;還有 “all”,當(dāng)設(shè)置為這個(gè)值時(shí),如果在編輯器內(nèi)雙擊或者上下文點(diǎn)擊發(fā)生在子元素上,那么該值的最高級(jí)祖先元素將被選中。此外,像 “element” 這個(gè)值(目前只有 IE 和 FF 支持),它表示文本可選,但僅限元素的邊界內(nèi)。不過(guò)要注意哦,在不同的瀏覽器中,對(duì)于這個(gè)屬性的支持可能會(huì)有所不同,所以為了確保兼容性,我們往往需要添加一些瀏覽器前綴,比如 “-webkit-”“-moz-”“-ms-” 等。
在元素樣式中直接應(yīng)用
接下來(lái),咱們看看怎么在實(shí)際中使用這個(gè)屬性。一種簡(jiǎn)單直接的方法就是在元素的樣式中直接添加 “user-select:none;”。這樣,這個(gè)段落中的文字就無(wú)法被用戶選中了。同樣的道理,如果是一個(gè)特定的 div 元素,也可以用類似的方式來(lái)設(shè)置。
通過(guò)類來(lái)應(yīng)用屬性
除了直接在元素樣式中設(shè)置,我們還可以通過(guò)定義一個(gè)類,然后在需要不可選中的元素上應(yīng)用這個(gè)類來(lái)實(shí)現(xiàn)。首先,在 CSS 文件中定義一個(gè)類通過(guò)這種方式,不僅方便對(duì)多個(gè)元素統(tǒng)一設(shè)置不可選中的樣式,而且如果以后需要修改這個(gè)樣式,只需要在 CSS 文件中修改類的定義就可以了,非常方便管理和維護(hù)。
三、兼容不同瀏覽器的寫法
針對(duì) WebKit 內(nèi)核瀏覽器
在網(wǎng)頁(yè)開發(fā)中,對(duì)于像 Safari 和 Chrome 這類基于 WebKit 內(nèi)核的瀏覽器來(lái)說(shuō),我們可以使用 “-webkit-user-select:none;” 這種寫法來(lái)實(shí)現(xiàn)元素不可選中的效果呀。比如說(shuō),當(dāng)我們?cè)陧?yè)面中有一些重要的提示文字,像是一些特定功能模塊的引導(dǎo)語(yǔ),又或者是頁(yè)面底部的版權(quán)相關(guān)聲明等內(nèi)容,不想讓用戶隨意選中復(fù)制時(shí),就可以在對(duì)應(yīng)的元素樣式中添加 “-webkit-user-select:none;”。這樣在 Safari 和 Chrome 瀏覽器中,這個(gè) div 元素里的文本就沒(méi)辦法被用戶選中了,很好地保護(hù)了版權(quán)內(nèi)容不被輕易復(fù)制。而且像一些頁(yè)面上的裝飾性文字元素,重點(diǎn)在于展示美觀,不需要用戶去選擇操作的,也可以通過(guò)這種方式來(lái)設(shè)置不可選中,讓頁(yè)面的交互邏輯和視覺(jué)呈現(xiàn)更加符合我們的預(yù)期哦。
多瀏覽器兼容代碼示例
在實(shí)際的網(wǎng)頁(yè)開發(fā)場(chǎng)景中,不同的用戶可能會(huì)使用各種各樣的瀏覽器來(lái)訪問(wèn)我們的頁(yè)面,所以為了確保元素在各個(gè)瀏覽器環(huán)境下都能實(shí)現(xiàn)不可選中的效果,我們需要寫出兼容多瀏覽器的代碼。以下就是一個(gè)常用的多瀏覽器兼容代碼在上述代碼中,“*” 代表著所有的 HTML 元素,通過(guò)添加 “-webkit-” 前綴,是為了兼容 WebKit 內(nèi)核瀏覽器(如 Safari 和 Chrome);“-moz-” 前綴則是針對(duì) Firefox 瀏覽器;“-ms-” 前綴對(duì)應(yīng)著 IE 以及 Edge 瀏覽器等;而最后的 “user-select: none;” 是標(biāo)準(zhǔn)的 CSS 屬性寫法,適用于大多數(shù)現(xiàn)代瀏覽器呢。比如說(shuō)我們開發(fā)了一個(gè)在線文檔閱讀的網(wǎng)頁(yè),頁(yè)面中有很多正文內(nèi)容、小標(biāo)題等元素,我們希望這些元素整體都不能被用戶選中,就可以把這段代碼添加到樣式表中,這樣不管用戶使用哪種主流瀏覽器來(lái)訪問(wèn)這個(gè)網(wǎng)頁(yè),文檔中的相關(guān)元素都不會(huì)被輕易選中啦,極大地保障了頁(yè)面內(nèi)容按照我們預(yù)設(shè)的交互邏輯來(lái)呈現(xiàn)給用戶哦。大家在實(shí)際操作的時(shí)候,可以根據(jù)具體的項(xiàng)目需求,靈活地把這段代碼應(yīng)用到相應(yīng)的元素或者整個(gè)頁(yè)面的樣式設(shè)置當(dāng)中去呢。
四、其他實(shí)現(xiàn)不可選中的間接方式
pointer-events 屬性
在 CSS 中,還有一種間接讓元素不可選中的方式,那就是通過(guò)設(shè)置 “pointer-events:none;” 屬性來(lái)實(shí)現(xiàn)哦?!皃ointer-events” 屬性主要用于定義元素是否對(duì)指針事件做出反應(yīng)呀,當(dāng)我們把它的值設(shè)為 “none” 時(shí),就相當(dāng)于阻止了該元素的鼠標(biāo)事件。舉個(gè)例子來(lái)說(shuō),如果頁(yè)面中有個(gè)鏈接元素,我們不想讓用戶點(diǎn)擊它,也不想讓它被選中像這樣設(shè)置之后,不僅鼠標(biāo)點(diǎn)擊這個(gè)鏈接不會(huì)有反應(yīng)了,而且從間接的角度來(lái)講,因?yàn)闊o(wú)法觸發(fā)鼠標(biāo)相關(guān)操作了,也就沒(méi)辦法去選中這個(gè)元素里面的內(nèi)容啦。不過(guò)要注意哦,使用這種方式是存在一定 “副作用” 的呢,它不僅僅是讓元素不可選中了,而是把其他的鼠標(biāo)交互操作也一并阻止了呀,比如正常的點(diǎn)擊等操作都會(huì)失效。所以在實(shí)際應(yīng)用中,大家需要根據(jù)具體的頁(yè)面功能需求,謹(jǐn)慎地去選擇使用這種方式哦,要權(quán)衡好它帶來(lái)的影響和咱們想要實(shí)現(xiàn)的最終效果呢。
針對(duì)特定標(biāo)簽的處理
對(duì)于像 input、textarea 這些特定的標(biāo)簽,我們可以利用它們自身的一些屬性來(lái)達(dá)到阻止用戶編輯和選中內(nèi)容的目的哦。比如 “readonly” 屬性呀,拿 input 標(biāo)簽舉例,當(dāng)我們?cè)O(shè)置 <input type="text" readonly="readonly"> 時(shí),這個(gè)輸入框里的內(nèi)容用戶是沒(méi)辦法進(jìn)行修改的了,并且用戶可以通過(guò) Tab 鍵切換到該控件,還能夠選取或者復(fù)制其中的內(nèi)容呢。在 textarea 標(biāo)簽中也是類似的道理,設(shè)置了 “readonly” 屬性后,文本區(qū)域變?yōu)橹蛔x狀態(tài),無(wú)法修改內(nèi)容,但可以進(jìn)行選取、復(fù)制等操作哦。還有 “disabled” 屬性,當(dāng)給 input 或者 textarea 標(biāo)簽設(shè)置了 “disabled” 屬性后,像 <input type="text" disabled="disabled"> 或者 <textarea disabled> </textarea> 這樣,被禁用的文本區(qū)域既不可用,文本也不可選擇,更不能被復(fù)制啦,而且文本內(nèi)容還會(huì)變?yōu)榛疑兀O(shè)置樣式可能也無(wú)效哦。不過(guò)要留意的是,設(shè)置為 “disabled” 時(shí),當(dāng)提交表單時(shí),這個(gè)表單輸入項(xiàng)將不會(huì)被提交;而設(shè)置為 “readonly” 時(shí),表單輸入項(xiàng)是會(huì)被提交的喲。這些針對(duì)特定標(biāo)簽使用 “readonly” 或 “disabled” 屬性的方法,雖然能夠?qū)崿F(xiàn)阻止編輯和選中內(nèi)容的效果,但會(huì)改變?cè)卦械耐庥^和行為特點(diǎn),所以也要根據(jù)實(shí)際的使用場(chǎng)景,合理地去運(yùn)用它們哦,像是一些只用于展示固定內(nèi)容、不需要用戶操作的輸入框或者文本區(qū)域,就可以考慮使用這些屬性來(lái)實(shí)現(xiàn)不可編輯、不可選中的效果呢。
五、使用注意事項(xiàng)
無(wú)法完全阻止獲取文本
雖然我們可以利用諸如 “user-select:none;” 等 CSS 屬性以及相關(guān)的方法來(lái)禁止用戶通過(guò)選擇、復(fù)制等常規(guī)操作獲取文本內(nèi)容,但大家要清楚的是,這并不能做到完全阻止文本內(nèi)容被獲取哦。一些熟悉網(wǎng)頁(yè)技術(shù)的用戶,他們完全可以通過(guò)查看網(wǎng)頁(yè)源代碼的方式來(lái)獲取其中的文本呀。比如說(shuō),在瀏覽器中按下相應(yīng)的快捷鍵(像在很多瀏覽器中按 F12 鍵就能調(diào)出開發(fā)者工具查看源代碼),就能輕松看到那些原本設(shè)置為不可選中元素中的文本內(nèi)容了。再或者,有的用戶還會(huì)借助一些第三方的網(wǎng)頁(yè)抓取工具等,繞開頁(yè)面上設(shè)置的不可選中限制來(lái)獲取文本信息呢。所以呀,這些 CSS 實(shí)現(xiàn)不可選中的方法只是在一定程度上、針對(duì)普通用戶常規(guī)交互操作起到限制作用,開發(fā)者們要知曉其存在這樣的局限性哦。
對(duì)用戶體驗(yàn)的影響
限制元素不可選中,其實(shí)是一把 “雙刃劍”,在帶來(lái)諸如保護(hù)版權(quán)、防止誤操作等好處的同時(shí),也可能會(huì)對(duì)用戶與頁(yè)面內(nèi)容交互的體驗(yàn)產(chǎn)生影響呢。想象一下,當(dāng)用戶在瀏覽一個(gè)在線的資訊網(wǎng)頁(yè),看到了很感興趣的內(nèi)容想選取部分文字進(jìn)行記錄或者分享,結(jié)果發(fā)現(xiàn)怎么都選不中文字,那必然會(huì)感到很困擾呀,甚至可能會(huì)覺(jué)得這個(gè)網(wǎng)頁(yè)不太友好,從而降低對(duì)整個(gè)網(wǎng)站的好感度呢。又比如在一些學(xué)術(shù)資料頁(yè)面,如果重要的參考文獻(xiàn)內(nèi)容也被設(shè)置為不可選中,會(huì)阻礙正常的學(xué)術(shù)研究交流過(guò)程中資料的引用等操作哦。所以呢,開發(fā)者們?cè)谑褂?CSS 不可選中相關(guān)屬性和方法時(shí),一定要根據(jù)實(shí)際情況去合理使用呀,要權(quán)衡好內(nèi)容保護(hù)和用戶良好體驗(yàn)之間的關(guān)系,避免過(guò)度限制導(dǎo)致不好的使用感受,盡量在保障關(guān)鍵信息安全的同時(shí),也能讓用戶順暢地與頁(yè)面進(jìn)行交互哦。