這篇文章將為大家詳細(xì)講解有關(guān)利用HTML5的details, summary怎么實(shí)現(xiàn)各種交互效果,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、瑞麗網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、瑞麗網(wǎng)絡(luò)營銷、瑞麗企業(yè)策劃、瑞麗品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供瑞麗建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
本文利用的是HTML5 details, summary
首先
一、了解HTML5 details, summary默認(rèn)交互行為
這是摘要1
這里具體描述,標(biāo)簽相對隨意,例如這里使用的<p>標(biāo)簽。
結(jié)果UI表現(xiàn)為:
具體描述為:
1、只顯示了 默認(rèn)隱藏了; 2、 小三角圖形的隱喻是:我是可點(diǎn)擊的,點(diǎn)擊我可能會(huì)出現(xiàn)寶箱。 OK,我們不妨就點(diǎn)擊一下,結(jié)果如下圖: 具體描述為: 原本隱藏的 標(biāo)簽顯示出來了; 此時(shí)我們再一次點(diǎn)擊, 標(biāo)簽內(nèi)容又會(huì)隱藏收起,箭頭方向還原,如下圖: 活脫脫一個(gè)天然的展開收起效果。 通過在 結(jié)果如下截圖: 如果我們使用JS腳本手動(dòng)移除這個(gè)open屬性,即使沒有點(diǎn)擊行為的發(fā)生,我們內(nèi)容也會(huì)收起。 如果<summary>缺省,則會(huì)自動(dòng)補(bǔ)上,文案是“詳細(xì)信息”。 結(jié)果如下截圖所示: 二、details瀏覽器內(nèi)置UI可以自定義 案例1:小三角右側(cè)顯示同時(shí)顏色變淡 HTML代碼如下: CSS如下: 結(jié)果如下圖所示: 當(dāng)我們點(diǎn)擊摘要標(biāo)題升起的時(shí)候,表現(xiàn)為下圖(截自Firefox): 而實(shí)際上實(shí)際開發(fā)的時(shí)候,對小三角UI更便捷的定制方法是:隱藏瀏覽器原生的小三角,然后借助::before或::after偽元素重新生成我們想要的UI效果,下面這個(gè)案例就將展示相關(guān)的處理。 案例2:隱藏瀏覽器原生的小三角并使用自定義三角替換 HTML結(jié)構(gòu)還是類似的: CSS主要分為2部分,一部分是隱藏瀏覽器原生的小三角,另外一部分是使用偽元素生成自定義的三角效果。 首先看一下隱藏 可以看到Chrome瀏覽器和Firefox瀏覽器的小三角隱藏采用的是不同的策略。在Chrome瀏覽器下,我們可以直接設(shè)置display:none進(jìn)行隱藏,但是這一招在Firefox瀏覽器下確實(shí)沒有效果的,即使設(shè)置display:none!important也是如此,根據(jù)我的測試,只有font-size:0能夠比較完美的隱藏。類似position:absolute;visibility:hidden這種常見的隱藏也是不行的,因?yàn)閜osition:absolute無法生效。 然后是自定義小三角顯示的CSS,這里采用的是::after偽元素模擬的: 最終效果如下圖所示: 收起時(shí)候: 最后有一點(diǎn)需要注意一下,就是如果 三、Chrome瀏覽器下點(diǎn)擊時(shí)候outline輪廓等體驗(yàn)處理 UI可以定制了,但是還有個(gè)不容忽視的體驗(yàn)問題,那就是在Chrome瀏覽器下點(diǎn)擊時(shí)候會(huì)出現(xiàn)outline輪廓,如下圖所示: 在實(shí)際項(xiàng)目開發(fā)的時(shí)候,產(chǎn)品和設(shè)計(jì)一定會(huì)讓你把這個(gè)效果去掉的。以及,當(dāng)我們 阻止文本選中,我們可以: 對于outline輪廓,比較直接的做法是: 但是這樣處理對無障礙訪問而是非常不友好的,那有沒有什么辦法兼顧視覺體驗(yàn)和無障礙訪問體驗(yàn)?zāi)兀?/p> 我的做法是這樣子的: 瀏覽器對標(biāo)簽元素的outline輪廓進(jìn)行了專門的體驗(yàn)優(yōu)化處理,鼠標(biāo)點(diǎn)擊的時(shí)候不顯示輪廓,鍵盤訪問時(shí)候顯示輪廓。于是我們可采用李代桃僵策略,讓 CSS如下: 此時(shí),在Chrome瀏覽器下,我們點(diǎn)擊摘要信息,沒有任何 輪廓區(qū)域比原生的 接下來,我們按下Space空格鍵,就會(huì)發(fā)現(xiàn) 然后上面實(shí)現(xiàn)并不完美,相比原生的 對于 如果想要同時(shí)支持回車鍵展開與收起,可以對HTML如下處理: 需要注意的是上面處理在 JS捕獲鍵盤行為手動(dòng)設(shè)置outline 這個(gè)方法不需要對HTML進(jìn)行任何的改動(dòng),是通過CSS和JS配合對全局的 CSS如下: JS如下: 只要把上面的CSS和JS復(fù)制到頁面中,視覺體驗(yàn)和交互體驗(yàn)完美支持的 表現(xiàn)為,點(diǎn)擊 例如下圖就是鍵盤Tab鍵 每每看到如此極致的用戶體驗(yàn)處理,心情都大好。 原理: 四、基于details元素行為的各種交互效果案例 了解了 實(shí)現(xiàn)最終效果如下gif: 因?yàn)椤案唷痹厥窃诘撞?,因此效果?shí)現(xiàn)的要點(diǎn)的所有的內(nèi)容信息都放在 HTML和CSS代碼如下,其中,最核心部分已經(jīng)紅色高亮: 據(jù)臺(tái)媒報(bào)道,大...青睞。
其他幾首歌曲...展開與收起是通過open屬性控制的
這是摘要2
標(biāo)簽如果缺省,則
元素會(huì)在內(nèi)部自動(dòng)創(chuàng)建一個(gè)
內(nèi)容,默認(rèn)的文案是“詳細(xì)信息”。如下HTML代碼:這是示例1
.details-1 summary {
width: -moz-fit-content;
width: fit-content;
direction: rtl;
}
.details-1 ::-webkit-details-marker {
direction: ltr;
color: gray;
margin-left: .5ch;
}
.details-1 ::-moz-list-bullet {
direction: ltr;
color: gray;
margin-left: .5ch;
}
這是示例2
/* 隱藏默認(rèn)三角 */
.details-2 ::-webkit-details-marker {
display: none;
}
.details-2 ::-moz-list-bullet {
font-size: 0;
}
/* 自定義的三角 */
.details-2 summary::after {
content: '';
position: absolute;
width: 1em; height: 1em;
margin: .2em 0 0 .5ch;
background: url(./arrow-on.svg) no-repeat;
background-size: 100% 100%;
transition: transform .2s;
}
.details-2:not([open]) summary::after {
margin-top: .25em;
transform: rotate(90deg);
}
元素,則我們的對三角的自定義代碼都是無效的,可以使用一個(gè)空的
元素占位,類似這樣:
summary {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
summary {
outline: 0;
}
這是示例
summary {
user-select: none;
outline: 0;
}
summary a {
color: inherit;
}
outline
輪廓出現(xiàn);但是當(dāng)我們使用Tab鍵索引時(shí)候,可以看到下圖所示的輪廓效果:標(biāo)簽,其瀏覽器行為只能通過回車鍵觸發(fā),空格鍵是無效的;但是對于
,回車鍵和空格鍵都能觸發(fā)展開收起行為,這就是為什么上面代碼空格鍵有效,回車鍵無效的原因。這是示例
summary {
user-select: none;
outline: 0;
}
summary[focus] {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
window.addEventListener('keydown', function () {
window.isKeyEvent = true;
setTimeout(function () {
window.isKeyEvent = false;
}, 100);
});
document.addEventListener('focusin', function (event) {
var target = event.target;
if (target && target.tagName.toLowerCase() == 'summary' && window.isKeyEvent == true) {
target.setAttribute('focus', '');
}
});
document.addEventListener('focusout', function (event) {
var eleFocusAll = document.querySelectorAll('summary[focus]');
[].slice.call(eleFocusAll).forEach(function (summary) {
summary.removeAttribute('focus');
});
});
focus
后回車后的效果:
關(guān)鍵是全局監(jiān)聽keydown事件,如果有發(fā)生,則認(rèn)為此100毫秒內(nèi)的頁面focus行為均是鍵盤產(chǎn)生,從而有效區(qū)分是點(diǎn)擊觸發(fā)的focus行為還是鍵盤觸發(fā)的focus行為,如果是鍵盤觸發(fā),給案例1:“更多”展開與收起效果
把“更多”對應(yīng)的信息放在.more元素內(nèi),然后通過[open]屬性選擇器控制器顯示,效果即達(dá)成。
效果如下gif:
沒有任何JS參與。HTML結(jié)構(gòu)如下:
我的消息
然后CSS讓.box元素絕對定位即可,顯示和隱藏
此效果常見于條目比較多的垂直導(dǎo)航欄,新聞條目等。
例如下面實(shí)現(xiàn)的效果:
這個(gè)更加簡單了,就是一堆
關(guān)注中心 關(guān)注的商品 ......
計(jì)算CSS沒有任何設(shè)置,效果也天然達(dá)成。
案例3中的展開項(xiàng)顯示的時(shí)候是非常生硬的突然顯示,實(shí)際上我們可以借助一些選擇器技巧以及CSS3 transition
屬性讓菜單展開收起的時(shí)候是有動(dòng)畫效果的,效果如下gif截圖:
此效果實(shí)現(xiàn)原理核心是[open]
屬性選擇器,和加號+
相鄰兄弟選擇器。
首先看下HTML,展開列表結(jié)構(gòu)發(fā)生了變化,不是作為
的子元素,而是作為其相鄰兄弟元素存在,HTML示意:
...訂單中心
上面
details + dl { max-height: 0; transition: max-height .25s; overflow: hidden; } [open] + dl { max-height: 100px; }
借助相鄰兄弟選擇器以及max-height任意元素slideUp/slideDown技術(shù)就可以效果達(dá)成。
這里的樹形菜單效果實(shí)現(xiàn)也很簡單,多個(gè)
元素相互嵌套就可以,效果Gif如下:
HTML結(jié)構(gòu)大致如下:
我的視頻
爆肝工程師的異世界狂想曲
tv1-720p.mp4tv2-720p.mp4...tv10-720p.mp4七大罪
七大罪B站00合集.mp4珍藏動(dòng)漫網(wǎng)盤地址.txt我們的小美好.mp4
CSS的主要工作就是繪制菜單前面的加號和減號圖形,例如我們可以借助background線性漸變,相關(guān)CSS如下:
details { padding-left: 20px; } summary::before { content: ''; display: inline-block; width: 12px; height: 12px; border: 1px solid #999; background: linear-gradient(to right, #999, #999) no-repeat center, linear-gradient(to top, #999, #999) no-repeat center; background-size: 2px 10px, 10px 2px; vertical-align: -2px; margin-right: 6px; margin-left: -20px; } [open] > summary::before { background: linear-gradient(to right, #999, #999) no-repeat center; background-size: 10px 2px; }
效果即達(dá)成!
五、如果只想要details/summary的語義不要行為
如果只想要元素的語義,但是并不需要點(diǎn)擊展開收起的行為,該怎么處理呢?
例如,某評論,或者某帖子有標(biāo)題和正文,非常符合詳情-概要-內(nèi)容的語義,但是希望是純展示的,點(diǎn)擊時(shí)候不收起,可以這么處理:
1.標(biāo)簽設(shè)置tabindex="-1"讓鍵盤無法訪問;
2.設(shè)置CSS:
summary { outline: 0; pointer-events: none; }
這樣就不能點(diǎn),也不會(huì)有outline輪廓。
六、兼容性以及Polyfill
兼容性如下圖:
除了IE和Edge瀏覽器,大好河山一片綠,至少移動(dòng)端可以用得比較開心。
如果想要在桌面web網(wǎng)頁使用
對鍵盤訪問,事件toggle都做了兼容。
如果開發(fā)策略是對不支持的IE進(jìn)行特異處理,則下面的JS判斷是否支持
var isSupportDetails = 'open' in document.createElement('details');
最后,無JS實(shí)現(xiàn)的好處有:
省了代碼,加載快了;
實(shí)現(xiàn)更簡單了,開發(fā)快了;
JS還沒加載交互也能進(jìn)行,體驗(yàn)好了;
鍵盤無障礙和aria閱讀設(shè)備無障礙天然支持,體驗(yàn)檔次高了。
關(guān)于利用HTML5的details, summary怎么實(shí)現(xiàn)各種交互效果就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。