Вот CSS-версия анимации.
Я использую визуально скрытый флажок, кнопка - label
, которая управляет флажком, и анимации CSS переключаются в состоянии проверки.
Единственное, что он выполняет начальную анимацию в обратном порядке при загрузке.
Редактировать: Я на самом деле исправил это с небольшим изменением CSS (:not(indeterminate)
) и дополнительным фрагментом JS при загрузке, который устанавливает флажок indeterminate
.
const checkbox = document.getElementById('sign-in-state');
checkbox.indeterminate = true;
@keyframes login {
0% {
left: 0;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 60%;
width: 40%;
}
}
@keyframes logout {
0% {
left: 60%;
width: 40%;
}
50% {
width: 60%;
}
100% {
left: 0%;
width: 40%;
}
}
.sign-in-checkbox:not(:indeterminate):not(:checked) + .box .square {
--animation-name: login;
}
.sign-in-checkbox:not(:indeterminate):checked + .box .square {
--animation-name: logout forwards;
}
.window {
position: absolute;
width: 100%;
height: 100%;
background: #c73030;
z-index: 9999;
}
.box {
position: absolute;
top: 50%;
left: 50%;
overflow: hidden;
transform: translate(-50%, -50%);
width: 100vw;
height: 100vh;
background-color: #f7986c;
z-index: -999;
}
.square {
animation: var(--animation-name) 600ms reverse ease-in-out;
position: absolute;
right: auto;
top: 0;
width: 40%;
height: 100%;
background-color: cornflowerblue;
}
.btn {
display: flex;
align-items: center;
justify-content: center;
color: white;
font-family: sans-serif;
position: absolute;
width: 200px;
height: 70px;
top: 80%;
left: 50%;
transform: translate(-50%, -50%);
background: #444;
}
.visually-hidden { /* https://snook.ca/archives/html_and_css/hiding-content-for-accessibility */
position: absolute !important;
height: 1px; width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
}
<input type="checkbox" id="sign-in-state" class="visually-hidden sign-in-checkbox">
<div class="box">
<div class="square">
<label class="btn" for="sign-in-state">
<div class="sI">Sign In</div>
</label>
</div>
</div>
Вы можете попробовать:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(
sqlite3_column_text(this->stmts.read_documents, 0)
));
Хотя std :: string
может иметь конструктор, который принимает const unsigned char *
, по-видимому, это не так.
Почему бы и нет? Вы могли бы взглянуть на этот несколько связанный вопрос: Почему потоки C ++ используют char вместо unsigned char?
Причина, по которой люди обычно используют тип (unsigned char *), заключается в том, чтобы указать, что данные являются двоичными, а не простым текстом ASCII. Я знаю, что libxml делает это, и, судя по всему, sqlite делает то же самое.
Данные, которые вы получаете от вызова sqlite, вероятно, представляют собой кодированный в кодировке UTF-8 текст Unicode. Хотя может показаться, что reinterpret_cast работает, если кто-то когда-либо сохранит текст в поле, которое не является простым ASCII, ваша программа, вероятно, не будет вести себя хорошо.
Класс std :: string не разработан с учетом Unicode , поэтому, если вы спросите длину () строки, вы получите количество байтов, которое в UTF-8 не обязательно совпадает с количеством символов.
Краткий ответ: простой приведение может сработать, если вы уверены, что данные являются просто ASCII. Если это могут быть какие-либо данные UTF-8,
Я не знаком с sqlite3_column_text, но одну вещь, которую вы можете захотеть сделать, - это когда вы вызываете конструктор std: string, который вы хотите привести к (const char *). Я считаю, что он должен иметь конструктор для этого типа.
Однако, странно, что эта функция sqlite возвращает беззнаковый символ *, она возвращает строку Паскаля (первый символ - длина строки)? Если это так, то вам нужно будет создать std :: string с байтами и длиной.
try:
temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
, если temp_doc.uuid является std :: string try:
temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
Невозможно создать std :: string
из c первого неподписанного символа *
- сначала нужно привести его к const char *
:
temp_doc.uuid = std::string( reinterpret_cast< const char* >(
sqlite3_column_text(this->stmts.read_documents, 0) ) );
On the off-chance you actually want a string of unsigned characters, you could create your own type:
typedef std::basic_string <unsigned char> ustring;
You should then be able to say things like:
ustring s = sqlite3_column_text(this->stmts.read_documents, 0);