2017-02-21 13 views
0

Я создаю меню Button для проекта для курса веб-разработки. Я использую <div> s для создания интерактивного меню, изменяющего оттенки при наведении курсора. Я хотел, чтобы пользователь не мог выбрать текст (так как это кнопка). Я использую схему гибкого макета (по крайней мере, я думаю, что я делаю это правильно). У меня есть следующий код, но он ведет себя по-разному в разных браузерах. Я включил ссылку на скриншот ниже, это слева и справа Chrome, Firefox и Safari.Меню кнопок на основе Div имеет разное поведение в разных браузерах

Вот код для строки меню:

<style type="text/css"> 

    .button { 
     margin: 0; 
     padding: 5px; 
     background-color: #CCCCCC; 
     height: 100%; 
     font-family: helvetica, sans-serif; 
     display: flex; 
     align-items: center; 
     user-select: none; 
    } 

    .buttonDivider { 
     border-left: gray 1px solid; 
     height: 100%; 
    } 

    .button:hover{ 
     background-color: gray; 
     cursor: pointer; 
    } 

    #buttonBar { 
     display: flex; 
     border: gray 1px solid; 
     border-radius: 5px; 
     overflow: hidden; 
     margin: 0 auto; 
     align-items: center; 
     user-select: none; 
    } 

    #titleBar { 
     display: flex; 
     width: 100%; 
     height : 40px; 
     padding: 5px; 
     background-color: #CCCCCC; 
     user-select: none; 
    } 
    #titleText { 
     display: flex; 
     align-items: center; 
     font-family: helvetica, sans-serif; 
     font-size: 25px; 
     font-weight: bold; 
    } 

    body{ 
     margin: 0; 
     padding: 0; 
    } 
    div { 
     margin: 0; 
     padding: 0; 
    } 



    </style> 

</head> 

<body> 
    <div id="titleBar"> 
    <span id="titleText">CodePlayer</span> 
    <div id="buttonBar"> 
     <div id="buttonHTML" class="button">HTML</div> 
     <div class="buttonDivider"></div> 
     <div id="buttonCSS" class="button" style="user-select:none">CSS</div> 
     <div class="buttonDivider"></div> 
     <div id="buttonJS" class="button">JavaScript</div> 
     <div class="buttonDivider"></div> 
     <div id="buttonOutput" class="button">Output</div> 
    </div> 
    </div> 

Но как вы можете видеть из видео, поведение сильно отличается в 3 браузерах (все обновлено до последней версии, как этот пост, Chrome 56, Firefox 51 и Safari 10.0.3). Chrome является самым близким. Это предотвращает выбор пользователем текста и наведение на всю область. Единственное, что странно, когда вы нажимаете и перетаскиваете, пока он не выбирает текст, курсор меняется на курсор выделения. Firefox лучше всего подходит, поскольку он затеняет всю кнопку при наведении курсора, но не подчиняется user-select: none, и, как вы можете видеть, Safari не заполняет всю коробку, так как другие два делают наведение, но также позволяют полностью выбирать.

ScreenCap здесь: Video of different behaviors in different browsers. From Left to Right: Chrome, FireFox, Safari

я делаю что-то нестандартное? Или эти ошибки? и если да, то есть ли способ заставить их всех вести себя правильно? Спасибо!

ответ

1

.button { 
 
     margin: 0; 
 
     padding: 5px; 
 
     background-color: #CCCCCC; 
 
     height: 100%; 
 
     font-family: helvetica, sans-serif; 
 
     display: flex; 
 
     align-items: center; 
 
     -webkit-touch-callout: none; /* iOS Safari */ 
 
     -webkit-user-select: none; /* Safari */ 
 
     -khtml-user-select: none; /* Konqueror HTML */ 
 
     -moz-user-select: none; /* Firefox */ 
 
     -ms-user-select: none; /* Internet Explorer/Edge */ 
 
     user-select: none; /* Non-prefixed version, currently 
 
            supported by Chrome and Opera */ 
 
    } 
 

 
    .buttonDivider { 
 
     border-left: gray 1px solid; 
 
     height: 100%; 
 
    } 
 

 
    .button:hover{ 
 
     background-color: gray; 
 
     cursor: pointer; 
 
    } 
 

 
    #buttonBar { 
 
     display: flex; 
 
     border: gray 1px solid; 
 
     border-radius: 5px; 
 
     overflow: hidden; 
 
     margin: 0 auto; 
 
     align-items: center; 
 
     user-select: none; 
 
    } 
 

 
    #titleBar { 
 
     display: flex; 
 
     width: 100%; 
 
     height : 40px; 
 
     padding: 5px; 
 
     background-color: #CCCCCC; 
 
     user-select: none; 
 
    } 
 
    #titleText { 
 
     display: flex; 
 
     align-items: center; 
 
     font-family: helvetica, sans-serif; 
 
     font-size: 25px; 
 
     font-weight: bold; 
 
    } 
 

 
    body{ 
 
     margin: 0; 
 
     padding: 0; 
 
    } 
 
    div { 
 
     margin: 0; 
 
     padding: 0; 
 
    }
