Существует множество решений, таких как font-size:0
, word-spacing
, margin-left
, letter-spacing
и т. д.
Обычно я предпочитаю использовать letter-spacing
, потому что
-1em
). word-spacing
и margin-left
это будет нехорошо, когда мы устанавливаем большее значение, например -1em
. font-size
неудобно, когда мы пытаемся использовать em
как font-size
. So , letter-spacing
кажется лучшим выбором.
Однако, я должен предупредить вас
, когда вы используете letter-spacing
, вам лучше использовать -0.3em
или -0.31em
not другие.
* {
margin: 0;
padding: 0;
}
a {
text-decoration: none;
color: inherit;
cursor: auto;
}
.nav {
width: 260px;
height: 100px;
background-color: pink;
color: white;
font-size: 20px;
letter-spacing: -1em;
}
.nav__text {
width: 90px;
height: 40px;
box-sizing: border-box;
border: 1px solid black;
line-height: 40px;
background-color: yellowgreen;
text-align: center;
display: inline-block;
letter-spacing: normal;
}
Если вы используете Chrome (тестовая версия 66.0.3359.139) или Opera (тестовая версия 53.0.2907.99) , вы можете увидеть:
Если вы используете Firefox (60.0.2), IE10 или Edge, то, что вы видите, может быть:
Это интересно. Итак, я проверил mdn-letter-spacing и нашел это:
length
Задает дополнительное межсимвольное пространство в дополнение к умолчанию пространство между символами. Значения могут быть отрицательными, но могут быть ограничения, связанные с реализацией. Пользовательские агенты не могут больше увеличивать или уменьшать межсимвольное пространство, чтобы оправдать текст.
blockquote>Похоже, что это и есть причина.
Причина, по которой вышеприведенный оператор не работает, был предоставлен другими пользователями и фактически не ответил на мой истинный вопрос.
После игры еще немного, я понял, что вы можете использовать этот оператор для выполните вышеуказанный оператор, но это приведет к некорректному коду.
Если бы я должен был изменить указанный выше оператор:
int a = 5;
int b = 10;
int result = a == b ? doThis() : doThat();
private int doThis()
{
MessageBox.Show("Did this");
return 0;
}
private int doThat()
{
MessageBox.Show("Did that");
return 1;
}
Этот код скомпилирует и выполнит так, как он должен , Однако, если эти методы изначально не предназначались для возврата чего-либо и ссылались на другие области кода, теперь вы должны обрабатывать возвращаемый объект каждый раз, чтобы вызвать эти методы.
В противном случае вы можете использовать trernary operator для однострочного метода выбора и даже знать, какой метод он вызвал в следующей строке, используя результат.
int result = a == b ? doThis() : doThat();
if (result == 0)
MessageBox.Show("You called doThis()!");
Теперь этот код абсолютно бессмыслен и может быть легко выполнен с помощью If If Else , но я просто хотел знать, можно ли это сделать, и что вам нужно сделать, чтобы заставить его работать.
Теперь, когда я знаю, что вы можете эффективно возвращать любой тип в этих методах, это может стать немного более полезно. Это может считаться «плохой кодирующей практикой», но может стать очень полезным в ситуациях, в которых он никогда не был МОЛОДЕЖИ.
Вы могли бы получить доступ к одному объекту или другому на основе любого условия, и это может быть очень полезно в одна строка кода.
UserPrivileges result = user.Group == Group.Admin ? GiveAdminPrivileges() : GiveUserPrivileges();
private UserPrivileges GiveAdminPrivileges()
{
//Enter code here
return var;
}
private UserPrivileges GiveUserPrivileges()
{
//Enter code here
return var;
}
Конечно, это можно сделать с помощью инструкции If, но я думаю, что использование Тернарного оператора для других целей делает программирование забавным. Теперь это может быть не так эффективно, как оператор If Else, и в этом случае я бы никогда не использовал это.
.NET не (легко) поддерживает (читаемую версию) это по какой-то причине. Это очень жуткий и делает ваш код трудным для чтения. Логические деревья должны быть относительно легко перемещаться. Если бы я должен был зайти на работу и весь код, который они использовали тройной для назначения значений, методов вызова и т. Д. Я думаю, что я просто уйду.
Тернарный оператор должен что-то вернуть. Типичное использование выглядит так:
int x = (a > b) ? a : b;
Если вы попробуете что-то вроде
a + b;
, компилятор будет жаловаться.
(a > b) ? a - b : b - a;
в основном ярлык для «a-b» или «b-a», которые сами по себе не являются законными.
тернарный оператор используется для возврата значений, и эти значения должны быть назначены. Предполагая, что методы doThis()
и doThat()
возвращают значения, простое задание исправит вашу проблему.
Если вы хотите делать то, что вы пытаетесь, это возможно, но решение не очень .
int a = 5;
int b = 10;
(a == b ? (Action)doThis : doThat)();
Это возвращает делегат действия, который затем вызывается в скобках. Это не типичный способ достижения этого.
Вы должны иметь возможность сделать это, хотя:
int a = 5;
int b = 10;
var func = a == b ? (Action)doThis : (Action)doThat; // decide which method
func(); // call it
Не то, что это действительно полезно
Условный оператор является выражением, которое возвращает значение. Вы не можете использовать его с функциями, возвращающими void
.
Вместо этого вы должны использовать обычный if
.