.gdpr{position: fixed; top: 0; bottom: 0; left: 0; right: 0; background: rgba(0, 0, 0, 0.7);color: #333;z-index:9999999;line-height:1.3;height: 100vh;width: 100vw} .gdpr_w{padding: 2rem;background: #fff;max-width: 700px;width: 95%;margin: 5% auto;text-align: center;position:fixed;left: 0;right: 0;margin:10% auto;} .gdpr_t{margin-bottom:15px;} .gdpr_t h3{font-size: 30px;margin:0px 0 10px 0;} .gdpr_t p{font-size: 16px;line-height: 1.45;margin:0;} .gdpr_x {position: absolute; right: 24px; top: 16px; cursor:pointer;} .gdpr_yn{margin-top:10px;} .gdpr_yn form{display: inline;} .gdpr_yn button{background: #37474F;border: none;color: #fff;padding: 8px 30px;font-size: 13px;margin: 0 3px;} .gdpr_yn .gdpr_n{background: #fff;color: #222;border: 1px solid #999;} amp-consent{margin-left: 10px;top: 2px;width: auto;background: transparent;} .gdpr_fmi{ width:100%; font-size: 15px; line-height: 1.45; margin: 0; } #footer .gdpr_fmi span, .gdpr_fmi span { display: inline-block; } #footer .gdpr_fmi a{ color: #005be2; } @media(max-width:768px){ .gdpr_w{width: 85%;margin:0 auto;padding:1.5rem;} } @media(max-width:700px){ .gdpr_w{margin:0 auto; width: 85%;} } .gdpr_fmi a:before{ display:none; } .gdpr_w{width:100%;} .f-w-f2 { padding: 50px 0px; } footer amp-consent.amp-active { z-index:9999; display: initial; position: inherit; height:20px; width:100%; } body[class*="amp-iso-country-"] .amp-active{ display: contents; } #post-consent-ui { position: fixed; z-index: 9999; left: 45%; margin-top: 10px; top: 0; } @font-face { font-family: Poppins;font-display: optional;font-style: normal;font-weight: 400;src: local('Poppins Regular '), local('Poppins-Regular'), url(https://fonts.gstatic.com/s/poppins/v13/pxiEyp8kv8JHgFVrFJDUc1NECPY.ttf);}@font-face { font-family: Poppins;font-display: optional;font-style: normal;font-weight: 500;src: local('Poppins Medium '), local('Poppins-Medium'), url(https://fonts.gstatic.com/s/poppins/v13/pxiByp8kv8JHgFVrLGT9V1tvFP-KUEg.ttf);}@font-face { font-family: Poppins;font-display: optional;font-style: normal;font-weight: 700;src: local('Poppins Bold '), local('Poppins-Bold'), url(https://fonts.gstatic.com/s/poppins/v13/pxiByp8kv8JHgFVrLCz7V1tvFP-KUEg.ttf);}a.heateor_sss_amp{padding:0 4px}div.heateor_sss_horizontal_sharing a amp-img{display:inline-block}.heateor_sss_amp_instagram img{background-color:#624E47}.heateor_sss_amp_yummly img{background-color:#E16120}.heateor_sss_amp_youtube img{background-color:#ff0000}.heateor_sss_amp_buffer img{background-color:#000}.heateor_sss_amp_delicious img{background-color:#53BEEE}.heateor_sss_amp_facebook img{background-color:#3C589A}.heateor_sss_amp_digg img{background-color:#006094}.heateor_sss_amp_email img{background-color:#649A3F}.heateor_sss_amp_float_it img{background-color:#53BEEE}.heateor_sss_amp_linkedin img{background-color:#0077B5}.heateor_sss_amp_pinterest img{background-color:#CC2329}.heateor_sss_amp_print img{background-color:#FD6500}.heateor_sss_amp_reddit img{background-color:#FF5700}.heateor_sss_amp_stocktwits img{background-color:#40576F}.heateor_sss_amp_mewe img{background-color:#007da1}.heateor_sss_amp_mix img{background-color:#ff8226}.heateor_sss_amp_tumblr img{background-color:#29435D}.heateor_sss_amp_twitter img{background-color:#55acee}.heateor_sss_amp_vkontakte img{background-color:#5E84AC}.heateor_sss_amp_yahoo img{background-color:#8F03CC}.heateor_sss_amp_xing img{background-color:#00797D}.heateor_sss_amp_instagram img{background-color:#527FA4}.heateor_sss_amp_whatsapp img{background-color:#55EB4C}.heateor_sss_amp_aim img{background-color:#10ff00}.heateor_sss_amp_amazon_wish_list img{background-color:#ffe000}.heateor_sss_amp_aol_mail img{background-color:#2A2A2A}.heateor_sss_amp_app_net img{background-color:#5D5D5D}.heateor_sss_amp_baidu img{background-color:#2319DC}.heateor_sss_amp_balatarin img{background-color:#fff}.heateor_sss_amp_bibsonomy img{background-color:#000}.heateor_sss_amp_bitty_browser img{background-color:#EFEFEF}.heateor_sss_amp_blinklist img{background-color:#3D3C3B}.heateor_sss_amp_blogger_post img{background-color:#FDA352}.heateor_sss_amp_blogmarks img{background-color:#535353}.heateor_sss_amp_bookmarks_fr img{background-color:#E8EAD4}.heateor_sss_amp_box_net img{background-color:#1A74B0}.heateor_sss_amp_buddymarks img{background-color:#ffd400}.heateor_sss_amp_care2_news img{background-color:#6EB43F}.heateor_sss_amp_citeulike img{background-color:#2781CD}.heateor_sss_amp_comment img{background-color:#444}.heateor_sss_amp_diary_ru img{background-color:#E8D8C6}.heateor_sss_amp_diaspora img{background-color:#2E3436}.heateor_sss_amp_dihitt img{background-color:#FF6300}.heateor_sss_amp_diigo img{background-color:#4A8BCA}.heateor_sss_amp_douban img{background-color:#497700}.heateor_sss_amp_draugiem img{background-color:#ffad66}.heateor_sss_amp_dzone img{background-color:#fff088}.heateor_sss_amp_evernote img{background-color:#8BE056}.heateor_sss_amp_facebook_messenger img{background-color:#0084FF}.heateor_sss_amp_fark img{background-color:#555}.heateor_sss_amp_fintel img{background-color:#087515}.heateor_sss_amp_flipboard img{background-color:#CC0000}.heateor_sss_amp_folkd img{background-color:#0F70B2}.heateor_sss_amp_google_classroom img{background-color:#FFC112}.heateor_sss_amp_google_bookmarks img{background-color:#CB0909}.heateor_sss_amp_google_gmail img{background-color:#E5E5E5}.heateor_sss_amp_hacker_news img{background-color:#F60}.heateor_sss_amp_hatena img{background-color:#00A6DB}.heateor_sss_amp_instapaper img{background-color:#EDEDED}.heateor_sss_amp_jamespot img{background-color:#FF9E2C}.heateor_sss_amp_kakao img{background-color:#FCB700}.heateor_sss_amp_kik img{background-color:#2A2A2A}.heateor_sss_amp_kindle_it img{background-color:#2A2A2A}.heateor_sss_amp_known img{background-color:#fff101}.heateor_sss_amp_line img{background-color:#00C300}.heateor_sss_amp_livejournal img{background-color:#EDEDED}.heateor_sss_amp_mail_ru img{background-color:#356FAC}.heateor_sss_amp_mendeley img{background-color:#A70805}.heateor_sss_amp_meneame img{background-color:#FF7D12}.heateor_sss_amp_mixi img{background-color:#EDEDED}.heateor_sss_amp_myspace img{background-color:#2A2A2A}.heateor_sss_amp_netlog img{background-color:#2A2A2A}.heateor_sss_amp_netvouz img{background-color:#c0ff00}.heateor_sss_amp_newsvine img{background-color:#055D00}.heateor_sss_amp_nujij img{background-color:#D40000}.heateor_sss_amp_odnoklassniki img{background-color:#F2720C}.heateor_sss_amp_oknotizie img{background-color:#fdff88}.heateor_sss_amp_outlook_com img{background-color:#0072C6}.heateor_sss_amp_papaly img{background-color:#3AC0F6}.heateor_sss_amp_pinboard img{background-color:#1341DE}.heateor_sss_amp_plurk img{background-color:#CF682F}.heateor_sss_amp_pocket img{background-color:#f0f0f0}.heateor_sss_amp_polyvore img{background-color:#2A2A2A}.heateor_sss_amp_printfriendly img{background-color:#61D1D5}.heateor_sss_amp_protopage_bookmarks img{background-color:#413FFF}.heateor_sss_amp_pusha img{background-color:#0072B8}.heateor_sss_amp_qzone img{background-color:#2B82D9}.heateor_sss_amp_refind img{background-color:#1492ef}.heateor_sss_amp_rediff_mypage img{background-color:#D20000}.heateor_sss_amp_renren img{background-color:#005EAC}.heateor_sss_amp_segnalo img{background-color:#fdff88}.heateor_sss_amp_sina_weibo img{background-color:#ff0}.heateor_sss_amp_sitejot img{background-color:#ffc800}.heateor_sss_amp_skype img{background-color:#00AFF0}.heateor_sss_amp_sms img{background-color:#6ebe45}.heateor_sss_amp_slashdot img{background-color:#004242}.heateor_sss_amp_stumpedia img{background-color:#EDEDED}.heateor_sss_amp_svejo img{background-color:#fa7aa3}.heateor_sss_amp_symbaloo_feeds img{background-color:#6DA8F7}.heateor_sss_amp_telegram img{background-color:#3DA5f1}.heateor_sss_amp_trello img{background-color:#1189CE}.heateor_sss_amp_tuenti img{background-color:#0075C9}.heateor_sss_amp_twiddla img{background-color:#EDEDED}.heateor_sss_amp_typepad_post img{background-color:#2A2A2A}.heateor_sss_amp_viadeo img{background-color:#2A2A2A}.heateor_sss_amp_viber img{background-color:#8B628F}.heateor_sss_amp_wanelo img{background-color:#fff}.heateor_sss_amp_webnews img{background-color:#CC2512}.heateor_sss_amp_wordpress img{background-color:#464646}.heateor_sss_amp_wykop img{background-color:#367DA9}.heateor_sss_amp_yahoo_mail img{background-color:#400090}.heateor_sss_amp_yahoo_messenger img{background-color:#400090}.heateor_sss_amp_yoolink img{background-color:#A2C538}.heateor_sss_amp_youmob img{background-color:#3B599D}.heateor_sss_amp_gentlereader img{background-color:#46aecf}.heateor_sss_amp_threema img{background-color:#2A2A2A}.heateor_sss_vertical_sharing{position:fixed;left:11px;z-index:99999}.heateor-total-share-count .sss_share_count{color:#666;font-size:23px}.heateor-total-share-count .sss_share_lbl{color:#666}.amp-wp-enforced-sizes img[alt="Pinterest"]{background:#cc2329}.amp-wp-enforced-sizes img[alt="Viber"]{background:#8b628f}.amp-wp-enforced-sizes img[alt="Print"]{background:#fd6500}.amp-wp-enforced-sizes img[alt="Threema"]{background:#2a2a2a}.amp-wp-article-content .heateor_sss_vertical_sharing{left:5px}.amp-wp-article-content amp-img[alt="Pinterest"]{left:4px}.amp-wp-enforced-sizes img[alt="MySpace"]{background:#2a2a2a} amp-web-push-widget button.amp-subscribe { display: inline-flex; align-items: center; border-radius: 5px; border: 0; box-sizing: border-box; margin: 0; padding: 10px 15px; cursor: pointer; outline: none; font-size: 15px; font-weight: 500; background: #4A90E2; margin-top: 7px; color: white; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.5); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } a.heateor_sss_amp{padding:0 4px;}div.heateor_sss_horizontal_sharing a amp-img{display:inline-block;}.heateor_sss_amp_gab img{background-color:#25CC80}.heateor_sss_amp_parler img{background-color:#892E5E}.heateor_sss_amp_gettr img{background-color:#E50000}.heateor_sss_amp_instagram img{background-color:#624E47}.heateor_sss_amp_yummly img{background-color:#E16120}.heateor_sss_amp_youtube img{background-color:#ff0000}.heateor_sss_amp_teams img{background-color:#5059c9}.heateor_sss_amp_google_translate img{background-color:#528ff5}.heateor_sss_amp_x img{background-color:#2a2a2a}.heateor_sss_amp_rutube img{background-color:#14191f}.heateor_sss_amp_buffer img{background-color:#000}.heateor_sss_amp_delicious img{background-color:#53BEEE}.heateor_sss_amp_rss img{background-color:#e3702d}.heateor_sss_amp_facebook img{background-color:#0765FE}.heateor_sss_amp_perplexity img{background-color:#165962}.heateor_sss_amp_claude img{background-color:#D97757}.heateor_sss_amp_google_ai img{background-color:#000}.heateor_sss_amp_grok img{background-color:#000}.heateor_sss_amp_chatgpt img{background-color:#000}.heateor_sss_amp_digg img{background-color:#006094}.heateor_sss_amp_email img{background-color:#649A3F}.heateor_sss_amp_float_it img{background-color:#53BEEE}.heateor_sss_amp_linkedin img{background-color:#0077B5}.heateor_sss_amp_pinterest img{background-color:#CC2329}.heateor_sss_amp_print img{background-color:#FD6500}.heateor_sss_amp_reddit img{background-color:#FF5700}.heateor_sss_amp_mastodon img{background-color:#6364FF}.heateor_sss_amp_stocktwits img{background-color: #40576F}.heateor_sss_amp_mewe img{background-color:#007da1}.heateor_sss_amp_mix img{background-color:#ff8226}.heateor_sss_amp_tumblr img{background-color:#29435D}.heateor_sss_amp_twitter img{background-color:#55acee}.heateor_sss_amp_vkontakte img{background-color:#0077FF}.heateor_sss_amp_yahoo img{background-color:#8F03CC}.heateor_sss_amp_xing img{background-color:#00797D}.heateor_sss_amp_instagram img{background-color:#527FA4}.heateor_sss_amp_whatsapp img{background-color:#55EB4C}.heateor_sss_amp_aim img{background-color: #10ff00}.heateor_sss_amp_amazon_wish_list img{background-color: #ffe000}.heateor_sss_amp_aol_mail img{background-color: #2A2A2A}.heateor_sss_amp_app_net img{background-color: #5D5D5D}.heateor_sss_amp_balatarin img{background-color: #fff}.heateor_sss_amp_bibsonomy img{background-color: #000}.heateor_sss_amp_bitty_browser img{background-color: #EFEFEF}.heateor_sss_amp_blinklist img{background-color: #3D3C3B}.heateor_sss_amp_blogger_post img{background-color: #FDA352}.heateor_sss_amp_blogmarks img{background-color: #535353}.heateor_sss_amp_bookmarks_fr img{background-color: #E8EAD4}.heateor_sss_amp_box_net img{background-color: #1A74B0}.heateor_sss_amp_buddymarks img{background-color: #ffd400}.heateor_sss_amp_care2_news img{background-color: #6EB43F}.heateor_sss_amp_comment img{background-color: #444}.heateor_sss_amp_diary_ru img{background-color: #E8D8C6}.heateor_sss_amp_diaspora img{background-color: #2E3436}.heateor_sss_amp_dihitt img{background-color: #FF6300}.heateor_sss_amp_diigo img{background-color: #4A8BCA}.heateor_sss_amp_douban img{background-color: #497700}.heateor_sss_amp_draugiem img{background-color: #ffad66}.heateor_sss_amp_evernote img{background-color: #8BE056}.heateor_sss_amp_facebook_messenger img{background-color: #0084FF}.heateor_sss_amp_fark img{background-color: #555}.heateor_sss_amp_fintel img{background-color: #087515}.heateor_sss_amp_flipboard img{background-color: #CC0000}.heateor_sss_amp_folkd img{background-color: #0F70B2}.heateor_sss_amp_google_news img{background-color: #4285F4}.heateor_sss_amp_google_classroom img{background-color: #FFC112}.heateor_sss_amp_google_gmail img{background-color: #E5E5E5}.heateor_sss_amp_hacker_news img{background-color: #F60}.heateor_sss_amp_hatena img{background-color: #00A6DB}.heateor_sss_amp_instapaper img{background-color: #EDEDED}.heateor_sss_amp_jamespot img{background-color: #FF9E2C}.heateor_sss_amp_kakao img{background-color: #FCB700}.heateor_sss_amp_kik img{background-color: #2A2A2A}.heateor_sss_amp_kindle_it img{background-color: #2A2A2A}.heateor_sss_amp_known img{background-color: #fff101}.heateor_sss_amp_line img{background-color: #00C300}.heateor_sss_amp_livejournal img{background-color: #EDEDED}.heateor_sss_amp_mail_ru img{background-color: #356FAC}.heateor_sss_amp_mendeley img{background-color: #A70805}.heateor_sss_amp_meneame img{background-color: #FF7D12}.heateor_sss_amp_mixi img{background-color: #EDEDED}.heateor_sss_amp_myspace img{background-color: #2A2A2A}.heateor_sss_amp_netlog img{background-color: #2A2A2A}.heateor_sss_amp_netvouz img{background-color: #c0ff00}.heateor_sss_amp_newsvine img{background-color: #055D00}.heateor_sss_amp_nujij img{background-color: #D40000}.heateor_sss_amp_odnoklassniki img{background-color: #F2720C}.heateor_sss_amp_oknotizie img{background-color: #fdff88}.heateor_sss_amp_outlook_com img{background-color: #0072C6}.heateor_sss_amp_papaly img{background-color: #3AC0F6}.heateor_sss_amp_pinboard img{background-color: #1341DE}.heateor_sss_amp_plurk img{background-color: #CF682F}.heateor_sss_amp_pocket img{background-color: #ee4056}.heateor_sss_amp_polyvore img{background-color: #2A2A2A}.heateor_sss_amp_printfriendly img{background-color: #61D1D5}.heateor_sss_amp_protopage_bookmarks img{background-color: #413FFF}.heateor_sss_amp_pusha img{background-color: #0072B8}.heateor_sss_amp_qzone img{background-color: #2B82D9}.heateor_sss_amp_refind img{background-color: #1492ef}.heateor_sss_amp_rediff_mypage img{background-color: #D20000}.heateor_sss_amp_renren img{background-color: #005EAC}.heateor_sss_amp_segnalo img{background-color: #fdff88}.heateor_sss_amp_sina_weibo img{background-color: #ff0}.heateor_sss_amp_sitejot img{background-color: #ffc800}.heateor_sss_amp_skype img{background-color: #00AFF0}.heateor_sss_amp_sms img{background-color: #6ebe45}.heateor_sss_amp_slashdot img{background-color: #004242}.heateor_sss_amp_stumpedia img{background-color: #EDEDED}.heateor_sss_amp_svejo img{background-color: #fa7aa3}.heateor_sss_amp_symbaloo_feeds img{background-color: #6DA8F7}.heateor_sss_amp_telegram img{background-color: #3DA5f1}.heateor_sss_amp_trello img{background-color: #1189CE}.heateor_sss_amp_tuenti img{background-color: #0075C9}.heateor_sss_amp_twiddla img{background-color: #EDEDED}.heateor_sss_amp_typepad_post img{background-color: #2A2A2A}.heateor_sss_amp_viadeo img{background-color: #2A2A2A}.heateor_sss_amp_viber img{background-color: #8B628F}.heateor_sss_amp_wordpress img{background-color: #464646}.heateor_sss_amp_wykop img{background-color: #367DA9}.heateor_sss_amp_yahoo_mail img{background-color: #400090}.heateor_sss_amp_yahoo_messenger img{background-color: #400090}.heateor_sss_amp_youmob img{background-color: #3B599D}.heateor_sss_amp_gentlereader img{background-color: #46aecf}.heateor_sss_amp_threema img{background-color: #2A2A2A}.heateor_sss_amp_bluesky img{background-color:#0085ff}.heateor_sss_amp_threads img{background-color:#000}.heateor_sss_amp_raindrop img{background-color:#0b7ed0}.heateor_sss_amp_micro_blog img{background-color:#ff8800}.heateor_sss_amp amp-img{border-radius:999px;} .amp-logo amp-img{width:190px} .amp-menu input{display:none;}.amp-menu li.menu-item-has-children ul{display:none;}.amp-menu li{position:relative;display:block;}.amp-menu > li a{display:block;} /* Inline styles */ span.acss41056{font-size:1.375rem;font-weight:bold;}div.acss138d7{clear:both;}div.acssf5b84{--relposth-columns:3;--relposth-columns_m:2;--relposth-columns_t:2;}div.acssae964{aspect-ratio:1/1;background:transparent no-repeat scroll 0% 0%;height:150px;max-width:150px;}div.acss6bdea{color:#333333;font-family:Arial;font-size:12px;height:75px;}div.acsse3e3c{font-weight:bold;}amp-img.acss334b9{max-width:35px;} .icon-widgets:before {content: "\e1bd";}.icon-search:before {content: "\e8b6";}.icon-shopping-cart:after {content: "\e8cc";}
От автора: если вы когда-либо работали над адаптивным вебсайтом, вам, несомненно, приходилось биться над одной из самых коварных проблем этой развивающейся области: навигацией. Решение ее для простой навигации может быть прямолинейным. Однако если вы работаете над чем-то более сложным – возможно, с множественными вложенными списками и выпадающими меню – может оказаться уместной более кардинальная реконструкция.
При таком подходе к отзывчивой навигации мы собираемся применить методику, которая способна обеспечивать большие, многоуровневые навигационные меню с помощью медиазапросов и jQuery, при этом попытаемся сохранить простую разметку и минимизировать внешние ресурсы.
Тема: адаптивный веб-дизайн
Сложность: продвинутая
Примерное время выполнения: 30 мин.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Узнать подробнее
Вот то, к чему мы стремимся:
На больших экранах показываем горизонтальное выпадающее меню, содержащее до двух уровней подменю, появляющихся, когда над родительским элементом проводят мышью.
На маленьких экранах – кнопку «Меню», которая отображает наше меню вертикально, показывая подменю при щелчке/касании родительского элемента.
Наша разметка – это довольно простой неупорядоченный список с вложенными в его элементы списками. Я намеренно не применяю к элементам никаких классов или ID, кроме исходного неупорядоченного списка, с тем, чтобы меню было совместимо с меню, созданными в CMS.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <div class=»container»> <aclass=»toggleMenu»href=»#»>Menu</a> <ul class=»nav»> <li class=»test»> <ahref=»#»>Shoes</a> <ul> <li> <ahref=»#»>Womens</a> <ul> <li><ahref=»#»>Sandals</a></li> <li><ahref=»#»>Sneakers</a></li> <li><ahref=»#»>Wedges</a></li> <li><ahref=»#»>Heels</a></li> <li><ahref=»#»>Loafers</a></li> <li><ahref=»#»>Flats</a></li> </ul> </li> <li> <ahref=»#»>Mens</a> <ul> <li><ahref=»#»>Loafers</a></li> <li><ahref=»#»>Sneakers</a></li> <li><ahref=»#»>Formal</a></li> </ul> </li> </ul> </li> |
Давайте добавим несколько общих стилей, чтобы наш список смотрелся навигационной панелью:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | body,nav,ul,li,a {margin:0;padding:0;} body{font-family:»Helvetica Neue»,Helvetica,Arial,sans-serif;} a{text-decoration:none;} .container{ width:90%; max-width:900px; margin:10pxauto; } .toggleMenu{ display: none; background:#666; padding:10px15px; color:#fff; } .nav{ list-style:none; *zoom:1; background:#175e4c; position:relative; } .nav:before, .nav:after{ content:» «; display:table; } .nav:after{ clear:both; } .nav ul{ list-style:none; width:9em; } .nava{ padding:10px15px; color:#fff; *zoom:1; } .nav>li{ float:left; border-top:1pxsolid#104336; z-index:200; } .nav>li>a{ display:block; } .nav liul{ position:absolute; left:-9999px; z-index:100; } .nav lilia{ display:block; background:#1d7a62; position:relative; z-index:100; border-top:1pxsolid#175e4c; } .nav lililia{ background:#249578; z-index:200; border-top:1pxsolid#1d7a62; } |
Мы всего лишь выстроили элементы списка в горизонтальную линию, установили некоторые цвета и скрыли с экрана подменю с помощью абсолютного позиционирования. Если вас удивила строка 20, то это простой метод clearfix, который в таких ситуациях я считаю эффективным (прочтите об этом в блоге Николаса Галлахера (Nicolas Gallagher).
Далее выполним горизонтальные выпадающие меню. Хотя их можно сделать с помощью одного лишь псевдоселектора CSS :hover, я хочу добавить его с помощью JavaScript’а, так как в малоэкранной версии мы собираемся активировать переключение меню щелчком.
Так как для удаления подменю с экрана мы применяем абсолютное позиционирование, давайте добавим несколько правил .hover, которые в присутствии класса .hover определят местоположение подменю относительно их родительских элементов (о чем мы позаботимся с помощью jQuery).
| .nav li{ position:relative; } .nav>li.hover>ul{ left:0; } .nav li li.hover ul{ left:100%; top:0; } |
Теперь напишем пару строк простого jQuery, чтобы добавлять класс .hover к элементам списка, когда над ними проводят мышью.
| $(document).ready(function(){ $(«.toggleMenu»).css(«display»,»none»); $(«.nav li»).hover(function(){ $(this).addClass(‘hover’); },function(){ $(this).removeClass(‘hover’); }); }); |
И вот у нас получилось функциональное многоуровневое выпадающее меню.
К сожалению, наше отличное горизонтальное выпадающее меню выглядит крошечным на экранах мобильных устройств, так что давайте обеспечим ему полное увеличение при загрузке нашей страницы на мобильных браузерах, добавив мета-тэг viewport.
| <meta name=»viewport»content=»width=device-width, initial-scale=1″> |
Конечно, теперь на мобильных устройствах наше выпадающее меню смотрится еще хуже, а большая его часть даже не подходит по размеру к экрану! Давайте добавим несколько медиазапросов, чтобы список под точкой прерывания был вертикальным списком. Точка прерывания определяется отметкой, на которой наше меню разделяется надвое, в моем случае это примерно 800px.
На точке прерывания мы удалим float и установим ширину элементов списка и неупорядоченных списков на width: 100%. Прямо сейчас при проведении над родительскими элементами их дочерние списки отображаются поверх находящихся ниже элементов. Нам было бы лучше, если бы сместились другие элементы списка верхнего уровня. Так что вместо изменения позиции left неупорядоченного списка, мы просто установим значение position на static.
| @media screen and(max-width:800px){ .nav>li{ float:none; } .nav ul{ display:block; width:100%; } .nav>li.hover>ul,.nav li li.hover ul{ position:static; } } |
Так как над сенсорным экраном невозможно провести мышью (пока что), мы собираемся создать код условия для проверки ширины окна, а затем написать код для установки событий click() и hover().
| $(document).ready(function(){ varww=document.body.clientWidth; if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); $(«.nav li a»).click(function(){ $(this).parent(«li»).toggleClass(‘hover’); }); }else{ $(«.toggleMenu»).css(«display»,»none»); $(«.nav li»).hover(function(){ $(this).addClass(‘hover’); },function(){ $(this).removeClass(‘hover’); }); } }); |
Для события щелчка click нам пришлось изменить целевой элемент с элемента списка на родительский, так как списки вложены и щелчок на один элемент списка может открыть и его «внучатые» элементы. Однако проблема здесь в том, что щелчок по тэгу-привязке перезагрузит страницу, а мы не можем предотвратить поведение по умолчанию всех тэгов-привязок, являющихся потомками элементов списка.
Чтобы исправить это, давайте внесем фрагмент jQuery, чтобы добавить класс .parent к любому элементу списка, у чьей дочерней привязки есть элементы одного уровня (сиблинги), затем целенаправленно обратимся только к этим привязкам (при этом пытаясь сохранить гибкость разметки).
| $(«.nav li a»).each(function(){ if($(this).next().length>0){ $(this).addClass(«parent»); }; }) if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); $(«.nav li a.parent»).click(function(e){ e.preventDefault(); $(this).parent(«li»).toggleClass(‘hover’); }); }else{ …} |
Теперь наше меню в мобильных устройствах смотрится довольно симпатично, но занимает довольно много ценной «недвижимости» экрана. Сейчас популярен новый подход – переключать списки навигации с помощью кнопки, обычно под названием «Меню» или иконки меню. Давайте сделаем так, чтобы ссылка-переключатель работала, показывая наш навигационный список, только когда на нее щелкают.
| $(«.toggleMenu»).click(function(e){ e.preventDefault(); $(«.nav»).toggle(); }); if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); $(«.nav»).hide(); }else{ … } |
Шаг 7: Еще немного стилей
Теперь, когда элементы родительского списка выбираются с помощью класса, почему бы не добавить маленькую указующую вниз стрелку, чтобы дать понять пользователям, у каких элементов списка есть дочерние элементы?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | .nav>li>.parent{ background-position:95%50%; } .nav li li.parent{ background-image:url(«images/downArrow.png»); background-repeat:no-repeat; background-position:95%50%; } @media screen and(max-width:800px){ .nav>li>.parent{ background-position:95%50%; } .nav li li.parent{ background-image:url(«images/downArrow.png»); background-repeat:no-repeat; background-position:95%50%; } } |
Сейчас это меню работает довольно хорошо в практических целях. Если вы откроете его в мобильном браузера, то получите пригодный к употреблению вертикальный список-«аккордеон», если в браузера настольного компьютера – красивый горизонтальный выпадающий список. Однако, если изменить размер браузера настольного компьютера до ширины мобильного, наша навигация работает только при проведении мышью, а меню не скрывается при помощи свойства переключения toggle. Большинству приложений это подходит. В конце концов, ваш среднестатистический посетитель сайта не хватает свой браузер за краешек и не начинает бешено возить им туда-сюда.
Однако если захочется впечатлить своих приятелей – веб-профессионалов, так не пойдет. Нам придется установить свой скрипт так, чтобы он отвечал на событие resize, и реализовать код условия, когда размеры браузера изменяются ниже контрольной точки. Расширяя код, показанный в великолепном учебнике Создание адаптивного дизайна Mobile-First (Creating a Mobile-First Responsive Design ), мы установим несколько переменных, чтобы быть в курсе изменений и обновлять ширину своего браузера.
Так как нам нужно проверять ширину браузера как при загрузке страницы, так и при изменении размера браузера, давайте начнем с перемещения всего кода условия из события $(document).ready() и обертывания его в функцию adjustMenu.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | varww=document.body.clientWidth; $(document).ready(function(){ $(«.toggleMenu»).click(function(e){ e.preventDefault(); $(«.nav»).toggle(); }); $(«.nav li a»).each(function(){ if($(this).next().length>0){ $(this).addClass(«parent»); }; }) adjustMenu(); }); functionadjustMenu(){ if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); $(«.nav»).hide(); $(«.nav li a.parent»).click(function(e){ e.preventDefault(); $(this).parent(«li»).toggleClass(‘hover’); }); }else{ $(«.toggleMenu»).css(«display»,»none»); $(«.nav li»).hover(function(){ $(this).addClass(‘hover’); },function(){ $(this).removeClass(‘hover’); }); } } |
Для вызова этой функции при изменении размеров браузера мы собираемся привязать (bind) ее к событиям окна resize и orientationchange. Внутри этого события мы собираемся переопределять переменную ww, чтобы приспосабливать ее к новой ширине браузера.
| $(window).bind(‘resize orientationchange’,function(){ ww=document.body.clientWidth; adjustMenu(); }); |
На данный момент мы создали больше проблем: хотя вначале все, похоже, работает (горизонтальное меню сворачивается в кнопку «Меню», которая его открывает), быстро становится ясным, что у нас возникли два больших затруднения:
Меню исчезает полностью, если заново изменить мобильный размер окна после контрольной точки.
В мобильной версии все еще запускается событие проведения мышью hover.
Наше пропавшее навигационное меню, кажется, можно легко привести в порядок: просто добавить $(«nav»).show() при условии «больше, чем точка прерывания». Это решение кажется работающим, но создает коварные случаи. Так как код переоценивается при каждом изменении размеров браузера, всякий раз при изменении размера с открытым меню оно автоматически снова закрывается.
Это может казаться маловероятным, но мобильные браузеры – загадочные существа: например, в моем Galaxy S прокрутка вниз, а затем снова до верха страницы запускает событие изменения размера resize. Нехорошо!
Чтобы исправить это, нужно предусмотреть некий способ проверки того, щелкали ли на переключатель меню. Я собираюсь применить к кнопке переключения меню дополнительный класс, потому что это может оказаться удобным при назначении стилей (может быть, попозже нам понадобится стрелка-указатель сверху донизу?) Вдобавок к переключению дисплея навигационного меню кнопка меню будет теперь переключать свой собственный класс .active. При условии «уже, чем точка прерывания» давайте обновим код, чтобы навигационное меню скрывалось, только если у переключателя меню отсутствует класс .active.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $(document).ready(function(){ $(«.toggleMenu»).click(function(e){ e.preventDefault(); $(this).toggleClass(«active»); $(«.nav»).toggle(); }); }); if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); if(!$(«.toggleMenu»).hasClass(«active»)){ $(«.nav»).hide(); }else{ $(«.nav»).show(); } $(«.nav li a.parent»).click(function(e){ e.preventDefault(); $(this).parent(«li»).toggleClass(‘hover’); }); }… |
Чтобы решить проблему отклика своего мобильного навигационного меню на события проведения мышью, нам просто придется отвязать unbind() событие проведения мышью от элементов списка внутри условия «уже, чем точка прерывания».
| $(«.nav li»).unbind(‘mouseenter mouseleave’); |
Однако так высвечивается новая проблема: события щелчка click не работают при изменении размера браузера с большего на меньший. Поиск ошибок показывает, что событие click было привязано к ссылке множество раз, так что при каждом щелчке включается и тут же снова выключается класс .hover. Это происходит из-за того, что вся функция неоднократно запускается при изменении размеров окна. Чтобы гарантировать, что переключение начнется там, где нужно, следует отвязать unbind событие щелчка перед тем, как снова привязать его.
Однако как только мы опять изменим размер браузера с меньшего на больший, нам станет не хватать события hover, потому что мы его отвязали, когда браузер был маленьким, а событие click все еще присутствует, так что отвяжем его перед привязкой состояния проведения мышью hover. Кроме того, мы собираемся удалить все элементы списка с классом .hover перед их добавлением обратно при событии проведения мышью, чтобы меню не оставались открытыми при изменении размера браузера на более широкий.
Ради ясности я заново записываю события .click() и .hover() с помощью .bind(). Это означает в точности то же.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | if(ww<800){ $(«.toggleMenu»).css(«display»,»inline-block»); if(!$(«.toggleMenu»).hasClass(«active»)){ $(«.nav»).hide(); }else{ $(«.nav»).show(); } $(«.nav li»).unbind(‘mouseenter mouseleave’); $(«.nav li a.parent»).unbind(«click»).bind(«click»,function(e){ e.preventDefault(); $(this).parent(«li»).toggleClass(‘hover’); }); }else{ $(«.toggleMenu»).css(«display»,»none»); $(«.nav»).show(); $(«.nav li»).removeClass(«hover»); $(«.nav li a»).unbind(«click»); $(«.nav li»).unbind(‘mouseenter mouseleave’).bind(‘mouseenter mouseleave’,function(){ $(this).toggleClass(‘hover’); }); } |
Ура! Кажется, все работает, как следует.
Вечеринка не состоится, если на нее не придет IE7, не так ли? У нас имеется странный баг – там, куда исчезают подменю, когда они демонстрируются поверх другого контента (в нашем примере текста lorem ipsum). Как только курсор доходит до элемента абзаца и – пффф! – меню уже нет. Я уверена, что это происходит из-за причудливости способа, которым IE7 управляется с position: relative;, и вопрос легко решается запуском hasLayout для элемента .nav a.
Как обычно, вам придется самим решать проблему поддержки браузера и свойств, но инструменты типа Modernizr и respond.js могут немного облегчить тяжесть поддержки старых браузеров.
Я протестировала это меню в Mobile Safari и каждом браузере Android 2.3, до которого только смогла добраться, и оно, похоже, работает довольно хорошо. Однако эта техника сильно зависима от JavaScript’а, а так как некоторые мобильные браузеры (в основном Blackberry) очень плохо поддерживают JavaScript, пользователи могут остаться с навигационным меню, которым невозможно пользоваться.
К счастью, существует множество методов, которые можно применить для обслуживания упрощенных разметок для устройств без JavaScript. На ум приходит старая добрая методика добавления класса .no-js к тэгу body и удаления его в своем JavaScript’е, но также можно предусмотреть атрибуты href для навигационных элементов верхнего уровня, отсылая, например, пользователей к общей категории «Обувь», и полагаясь на preventDefault для предупреждения такого поведения в устройствах, обеспеченных JavaScript’ом.
Конечно, медиазапросы не станут работать в старых версиях IE, так что вам придется решать, стоит ли включать «замазку»-polyfill, такую как respond.js для заполнения этого пробела.
И последнее, но не менее важное – досадный баг iOS, вызывающий изменение уровня увеличения при вращении устройства. Чтобы прибить этого «жучка», просмотрите скрипт настройки iOS Orientationchange.
В Unity используется производительный язык программирования C#. Благодаря C# и Mono – кроссплатформенной реализации .NET,…