Страницы

Поиск по вопросам

четверг, 23 мая 2019 г.

Тормозит css-анимация

Суть вопроса в следующем. На сайте есть sidebar (выезжающее справа меню), анимация которого построена на css-transitions. В неактивном состоянии sidebar имеет следующий код:
position: fixed; top: 0; bottom: 0; right: 0; opacity: 0; width: 300px; background: #fff; z-index: 9999; -o-transition: all 250ms ease-in-out; transition: all 250ms ease-in-out; transform: translate(300px, 0px);
в активном состоянии к нему добавляется класс с таким кодом:
transform: translate(0px, 0px); opacity: 1;
Проблема в том, что периодически наблюдаются тормоза при открытии/закрытии меню. Профайлер Google Chrome толком не дает никакой информации по причине подвисаний. На кадр анимации уходит всего 1-3 ms, но FPS может упасть до 15-20 кадров. Тормоза вылазят периодически (в эти моменты тормозит вся анимация), из закономерностей заметил, что они часто появляются в периоды простоя (когда на сайте не совершается никаких действий 20-30 секунд).
Полагаю, возможная причина отчасти в самом железе/ПО (хотя оно шустрое), но хотелось бы устранить подвисания. Отсюда вопросы:
В чем причина подобных тормозов, кто сталкивался с этим? Какие решения Вы использовали, чтобы сделать анимацию более плавной?
P.S. "will-change: transform;" не сильно поможет, т.к. браузер и без него все выносит на отдельный слой.


Ответ

Добиться более плавной анимации помог комплекс следующих действий:
Точное указание property у transition (т.е. вместо "transition: all" указываем конкретное свойство с которым производится анимация). Использование при JS манипуляции с классами не classList, а className. Переход на это решение позволил добиться реального прогресса в плавности анимации. В частности, это решение подсказал VK, там используется такая же схема. Метод className входит в DOM Core (level 2), имеет практически полную совместимость со всеми браузерами, а также более эффективно обрабатывается браузерными движками с минимальными задержками.

sql вывести название категорий и посчитать количество товаров в данной категории

Проблема такова есть у меня список категорий, к категориям необходимо написать количество товаров отвечающие даным категориям.

В базе данных имеются 2 таблицы

+Product |_id |_name |_category_id |_article

+Category |_id |_category_id |_name

Посчитать количество товаров - просто.
SELECT category_id as category, count(*) AS cnt FROM product GROUP BY category_id
В результате мы получим таблицу вида:

category: 1 2 3 4 5 ... в общем номера категорий cnt: ... количества товаров в категориях
Как мне сделать пересчет товаров и сопоставить колонку "category_id" таблицы product с колонкой "name" таблицы Category(названия категорий) в одном запроса?
Пробовал так:
SELECT category_id as category, count(*) AS cnt FROM product INNER JOIN category on product.category_id = category.category_id GROUP BY category_id
Пробовал так:
SELECT fid AS category, COUNT(*) AS cnt, cname FROM (SELECT product.category_id AS fid, category.name AS cname, category.id AS cid FROM category LEFT JOIN category on product.category_id = category.category_id) newtable GROUP BY cid, cname
В общем с SQL я не силен, буду рад любой помощи.

Ответ
SELECT category.name as category, count(*) AS cnt FROM product INNER JOIN category on product.category_id = category.category_id GROUP BY category.category_id


Ответ

Вот так должно все нормально работать:
SELECT c.name AS category, count(*) AS cnt FROM product AS p INNER JOIN category c ON p.category_id = c.category_id GROUP BY p.category_id
Мой результат:
"Category 01" => 2 "Category 02" => 3 "Category 03" => 4

Угол под 45 градусов у div

