Как иметь разные выравнивания в одном div (nav)?

В этой скрипте: https://jsfiddle.net/vtrec4oL/

Я хочу, чтобы #leftSide выровнялось по левому краю моего <nav>, а остальные по центру.

Но я хочу, чтобы моя страница была максимально совместима с изменением размера окна, поэтому я предпочитаю не использовать поля/отступы.

Также я хотел бы добиться этого без дополнительных элементов, если это возможно.

Кто-нибудь знает, как это сделать только с помощью css?


person yukashima huksay    schedule 29.08.2015    source источник
comment
t в нижнем регистре, поэтому text-align: center;. Также поставьте пробел между скобкой и селектором, nav a#leftSide {   -  person Luke Shimkus    schedule 29.08.2015
comment
сори, это были опечатки :)   -  person yukashima huksay    schedule 29.08.2015
comment
Извините, если это показалось грубым, не имел в виду. :)   -  person Luke Shimkus    schedule 29.08.2015
comment
@King, все в порядке! но вы знаете! на самом деле вы можете использовать Text-align вместо text-align, и если это будет работать так же в любом известном браузере, то пробел перед скобкой не нужен.   -  person yukashima huksay    schedule 29.08.2015
comment
Да, я знал об этом, просто меня это почему-то беспокоило. У меня был небольшой приступ ОКР. Извини за это.   -  person Luke Shimkus    schedule 29.08.2015
comment
ха-ха! так что это был приказ! сэр, да, сэр! извините! я думал, что это был ответ!   -  person yukashima huksay    schedule 29.08.2015
comment
Аран, вы готовы использовать flexbox? Это позволит быстро и легко выполнить то, что вы хотите, и с минимальным кодом. Единственное, нет поддержки IE 8 и 9.   -  person Michael Benjamin    schedule 29.08.2015
comment
ну я сам придумал решение! Но это немного портит мое вертикальное выравнивание! Итак, расскажите мне о вашем flexbox! Это то же самое, что display: flex?   -  person yukashima huksay    schedule 29.08.2015
comment
я думаю, что этот заголовок лучше, потому что его ответы также являются ответами на то, как выровнять некоторые элементы по левому краю, а некоторые по правому, некоторые по середине, некоторые по правому и т. д., и я думаю, что код должен быть упомянут в начале, потому что мы сначала должны определите #leftSide, а потом поговорим об этом. но спасибо за участие! я не знал, как ввести! странно, что вам нужно ввести дважды, чтобы получить один разрыв строки!   -  person yukashima huksay    schedule 30.08.2015
comment
Вы также можете использовать теги br для создания разрывов строк в своих вопросах.   -  person Michael Benjamin    schedule 30.08.2015
comment
@Michael_B большое спасибо :)   -  person yukashima huksay    schedule 30.08.2015


Ответы (3)


Я хочу, чтобы a#gnbii выровнялось по левому краю панели навигации, а остальные ссылки по центру.

Но я хочу, чтобы моя страница была максимально совместима с изменением размера окна, поэтому я предпочитаю не использовать поля/отступы.

Также я хотел бы добиться этого без дополнительных элементов, если это возможно.

Благодаря сочетанию свойств CSS flexbox и positioning можно удовлетворить все требования.

Сначала добавьте идентификатор в родительский контейнер a#gnbii:

<li class="gnb" id="align-left"> /* NEW - ID added */
<a class="gnb" id="gnbii" href="home.html">
<img id="gnbii" src="../images/instagram icon/1.png" alt="aranpuzzle.ir" height="40px">
<img id="gnbii" src="../images/instagram icon/2.png" alt="aranpuzzle.ir" height="40px">
</a>
</li>

Вот CSS:

ul {
    display: flex;
    justify-content: center;
    align-items: center;
    position: relative;
}

#align-left {
    position: absolute;
    left: 2%;
}

ДЕМО: https://jsfiddle.net/6pmfc87h/3/