<div id="titleBar"> 
 
    <span id="titleText">CodePlayer</span> 
 
    <div id="buttonBar"> 
 
     <div id="buttonHTML" class="button">HTML</div> 
 
     <div class="buttonDivider"></div> 
 
     <div id="buttonCSS" class="button" style="user-select:none">CSS</div> 
 
     <div class="buttonDivider"></div> 
 
     <div id="buttonJS" class="button">JavaScript</div> 
 
     <div class="buttonDivider"></div> 
 
     <div id="buttonOutput" class="button">Output</div> 
 
    </div> 
 
    </div>

попробуйте использовать префиксы ...

+0

Спасибо, что исправил проблему. Я вижу, что он по-прежнему помечен как экспериментальная технология, поэтому он не принимается без тегов css, специфичных для двигателя. – FrostedCookies

2

Добавить префиксы (-moz, -webkit и -ms) перед пользователем отборное на отдельные линии для функциональности в других браузерах:

#titleBar { 
    display: flex; 
    width: 100%; 
    height : 40px; 
    padding: 5px; 
    background-color: #CCCCCC; 
    user-select: none; 
    -moz-user-select: none; 
    -webkit-user-select: none; 
    -ms-user-select: none; 
} 

Похоже, у вас есть, что код для пользовательского выбора ни в нескольких местах, таких как кнопка и ваш HTML, поскольку вы пытались найти, где была ошибка. Удаление избыточного кода поможет вам по мере усложнения проекта и применения его только к идентификатору #titleBar и его унаследованию.

Mozilla имеет объяснение пользователя, выберите здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/user-select

Вот JSFiddle я сделал с этим изменением, а также: https://jsfiddle.net/0uvrpohp/1/

Что касается вопроса с Safari и заполняя всю высоту элемента Я не мог просмотреть его на моей машине с Windows, но эта тема может быть полезна: Chrome/Safari not filling 100% height of flex parent

+0

Благодаря Kylegill, агент пользователя трюк сделал трюк. Я вижу, что до сих пор считается «экспериментальный», так что никто не поддерживает его еще без конкретного двигателя выноска. И да. Я пробовал это во всех возможных местах чтобы узнать, не изменилось ли это и забыл удалить их. Они ушли. Я вижу, что он унаследован от родительского элемента. Благодарю. Я понял вопрос сафари, который я разместил ниже, благодаря вашей ссылке. – FrostedCookies

0

Я думаю, что вижу разницу. Возможно, это может помочь?

border-top-style: none;` 
border-bottom-style: none; 
0

В качестве последующих мер по конкретному вопросу Safari, я нашел лучшее решение, благодаря ссылке Kylegill в. Link to 100% vertical fill issue

Под ответом:

«4. Уплотненного Flex контейнеры (рекомендуется) Избавиться от процентной высоты Избавьтесь от свойств таблицы..Избавьтесь от вертикального выравнивания. Избегайте абсолютного позиционирования. Просто придерживайтесь flexbox до конца. Примените display: flex к элементу flex (.item), сделав его гибким контейнером. Это автоматически устанавливает align-items: stretch, который говорит ребенку (.item-внутренний), чтобы развернуть полную высоту родителя.»

Я избавилась от height:100%; в .button классе постоянно стояли align-items: center и под #buttonBar контейнера изменены к align-items: stretch; и теперь он работает прекрасно в Safari, а два других браузеров.

.button { 
     margin: 0; 
     padding: 5px; 
     background-color: #CCCCCC;  
     font-family: helvetica, sans-serif; 
     display: flex; 
     align-items: center; 
    } 

    .buttonDivider { 
     border-left: gray 1px solid; 
     height: 100%; 
    } 

    .button:hover{ 
     background-color: gray; 
     cursor: pointer; 
    } 

    #buttonBar { 
     top: 0; 
     left: 0; 
     display: flex; 
     border: gray 1px solid; 
     border-radius: 5px; 
     overflow: hidden; 
     margin: 0 auto; 
     align-items: stretch; 
    }