<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> 搜索框设计</ title> < link rel = " stylesheet" href = " ./style.css" >
</ head>
< body>
< div class = " search-overlay" > </ div>
< div class = " scroll-cont" > < div class = " content" > < div class = " search" > < div class = " search_bg" > </ div> < div class = " search_box" > < input type = " text" class = " search_input" placeholder = " Search" /> < div class = " search_line" > </ div> < div class = " search_close" > </ div> </ div> </ div> </ div>
</ div>
< script src = " ./script.js" > </ script>
</ body>
</ html>
( function ( ) { var $searchOverlay = document. querySelector ( ".search-overlay" ) ; var $search = document. querySelector ( ".search" ) ; var $clone, offsetX, offsetY; $search. addEventListener ( "click" , function ( ) { var $original = this ; $clone = this . cloneNode ( true ) ; $searchOverlay. classList. add ( "s--active" ) ; $clone. classList. add ( "s--cloned" , "s--hidden" ) ; $searchOverlay. appendChild ( $clone) ; var triggerLayout = $searchOverlay. offsetTop; var originalRect = $original. getBoundingClientRect ( ) ; var cloneRect = $clone. getBoundingClientRect ( ) ; offsetX = originalRect. left - cloneRect. left; offsetY = originalRect. top - cloneRect. top; $clone. style. transform = "translate(" + offsetX + "px, " + offsetY + "px)" ; $original. classList. add ( "s--hidden" ) ; $clone. classList. remove ( "s--hidden" ) ; var triggerLayout = $searchOverlay. offsetTop; $clone. classList. add ( "s--moving" ) ; $clone. setAttribute ( "style" , "" ) ; $clone. addEventListener ( "transitionend" , openAfterMove) ; } ) ; function openAfterMove ( ) { $clone. classList. add ( "s--active" ) ; $clone. querySelector ( "input" ) . focus ( ) ; addCloseHandler ( $clone) ; $clone. removeEventListener ( "transitionend" , openAfterMove) ; } ; function addCloseHandler ( $parent ) { var $closeBtn = $parent. querySelector ( ".search_close" ) ; $closeBtn. addEventListener ( "click" , closeHandler) ; } ; function closeHandler ( e ) { $clone. classList. remove ( "s--active" ) ; e. stopPropagation ( ) ; var $cloneBg = $clone. querySelector ( ".search_bg" ) ; $cloneBg. addEventListener ( "transitionend" , moveAfterClose) ; } ; function moveAfterClose ( e ) { e. stopPropagation ( ) ; $clone. classList. add ( "s--moving" ) ; $clone. style. transform = "translate(" + offsetX + "px, " + offsetY + "px)" ; $clone. addEventListener ( "transitionend" , terminateSearch) ; } ; function terminateSearch ( e ) { $search. classList. remove ( "s--hidden" ) ; $clone. remove ( ) ; $searchOverlay. classList. remove ( "s--active" ) ; } ; } ( ) ) ;
*, *:before, *:after {box-sizing: border-box;margin: 0;padding: 0;}html, body {height: 100%;background-image: url(https://source.unsplash.com/6ZZh8kOyW-4);background-size: cover;}.search-overlay {z-index: -1000;overflow: hidden;position: fixed;left: 0;top: 0;width: 100%;height: 100%;}.search-overlay.s--active {z-index: 9999;}.scroll-cont {position: relative;height: 100%;overflow-y: auto;}.content {padding: 50px;}.search {position: relative;margin: 0 auto 50px;width: 100px;height: 100px;perspective: 1000px;}.search:not(.s--active) {cursor: pointer;}.search.s--hidden {opacity: 0;}.search.s--cloned {position: absolute;left: 50%;top: 50%;right: auto;bottom: auto;margin-left: -58px;margin-top: -58px;margin-right: 0;margin-bottom: 0;}.search.s--moving {transition: transform 0.4s cubic-bezier(0.56, -0.49, 0.58, 0.9);}.search_bg {position: absolute;left: 50%;top: 50%;width: 100%;height: 100%;border-radius: 50%;background: rgba(236, 83, 83, 0.8);transition: all 0.6s ease;transform: translate3d(-50%, -50%, 0);will-change: transform;}.search.s--active .search_bg {transform: translate3d(-50%, -50%, 0) scale(48);}.search_box {position: absolute;left: 50%;top: 50%;width: 40px;height: 40px;border: 4px solid #fff;border-radius: 25px;transform: translate(-50%, -50%);transition: all 0.45s ease;}.search.s--active .search_box {width: 510px;height: 100px;border-radius: 50px;}.search_input {width: 100%;height: 100%;background: transparent;border: none;outline: none;pointer-events: none;opacity: 0;color: #fff;font-size: 40px;transition: opacity 0s;}.search_input::-moz-placeholder {color: rgba(255, 255, 255, 0.4);}.search_input:-ms-input-placeholder {color: rgba(255, 255, 255, 0.4);}.search_input::placeholder {color: rgba(255, 255, 255, 0.4);}.search.s--active .search_input {padding: 23px 90px 23px 40px;pointer-events: auto;opacity: 1;transition: opacity 0.18s 0.48s;}.search_line {position: absolute;left: 50%;top: 50%;width: 20px;height: 4px;border-radius: 2px;background: #fff;transform-origin: 0 50%;transform: translate(12px, 12px) rotate(45deg);transition: all 0.48s;}.search_line:before {content: "";position: absolute;left: 0;bottom: 0;width: inherit;height: inherit;background: inherit;border-radius: inherit;transform: rotate(90deg);opacity: 0;transition: opacity 0.3s;}.search.s--active .search_line:before {opacity: 1;transition: opacity 0.3s 0.42s;}.search.s--active .search_line {width: 36px;height: 6px;transform: translate(180px, 11px) rotate(-45deg);}.search_close {position: absolute;right: 0;top: 0;width: 30px;height: 30px;pointer-events: none;}.search.s--active .search_close {right: 44px;top: 33px;pointer-events: auto;cursor: pointer;}