Друзья, может кто-то сталкивался с подобной задачей... Необходимо у div срезать углы (верхний-левый и нижний правый), под углом 45 градусов.
реализовал через clip-path
.corner45top { -webkit-clip-path: polygon(5% -200%, 100% 0%, 100% 100%, 0% 100%, 0% 100%, 0% 100%); clip-path: polygon(5% -200%, 100% 0%, 100% 100%, 0% 100%, 0% 100%, 0% 100%); clip-path: url("#swipe__clip-path"); background-color: #FFFFFF; box-shadow: 0 1px 6px 0 rgba(86,86,86,0.25); }
.corner45bottom { -webkit-clip-path: polygon(0 -100%, 100% 0%, 98% 100%, 0% 100%, 0% 100%, 0% 100%); clip-path: polygon(0 -100%, 100% 0%, 98% 100%, 0% 100%, 0% 100%, 0% 100%); clip-path: url("#swipe__clip-path-bottom"); background-color: #FFFFFF; box-shadow: 0 1px 0 0 rgba(86,86,86,0.25); }

Но все эти "красивости" никак не работают в браузере EDGE, есть ли какой-то простой вариант вылечить это? Мог бы сделать углы например картинкой, но за блоками есть background-image цветной(


Ответ

Для этого нам на помощь приходит SVG , подходит такой вариант ?

Применение CSS-свойств к элеметам внутри определенного div

На странице есть список внутри div, выглядящий примерно так:

  1. ...

Мне необходимо кастомизировать такой список, если он содержится в таком div, примерно таким способом:
ol { ... } ol li { ... } ol li:before { ... }
Как правильно описать это в файле стилей?


Ответ

Используйте в селекторе класс .wiki-content. Выглядеть это будет так:
.wiki-content ol { // Ваши стили }
.wiki-content li { // Ваши стили }
.wiki-content li:before { // Ваши стили }
Если у вас используется препроцессор, к примеру Less, можно сделать еще проще:
.wiki-content {
ol { // Ваши стили }
li { // Ваши стили &:before { // Ваши стили } } }

Реализация прироста ресурсов в реал-тайме в браузерной (мобильной) ММО стратегии

Как реализуют игровую механику в браузерных или мобильных ММО стратегий, на подобии марш империй, vikings, ikariam и.т.д, а точнее как им удается осуществлять прирост ресурсов в реал-тайме? Сервер запускается и обрабатывает каждую учетную запись прибавляя рассчитанное количество ресурсов в цикле каждую секунду?


Ответ

Могу предположить, что данные о приросте в секунду у каждого пользователя для каждого ресурса хранятся на их серверах.
Сервера мониторят последние таймстэмпы пользователей (от последнего совершенного действия, связанного с ресурсами, например, их трата, или заход\выход из приложения). Рассчитывается все по формуле (currentTimestamp - lastTimestamp) * RPS (Resources Per Second), а затем все это записывается в БД
А если пользователь находится в сессии постоянно, то этот прирост ресурсов просто "рисуется".
И когда юзер начинает с ними какое-то действие (Например, купил что-то и они потратились), сервер добавляет к прошлому значению ресурсов новые (по вышеупомянутой формуле) и уже изменяет значение ресурсов (Вычитает, или добавляет) и сохраняет в БД. Соот-но lastTimestamp присваивается currentTimestamp и так до следующего действия

Утечка памяти в TObjectList

Не могу найти решение для устранении утечки.

type TMyObj = class Caption: string; Description: string; Params:string; ParamsLst: TStringList;
public constructor Create(const aPath: string; const aParams: TStrings); overload; destructor Destroy(); override; end;
TDataList = class(TObjectList) public constructor Create; // function LoadFromINI(IniFile: TMemIniFile): boolean; function Remove(Obj: TMyObj): Integer; end;
var TObjData: TDataList;
implementation
constructor TMyObj.Create(const aPath: string; const aParams: TStrings); begin Caption := aParams.Values['Caption']; Description := aParams.Values['Description']; Params := aParams.Values['Params']; if aParams.Values['Params'] <> '' then begin ParamsLst := TStringList.Create; try ExtractStrings([';', ','], [' '], PChar(Params), ParamsLst); except ParamsLst := nil; end; end; end;
destructor TMyObj.Destroy; begin ParamsLst.Free; inherited; end;
constructor TDataList.Create; begin inherited Create; OwnsObjects := True; end;
function TDataList.Remove(Obj: TMyObj): Integer; begin Result := inherited Remove(Obj); end;
initialization TObjData := TDataList.Create;
finalization TObjData.Free;
заполнение TObjData, так
TObjData.Add(TMyObj.Create(sVal, SecParams));


Ответ

Код с учетом замечаний и предложений......
type TData = class private FCaption: string; FDescription: string; FParams: string; FParamsLst: TStringList; //.... public constructor Create(const aPath: string; const aParams: TStrings); destructor Destroy(); override; property Caption: string read FCaption; property Description: string read FDescription; property Params: string read FParams; property ParamsLst: TStringList read FParamsLst; //... end;
TDataList = class(TObjectList) private //... public constructor Create; destructor Destroy(); override; property //... end;
var DataList: TDataList;
implementation
{ TData } constructor TData.Create(const sPath: string; const sData: TStrings); begin Caption := aParams.Values['..']; Description := aParams.Values['..']; Params := aParams.Values['..']; if aParams.Values['..'] <> '' then begin ParamsLst := TStringList.Create; try ExtractStrings([','], [' '], PChar(Params), ParamsLst); except on E: Exception do ShowMessage(E.ClassName + ': ' + E.Message); end; end; end;
destructor TData.Destroy; begin inherited; end; { end TData }
{ DataList } constructor TDataList.Create; begin inherited Create; OwnsObjects := True; end;
destructor TDataList.Destroy; begin inherited; end; { end DataList }
Решение, проблемы ......
procedure TMain.FormDestroy(Sender: TObject); var I: Integer; begin // Удаление списков в объекте for i := 0 to DataList.Count - 1 do begin with DataList.Items[i] do begin ParamsLst.Free; end; end; // При удалении списка оставшиеся в нём объекты будут удалены. FreeAndNil(DataList); end;

Несколько результатов из БД, с учётом сортировки

Имеется таблица book в которой около 50 записей. Поля таблицы id(int),name(varchar),path(text),lang(int, value = 1,2,3). lang=1 примерно 18 записей lang=2 примерно 16 записей lang=3 примерно 16 записей Необходимо составить sql запрос, чтобы выбрать 3 книги, первая из которых это случайное число из первых 18 записей, второе это тоже случайное число из вторых 16 записей, и третья соответственно тоже случайное число из последних 16 записей
Что то на подобие такого: SELECT * FROM book WHERE lang=1 ORDER BY RAND () LIMIT 1 AND WHERE lang=2 ORDER BY RAND () LIMIT 1 AND WHERE lang=3 ORDER BY RAND () LIMIT 1;


Ответ

Для ваших объемов данных подойдет очень простой запрос:
SELECT random_book.* FROM book LEFT JOIN (SELECT * FROM book ORDER BY RAND()) random_book ON (book.lang = random_book.lang) GROUP BY random_book.lang
ORDER BY RAND() - это не быстро на больших обьемах данных.