Вот что происходит...

  • ul становится flexbox с применением display: flex. Каждый li теперь выстроен в ряд, что является поведением по умолчанию для дочерних элементов flexbox (известных как «элементы flex»).

  • justify-content: center центрирует дочерние элементы вдоль главной оси. В данном случае горизонтально.

  • align-items: center центрирует дочерние элементы вдоль поперечной оси. В данном случае вертикально.

  • position: relative устанавливает ближайшего позиционированного предка для абсолютного позиционирования.

  • position: absolute перемещает последний li к левому краю его ближайшего предка.

Чтобы узнать больше о flexbox, воспользуйтесь хорошим справочником: Полное руководство по Flexbox.

Чтобы узнать больше об абсолютной позиции, проверьте это: MDN position


ОБНОВЛЕНИЕ (на основе комментариев; для небольших экранов)

я хочу, чтобы он скользил вправо как можно больше, а не перекрывался...

Итак, мы можем добавить white-space: nowrap к ul, чтобы элементы навигации всегда оставались в строке.

Затем объявите медиа-запрос, чтобы сместить все вправо на меньших экранах:

@media only screen and (max-width: 768px) { 
    ul { justify-content: flex-start; }  /* note: site is RTL */
    #align-left { position: static; }
}

ОБНОВЛЕННАЯ ДЕМО: https://jsfiddle.net/6pmfc87h/4/

... и когда больше нет места для скольжения вправо, я предпочитаю, чтобы проводник не позволял пользователю уменьшать ширину окна!

Вы уверены, что это то, что вы хотите сделать? Существуют некоторые методы JavaScript, которые устанавливают размер окна браузера, но я не уверен, что они полностью надежны во всех браузерах. Что еще более важно, я не думаю, что это соответствует передовой практике. На мой взгляд, пользователю должно быть разрешено изменять размер окна браузера настолько, насколько позволяет браузер. [Подробнее.]

Вам лучше сосредоточиться на тех областях, где у вас больше контроля как у веб-разработчика. Вы можете установить объявление min-width, сообщающее браузеру, что ваш элемент не может стать уже. Или вы можете использовать медиа-запросы, чтобы изменить вещи, чтобы они подходили для небольших экранов.

person Michael Benjamin    schedule 29.08.2015
comment
Вы изменили демонстрацию HTML и скрипки, пока я готовил свой ответ. Однако этот ответ по-прежнему относится к вашему пересмотренному вопросу и охватывает все ваши требования. Если у вас есть какие-либо вопросы, просто напишите комментарий. - person Michael Benjamin; 29.08.2015
comment
я извиняюсь за это редактирование, но я понял, что в нем слишком много не относящихся к делу деталей, поэтому я хотел, чтобы оно было кратким и общим :) - person yukashima huksay; 30.08.2015
comment
большое вам спасибо за подробный, хорошо объясненный, ответ! Ну, ваш ответ устраняет проблему с моим ответом, что части, которые должны были быть посередине, не были точно посередине, но проблема с этим - помехи элементы, поскольку ширина окна изменяется, а также это не устраняет проблему вертикального выравнивания, возможно, вы не заметили, что bc вашего заполнения, попробуйте добавить *{padding:0;margin:0;} в начало вашего css, надеюсь, вы заметите тогда :) - person yukashima huksay; 30.08.2015
comment
С редактированием проблем нет. Ваша редакция также вполне ясна. - person Michael Benjamin; 30.08.2015
comment
Как вы хотите, чтобы панель навигации отображалась на экране меньшего размера? - person Michael Benjamin; 30.08.2015
comment
Поскольку размер окна уменьшается, все элементы навигации могут оставаться в одной строке. Перекрытие можно предотвратить с помощью объявления min-width. Элементы также могут быть смещены к выравниванию по столбцам с помощью justify-content: column. Или что-то другое. Дайте мне знать, и я обновлю свой ответ. - person Michael Benjamin; 30.08.2015
comment
я хочу, чтобы он скользил вправо как можно больше, а не перекрывался, и когда больше нет места для скольжения вправо, я предпочитаю, чтобы тогда проводник не позволял пользователю изменять ширину окна меньше! если нет, я не неважно, что тогда произойдет! Я просто предупредю! Но на телефоне и т. Д. Я сделаю это с меньшими шрифтами и т. Д.! - person yukashima huksay; 30.08.2015
comment
Ну, я думаю, что у меня уже есть ответ! Я просто добавил немного отступов, и выравнивание исправлено, и поплавок скользит, как я хочу, а изображения в левой части не слишком толстые, поэтому они не имеют большого значения для центральное выравнивание текста:) большое спасибо за ваше время и советы:) я многому научился у вас:) счастливого программирования;):) - person yukashima huksay; 30.08.2015
comment
получу ли я репутацию, если никто не сможет ответить на мой вопрос в течение двух дней, и я отправлю и отвечу сам и проверю свой собственный ответ? - person yukashima huksay; 30.08.2015
comment
Кроме того, нет такой вещи, что никто не может ответить на мой вопрос в течение двух дней. Открытые вопросы (как и ваши) можно получить ответы в любое время. Я думаю, вы, возможно, имели в виду право на вознаграждение, что является чем-то другим. Мета. stackexchange.com/questions/107995/ - person Michael Benjamin; 30.08.2015
comment
И да, голосование и галочка приравниваются к 25 очкам повторения для отвечающего. Вы говорите, что дали их мне, но мне нравится думать, что я их заработал :-) - person Michael Benjamin; 30.08.2015
comment
я сказал, что вы не можете принять свой собственный ответ в течение двух дней :) большое спасибо :) и поэтому голосование за комментарий не имеет никакого эффекта?: D! рассмотрите возможность голосования за мой вопрос, кстати, если вы еще этого не сделали !: Д! - person yukashima huksay; 30.08.2015

Если вы хотите выровнять определенный элемент, просто создайте класс и добавьте его к этому элементу. Если вы хотите выровнять последний дочерний элемент или первый дочерний элемент, используйте селектор :first-child или :last-child в вашем css. Помните, что #leftSide — это идентификатор, do повлияет на один элемент, вместо этого используйте класс.

person dacastro4    schedule 29.08.2015
comment
Покажите мне свой код или вставьте его в jsfiddle, чтобы помочь вам. - person dacastro4; 29.08.2015
comment
Я слишком ленив для этого! Вместо этого я предпочитаю быть терпеливым:) Большое спасибо! - person yukashima huksay; 29.08.2015
comment
Вы пробовали nav li#leftSide { text-align:left; } - person dacastro4; 29.08.2015
comment
@aran, одна из целей Stack Overflow — создать хранилище вопросов и ответов, которые могут помочь людям в будущем. Публикация вашего кода делает ваш вопрос более ценным для более широкого сообщества (не говоря уже о том, что это, вероятно, привлечет к вашему вопросу больше внимания и более качественные ответы). - person Michael Benjamin; 29.08.2015
comment
@Michael_B Я знаю, но я знаю, но если sb может ответить на этот вопрос с кодом, они также могут обойтись без! и дело в том, что я программирую на своем ноутбуке, а здесь у меня есть только Интернет на моем телефоне, я вижу, что мне нужно сделать точку доступа !:D!bc никто не отвечает!(если я отредактирую сейчас, будет ли это продвигать вопрос или мне лучше удалить это и опубликовать новое? - person yukashima huksay; 29.08.2015
comment
Да, если вы отредактируете вопрос, он будет отправлен обратно в начало списка «Недавно активные». Не нужно удалять и начинать заново. - person Michael Benjamin; 29.08.2015
comment
@dacastro4: я сделал скрипку :) - person yukashima huksay; 29.08.2015

добавьте в свой css следующее:

#leftSide{
    float:left;
}

Но, если бы я был вами; Я бы добавил несколько пикселей левого поля для левого изображения, чтобы оно не было на краю.

К сожалению, мое решение немного портит ваше вертикальное выравнивание!

person yukashima huksay    schedule 29.08.2015